API позволяет CRM-системе агентства создавать подборки, добавлять в них туры, получать заявки туристов и узнавать, что клиент открыл подборку. Все запросы и ответы — в формате JSON (UTF-8).
Ключ создаётся в кабинете агентства: Интеграции → Создать ключ (доступно владельцу и администратору). Передавайте его в заголовке каждого запроса:
Также принимается заголовок X-API-Key. Ключ даёт доступ ко всем данным агентства — храните его на сервере интеграции и не публикуйте.
Списки возвращаются как {"items": [...], "total": 120, "limit": 50, "offset": 0}, параметры limit (до 100) и offset. Ошибка — HTTP-код и {"error": "код", "message": "описание"}: 400 — неверные данные, 401 — нет или неверный ключ, 402 — подписка агентства закончилась (чтение доступно), 403 — нет доступа, 404 — не найдено.
| GET /me | Агентство, тариф и ключ — для проверки подключения |
| GET /managers | Сотрудники агентства |
| GET /selections | Подборки. Фильтры: status (draft, sent, archived), client_id, manager_id, since (изменённые после даты, ISO 8601), q (поиск по названию) |
| POST /selections | Создать подборку: title, intro, template (cards, glass, list, magazine), client {name, phone, email} или client_id, manager_email или manager_id. Клиент ищется по телефону и email, если не найден — создаётся |
| GET /selections/{id} | Подборка со всеми вариантами, фото и ссылкой для клиента (url) |
| PATCH /selections/{id} | Изменить title, intro, status, template, клиента или менеджера |
| POST /selections/{id}/items | Добавить вариант: {"item": {...}, "images": ["https://…jpg"]} — до 10 фото, сервер скачает их сам |
| PATCH /items/{id} | Изменить вариант (любые поля из списка ниже) |
| DELETE /items/{id} | Удалить вариант |
| GET /leads | Заявки туристов. Фильтры: status (new, in_work, done, rejected), selection_id, since |
| PATCH /leads/{id} | Сменить статус заявки: {"status": "in_work"} |
| GET /clients | Клиенты, поиск q по имени, телефону, email |
| POST /clients | Создать клиента: name, phone, email, notes (если такой телефон или email уже есть — вернётся существующий) |
| GET /clients/{id} | Клиент и его подборки |
title*, kind (tour, hotel, cruise, flight, excursion, other), stars, country, region, date_from, date_to (YYYY-MM-DD), nights, nights_transit, meal, room, guests, departure, operator, price, old_price, currency (RUB, USD, EUR, KZT, BYN), price_note, flight_info, description, comment, hotel_url, source_url, recommended, tags (["hot", "deal", "rec", "value"] или свои теги агентства)
В ответе на создание подборки поле selection.url — ссылка, которую CRM может отправить клиенту.
В кабинете (Интеграции) укажите адрес, и OfferUno будет отправлять на него POST-запрос при событиях:
| lead.created | Новая заявка туриста |
| selection.opened | Турист впервые открыл подборку |
| payment.succeeded | Турист оплатил тур картой |
Тело запроса:
Заголовки: X-OfferUno-Event, X-OfferUno-Delivery и X-OfferUno-Signature: sha256=… — HMAC-SHA256 тела запроса ключом подписи из кабинета. Ответьте кодом 2xx в течение 10 секунд. Если сервер недоступен или ответил ошибкой, запрос повторится через 1, 5, 30 минут, 2 и 6 часов (с тем же delivery_id — используйте его, чтобы не создать дубль).
Проверка подписи (Python):
PHP: