Car2B

Для разработчиков

Документация API Car2B

Публичные API для компаний с собственной автоматизацией: 1С, CRM, учётные системы. Доступ ко всем API устроен одинаково — ключ в личном кабинете, обмен на короткоживущий токен, вебхуки с подписью.

Содержание

Доступные API

APIДля чегоДокументы
Импорт объявлений Ваша система сама создаёт, обновляет и снимает объявления, загружает фото и получает статусы модерации. Описание, спецификация
Удалённый ОП Организатор программы ведёт программу, заявки агентов, брони и сделки; агент берёт сток, бронирует и фиксирует покупки. Описание, спецификация

Ключи и доступ

Ключ доступа выпускает организация в личном кабинете: Профиль → Интеграции → «Создать ключ». Раздел доступен владельцу и администраторам верифицированной компании. При создании задаются название, назначение ключа и, при желании, список разрешённых IP-адресов.

  • После создания вы увидите client_id и секрет. Секрет показывается один раз — сохраните его в настройках вашей системы. Дальше в кабинете виден только префикс ключа.
  • «Перевыпустить» создаёт новый секрет; старый действует ещё 24 часа, чтобы обновить настройки без простоя.
  • «Отозвать» останавливает ключ: новые токены не выдаются, уже выданный перестаёт приниматься не позже чем через 30 секунд.
  • Адрес вебхука и секрет подписи задаются в карточке ключа (см. ниже).

Назначение ключа и скоупы

Один ключ — одно назначение. Назначение выбирается при создании и определяет, какие скоупы получит токен и какое API доступно ключу. Чтобы работать и организатором, и агентом, выпустите отдельные ключи.

НазначениеСкоупыAPI
Импорт объявлений import:listings.write import:listings.read Import API
Удалённый ОП — организатор программы remote-sales:owner.read remote-sales:owner.write Remote Sales API, префикс /owner
Удалённый ОП — агент remote-sales:agent.read remote-sales:agent.write Remote Sales API, префикс /agent

Скоуп write не включает read: для сценария «прочитать и изменить» нужны оба; ключ создаётся сразу с парой скоупов своего назначения.

Действия по ключу «Удалённого ОП» совершаются от имени владельца ключа и подчиняются тем же правилам, что в кабинете: у него должен быть доступ к разделу «Удалённый ОП», организация — верифицирована, а при включённой платной модели — подписка активна. Иначе API ответит 403 permission_missing, 403 organization_unverified или 403 subscription_required (см. таблицу ошибок в описании API).

Обмен на токен

Стандартный OAuth 2.0 client_credentials. Секрет передаётся только в этом запросе, в заголовке HTTP Basic (base64 от строки client_id:секрет). Все остальные вызовы идут с полученным Bearer-токеном.

curl -X POST https://car2b.ru/api/v1/identity/oauth/token \
  -u "c2b_7Q4KJX2P9LMN3RTV8WQZ5M2:cs_live_4nR8vK2pQ7xL9mW3tY6bH1jF5dS0aG2c" \
  -d "grant_type=client_credentials"
{
  "access_token": "eyJhbGciOiJIUzI1NiJ9…",
  "token_type": "Bearer",
  "expires_in": 300,
  "scope": "remote-sales:agent.read remote-sales:agent.write"
}
  • Токен живёт 300 секунд. Кэшируйте его и обновляйте за минуту до истечения.
  • На 401 token_expired обновите токен и повторите запрос один раз.
  • refresh_token не выдаётся: у системы есть секрет, она просто обменивает его снова.
  • Ошибки обмена: 401 invalid_client (неизвестный ключ, отозван или неверный секрет), 403 organization_not_verified, 429 при более чем 10 обменах в минуту.

Разрешённые IP

В карточке ключа можно задать до 20 адресов или подсетей (CIDR). Тогда обмен ключа на токен и каждый вызов API с другого адреса отклоняются: 401 invalid_client на обмене, 403 ip_not_allowed на запросе. Пустой список — вызовы принимаются откуда угодно.

Вебхуки и подпись

Вместо опроса API Car2B может сам сообщать о событиях. Адрес (только https и публичный домен) и секрет подписи задаются в карточке ключа; секрет показывается один раз, перевыпуск делает старую подпись недействительной. Ключ получает события тех ролей, чьи скоупы у него есть; события адресуются организации-участнику.

ЗаголовокЧто в нём
X-Car2B-Signaturesha256= + hex(HMAC-SHA256(секрет, сырое тело запроса))
X-Car2B-Deliveryидентификатор доставки; повторы одного события приходят с тем же значением — используйте для дедупликации
X-Car2B-Eventтип события, дублирует type в теле

Тело — { "id", "type", "occurred_at", "data" }. Ответьте любым 2xx в течение 10 секунд — обрабатывать событие можно после ответа. Иначе доставка повторяется до 5 раз с интервалами 1, 5, 15, 60 и 300 секунд. Возможны повторные доставки — обработчик должен быть идемпотентным по id.

Проверка подписи — всегда по сырому телу, до разбора JSON, сравнение за постоянное время:

import hmac, hashlib

def verify(secret: str, raw_body: bytes, signature_header: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature_header)

# raw_body — тело запроса как пришло, до разбора JSON
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, rawBody, signatureHeader) {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  return expected.length === signatureHeader.length
    && timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));
}

Журнал доставок виден в карточке ключа и доступен по API: GET /import/webhooks/deliveries у Import API, GET /remote-sales/webhooks/deliveries у Remote Sales API.

Лимиты ключей

ЧтоЗначение
Активных ключей на организацию для каждого назначения5
Запросов в секунду на ключ10, всплеск до 50
Обменов ключа на токен в минуту10
Срок жизни токена300 секунд
Разрешённых IP-адресов или подсетей на ключ20

Лимит в 5 активных ключей действует отдельно на каждое назначение: пять ключей для импорта, пять для организатора и пять для агента — всего до 15 активных ключей на организацию. Ключ принадлежит компании, а не сотруднику. Остальные лимиты каждого API — в его описании.

Вопросы по интеграции: контакты Car2B.