Каталог публичных API. Один X-API-Key, единые конвенции
(page/page_size, error envelope, snake_case) — выучил один сервис, остальные предсказуемы.
Все API — на стиль-гайде. Авторизация: заголовок X-API-Key: <key>.
Версия в URL: /v1/.... Health-чек: GET /health без ключа.
Ошибки: { "error": "…", "code": "…", "request_id": "…" } + заголовок X-Request-Id.
Каталог авто, NLP-поиск, словари. Продуктовый фасад Auto/Sale.
MCP Streamable HTTP — транспорт для AI-агента. Тот же каталог Auto/Sale, но через Model Context Protocol.
Дилерский кабинет: профиль компании, инвентарь, фильтры, наценки, контакты.
Страны, города мира, autocomplete, гео-координаты, расстояния.
GeoNames cities1000 + русские падежи стран. Канон —
/v1/countries/*, /v1/cities/{nearest,top,search,<id>,by_ids,resolve},
/v1/distance. Алиасы /v1/geo/cities/* — для
легаси-консьюмеров `api.gumy.space` (см. P2 2026-05-16).
Доставка и расчёт растаможки авто. POST /v1/price — стоимость, POST /v1/route — маршрут.
Справочник модификаций авто (drom). POST /v1/match — подобрать mod_id по brand/model/specs. GET /v1/modifications/{mod_id} — полная карточка.
Карта подержанных авто. Встраивается на сайт через <iframe>. Управление URL-параметрами: theme, lang, chrome, accent, mode=browse|delivery.
Каждый сервис автономен (см. ADR-0021), но данные стыкуются по предсказуемым ключам. Главная связка:
api.gumy.space → модификация modification.gumy.space
GET /v1/cars и GET /v1/cars/{id} возвращают modification_id в Car-карточке
(nullable — ~10% объявлений ещё не сматчены). По нему — прямой deep-link:
GET https://modification.gumy.space/v1/modifications/{modification_id}
Фильтрация по модификации:
GET https://api.gumy.space/v1/cars?modification_id=79221
GET https://api.gumy.space/v1/cars?modification_ids=79221,67234,29196
Когда у listing'а modification_id = null (свежий ingest, низкий score, нет аналога в drom) —
можно вытащить вручную:
POST https://modification.gumy.space/v1/match
{
"brand": "Toyota", "model": "Camry", "year": 2018,
"engine_volume_cc": 2487, "power_hp": 181,
"body_type": "Седан", "fuel_type": "Бензин",
"transmission": "Автомат", "drive_type": "Передний"
}
→ { "match": { "modification_id": 125944, "score": 0.99, ... }, "candidates": [...] }
Имя modification_id одинаковое везде — в Car, в фильтре, в match-ответе, в path URL.
См. ADR-0028.
API-ключи выдаёт администратор платформы. Напиши на api@gumy.space с описанием use-case (какой канал/интеграция, ожидаемый объём, продакшн или тест).
/v1/.... Breaking change → /v2/..., старая версия живёт ≥6 месяцев.?page=1&page_size=20. Ответ — envelope { results, page, page_size, total, has_more }.?sort=<field>&order=ASC|DESC.Z (например 2026-05-16T12:34:56Z).snake_case, единицы измерения в имени поля (price_rub, mileage_km).X-RateLimit-*. При превышении — 429 + Retry-After.request_id из тела ответа — найдём по логам.