REST-интерфейс для агрегаторов, автовокзалов и агентств: поиск рейсов и остановок,
актуальные тарифы, свободные места и схема салона, информация для пассажира по рейсу
(граница, документы, провоз животных, важные сообщения), бронирование, подтверждение оплаты,
редактирование пассажиров и возврат билетов — включая стыковочные рейсы.
Полный цикл продажи — семь вызовов. Ниже показан минимальный маршрут от справочника остановок
до подтверждённого заказа.
1apigetstationsполучить список остановок и их id
2apigetroutesfromкуда можно уехать с выбранной остановки
3apisearchrouteрейсы на дату: время, цены, свободные места, информация для пассажира routeInfo
4apifreeplacenumberактуальные места перед выбором
5apibookбронь, статус PENDING
6apiconfirmподтверждение оплаты в течение 15 минут
7apicancelorderвозврат билета при необходимости
bash — минимальный сценарий
# 1. справочник остановок
curl "https://sks-auto.ru/apigetstations/?userid=$UID&userkey=$KEY"# 2. куда есть рейсы из остановки 415 (СПб, АВ Обводный)
curl "https://sks-auto.ru/apigetroutesfrom/?userid=$UID&userkey=$KEY&stationid=415"# 3. поиск рейсов на дату
curl "https://sks-auto.ru/apisearchroute/?userid=$UID&userkey=$KEY\
&from-id=415&to-id=401&date=2026-08-20"# 4. свободные места конкретного рейса
curl "https://sks-auto.ru/apifreeplacenumber/?userid=$UID&userkey=$KEY\
&route-id=54713&from-id=415&to-id=401&date=2026-08-20"# 5. бронирование (пассажиры — телом запроса в JSON)
curl -X POST "https://sks-auto.ru/apibook/?userid=$UID&userkey=$KEY\
&route-id=54713&from-id=415&to-id=401&date=2026-08-20" \
-H "Content-Type: application/json" \
-d '{"Passengers":[{"firstName":"Иван","middleName":"Иванович","lastName":"Иванов",
"birthDate":"1985-04-12","group":1,"gender":"M","citizenship":1,
"documenttype":0,"document":"4008 644762","mobile":"79110000000",
"seatnumber":12,"bag_qty":0}]}'# 6. подтверждение оплаты — не позже 15 минут после apibook
curl "https://sks-auto.ru/apiconfirm/?userid=$UID&userkey=$KEY&order-id=10749119"
Три вещи, на которых чаще всего спотыкаются при интеграции
1. Слэш в конце обязателен: /apisearchroute/?…, а не /apisearchroute?…
— иначе будет редирект 301.
2. HTTP-код всегда 200, ошибка приходит телом ответа — проверяйте наличие поля message.
3. Бронь живёт 15 минут: без apiconfirm место освобождается автоматически.
GET и POST равнозначны: параметры читаются из query-строки
и из тела формы. Для apibook и apieditpass массив Passengers
можно передать телом в формате JSON (Content-Type: application/json).
Формат ответа
JSON. Кириллица в части методов приходит \u-экранированной,
заголовок Content-Type у отдельных методов — text/html; парсите тело как JSON независимо от заголовка.
HTTP-статус
Всегда 200 (кроме apiinsstatus). Признак ошибки — поле
message в теле ответа.
Кодировка
UTF-8
Авторизация
Авторизация выполняется в каждом запросе двумя параметрами. Отдельного метода логина и токенов нет.
Параметр
Тип
Описание
useridобяз.
int
Числовой идентификатор учётной записи партнёра
userkeyобяз.
string
Ключ доступа формата xxxxxxxx-xxxx-xxxx (18 символов)
Учётная запись должна быть активна
Если пара userid/userkey не найдена или доступ отключён, любой метод вернёт
{"code":"00","message":"Не найден активный ключ пользователя"}. Смена ключа на нашей стороне
отключает партнёра мгновенно — ключ хранится в конфигурации, а не в коде.
Формат ошибки
JSON
{
"code": "00",
"message": "В указанную дату автобус по заданному маршруту не ходит"
}
У методов поиска, тарифов, мест и бронирования code практически всегда равен "00"
— причину отказа различайте по тексту message. Числовые коды (01…33)
используют только методы отмены — см. раздел Ошибки.
Форматы значений
Поле
Формат
Пример
date
ГГГГ-ММ-ДД (точки автоматически заменяются на дефис)
2026-08-20
birthDate
ГГГГ-ММ-ДД
1985-04-12
departure, arrival
ЧЧ:ММ:СС — только время, в часовом поясе соответствующей остановки
22:30:00
duration
ЧЧ:ММ — время в пути, часы могут превышать 24
03:55
expire
ГГГГ-ММ-ДД ЧЧ:ММ:СС
2026-08-05 14:12:33
Цены
число, рубли; тарифы округляются до десятков
1530
group
1 — взрослый, 2 — детский
1
gender
M / F (требование АЦБПДП)
M
citizenship, documenttype
числовые коды справочников АЦБПДП
1, 0
Окно продажи после отправления
Рейс остаётся доступен не только до отправления, но и некоторое время после него —
чтобы можно было дооформить пассажира, уже севшего в автобус. Значения по умолчанию:
Поиск рейсов — ещё 60 мин после отправленияМеста и схема салона — ещё 120 минБронирование — ещё 60 минЗа пределами окна — «Выберите более позднюю дату»
Окно поиска и окно бронирования могут не совпадать
Для учётной записи можно индивидуально увеличить окно поиска и выдачи мест, но
apibook и apigetprice всегда используют фиксированные 60 минут.
Если для вас настроено расширенное окно, поиск может показать рейс, который
apibook уже откажется бронировать.
Информация для пассажира по рейсу
У каждого рейса в apisearchroute, apisearchroute2 и
apicarriertrips есть поле routeInfo —
условия поездки, которые пассажир должен знать до покупки: важные сообщения (например, усиленный досмотр
на границе), правила пересечения границы, нужные документы, правила провоза животных. Это та же информация,
что пассажир видит на sks-auto.ru в выдаче, при оформлении, в билете и в письме с билетом.
Уже подобрано под отрезок и дату. Правила въезда приходят только на отрезках, пересекающих
границу (СПб → Таллин — да, СПб → Ивангород на том же рейсе — нет); временные сообщения — только на даты
их действия. Правило перевозчика, заменённое правилом маршрута, не приходит.
Как показывать.title + text — в выдаче рядом с рейсом;
textFull (HTML) — на странице оформления и в билете; textPlain — в SMS, мессенджерах,
чат-боте. Пустой массив — показывать нечего.
Актуальность. Тексты меняются без предупреждения (правила границы, сроки сообщений) — берите их из
того же ответа, что и цены, и не кэшируйте дольше выдачи.
Пример
С 30.09.2026 на рейсах из России в Эстонию приходит notice «Важно» о стопроцентном таможенном
досмотре багажа при въезде в Эстонию со ссылкой на подробную новость на sks-auto.ru; на рейсах СКСавто через
границу — pets с правилами провоза животных для Эстонии.
Цены, наценки и скидки
API отдаёт итоговые цены для конкретного партнёра — никакие дополнительные пересчёты на стороне
партнёра не требуются. В цену уже включены:
Динамическое ценообразование рейса — коэффициенты по заполненности салона, периоду,
дню недели, глубине продажи и «горящим» местам;
Индивидуальная наценка партнёра (отдельно для стыковочных рейсов, если она задана);
Индивидуальная скидка партнёра — процент на маршрут целиком или на конкретный отрезок,
с ограничением по датам поездки.
Взрослый тариф округляется до десятков рублей. Детский тариф всегда равен ровно половине
рассчитанного взрослого — это правило системы, а не отдельный тариф; так же считается
и child_roundtrip (половина adult_roundtrip).
Стоимость места багажа берётся из багажного профиля рейса; количество бесплатных мест багажа
также задаётся профилем и вычитается при расчёте.
Цену за багаж уточняйте перед оплатой
Цена места багажа определяется ступенчатой шкалой по стоимости билета. У границ ступеней
значение в выдаче поиска и значение, попадающее в заказ, могут отличаться на одну ступень —
итоговой считайте сумму из ответа apibook (order.price.value).
Где смотреть цену
apisearchroute → price.parts[] (в том числе bag и тарифы «туда-обратно»),
apigetprice → ticketTypes[] по конкретному отрезку.
Итоговая сумма заказа возвращается в apibook → order.price.value.
Справочник методов
GETPOST/apigetstations/
Полный справочник действующих остановок с координатами.
Параметры
Параметр
Тип
Описание
useridобяз.
int
Идентификатор партнёра
userkeyобяз.
string
Ключ доступа
Ответ
JSON
{
"stations": [
{
"id": "415", // id остановки"title": "Санкт-Петербург", // населённый пункт"name": "Санкт-Петербург. АВ Обводный канал, 36", // пункт + остановка"lngt": "30.3577", // долгота"ltd": "59.9135"// широта
}
]
}
Отдаются только действующие остановки
Отключённые остановки в выдачу не попадают. Справочник рекомендуется кэшировать
и обновлять раз в сутки.
GETPOST/apigetroutesfrom/
Остановки, связанные с заданной: все точки маршрутов, проходящих через неё.
Используется для построения пар «откуда → куда».
Параметры
Параметр
Тип
Описание
useridобяз.
int
Идентификатор партнёра
userkeyобяз.
string
Ключ доступа
stationidобяз.
int
id остановки из apigetstations
Ответ
JSON
{
"stations": [
{
"id": "401",
"title": "Псков АВ Вокзальная, 21", // пункт и остановка одной строкой"lngt": "28.3644",
"ltd": "57.8136"
}
]
}
Возможные ответы об ошибке
Станция не найдена или отключена — stationid не существует либо остановка выключена;
Станции не найдены — через остановку не проходит ни одного действующего маршрута.
Наличие пары ≠ наличие рейса на дату
Метод отвечает на вопрос «куда в принципе можно уехать». Расписание конкретной даты
проверяется методом apisearchroute.
GETPOST/apisearchroute/
Основной метод поиска: рейсы по паре остановок на дату — с расписанием, перевозчиком,
условиями возврата, сервисами на борту, свободными местами и полным набором тарифов.
Параметры
Параметр
Тип
Описание
useridобяз.
int
Идентификатор партнёра
userkeyобяз.
string
Ключ доступа
from-idобяз.
int
id остановки отправления
to-idобяз.
int
id остановки прибытия
dateобяз.
date
Дата поездки, ГГГГ-ММ-ДД
Ответ
JSON
{
"routes": [
{
"id": "54713", // id рейса (отрезка) — далее во все методы как route-id"from": "415", // id остановки отправления"to": "401", // id остановки прибытия"duration": "08:30", // время в пути, формат ЧЧ:ММ"departure": "22:30:00", // время отправления (пояс остановки отправления)"arrival": "07:00:00", // время прибытия (пояс остановки прибытия)"number": "10761_", // внутренний номер рейса"egis_code": "#78.35.057", // код маршрута в реестре, произвольная строка"name": "Санкт-Петербург - Псков",
"carrier": "СКСавто", // бренд перевозчика"carrier_full": "ООО «СКСавто»", // наименование ЮЛ"carrier_inn": "7800000000", // ИНН перевозчика"nds": "0", // ставка НДС"contact": "+7 (800) 770-00-20", // телефон перевозчика"carrier_ogrn": "1000000000000", // ОГРН перевозчика"carrier_address": "Санкт-Петербург, ...",
"carrier_egis_id": "12345", // идентификатор в ЕГИС ОТБ"is_international": 0, // 1 — международный (рудимент, дублирует rt_type=1)"rt_type": 0, // 0 — межрегиональный, 1 — международный,// 2 — смежный межрегиональный (перс. данные не обязательны,// но при посадке нужен электронный билет)"refund_with_charges": [ // шкала возврата, см. «Правила возврата»
{ "return_percent": "100%", "time_from": "", "time_till": "1440" },
{ "return_percent": "85%", "time_from": "1440", "time_till": "120" },
{ "return_percent": "75%", "time_from": "120", "time_till": "0" },
{ "return_percent": "", "time_from": "0", "time_till": "" }
],
"rtname": "Санкт-Петербург - Псков", // название маршрута целиком"rt_from": "415", // начальная остановка маршрута"rt_to": "401", // конечная остановка маршрута"servicesOnBoard": { // оснащение автобуса на эту дату — флаги"aircond": true, "wc": false, "220v": false, "usb": true,
"wifi": true, "seatadjust": true, "monitors": true,
"kitchen": false, "tables": false, "wardrobe": false,
"cleaning": true, "curtains": true,
"watercooler": true// набор ключей может расширяться
},
"servicesOnBoardList": [ // то же самое списком: только то, что ЕСТЬ,
{ // с готовым названием и иконкой"code": "wifi",
"title": "Wi-Fi",
"icon": "images/bus_services/wifi-solid.svg"
},
{
"code": "watercooler",
"title": "Кулер с водой",
"icon": "images/bus_services/water-cooler.svg"
}
],
"routeInfo": [ // информация для пассажира, см. ниже; [] — нечего показать
{
"code": "notice",
"title": "Важно",
"text": "С 30.09.2026 таможня Эстонии досматривает багаж каждого пассажира. …",
"textFull": "<p>С 30 сентября 2026 года …</p><p>…</p>",
"textPlain": "С 30 сентября 2026 года …\n…"
}
],
"route_parts": [ … ], // ТОЛЬКО у стыковочных рейсов, см. ниже"freeSeatsCount": "3,4,5,11,12,14", // номера свободных мест строкой через запятую"price": {
"parts": [
{ "type": "adult", "value": 1530 }, // взрослый
{ "type": "child", "value": 765 }, // детский
{ "type": "bag", "value": 150 }, // одно место багажа
{ "type": "adult_roundtrip", "value": 2900 }, // взрослый «туда-обратно»
{ "type": "child_roundtrip", "value": 1450 },
{ "type": "infant_roundtrip", "value": 0 }
]
}
}
]
}
Оснащение автобуса — servicesOnBoard и servicesOnBoardList
Оба поля описывают один и тот же набор — оснащение того автобуса, который назначен
на рейс в запрошенную дату (подмена ТС учитывается).
Поле
Описание
servicesOnBoard
словарь код → true/false. Удобен, когда вы проверяете конкретную позицию
(servicesOnBoard.wifi)
servicesOnBoardList
массив только того, что в автобусе есть: code, title
(название по-русски) и icon — путь к иконке относительно
https://sks-auto.ru/. Позволяет показать оснащение у себя в выдаче,
не заводя собственный словарь названий
Справочник оснащения пополняется, поэтому набор ключей не фиксирован:
разбирайте servicesOnBoard как словарь, а не как заранее известный список полей,
и не считайте отсутствующий ключ ошибкой. Действующие коды: aircond (кондиционер),
wc (биотуалет), 220v (розетки 220В), usb (USB-розетки),
wifi, seatadjust (регулировка сидений), monitors
(мультимедийные мониторы), kitchen (мини-кухня), tables (столики),
wardrobe (гардероб), cleaning (клининг), curtains (шторы),
watercooler (кулер с водой).
Информация для пассажира — routeInfo
Условия поездки, которые перевозчик просит довести до пассажира до покупки: правила пересечения границы,
документы, провоз животных, временные объявления (ремонт пункта пропуска, усиленный досмотр и т.п.).
Список уже собран под этот участок и эту дату: правила, относящиеся только к пересечению границы,
на участке внутри одной страны не приходят; объявление со сроком действия приходит только на даты рейса
внутри срока. Порядок элементов — порядок показа. Поле есть всегда; пустой массив — показывать нечего.
Поле
Описание
code
код вида информации: notice (важное сообщение), border
(пересечение границы), documents (документы для поездки), pets (провоз животных).
Справочник пополняется — неизвестный код показывайте как обычный текст с заголовком title
title
заголовок для пассажира, по-русски
text
краткий текст без разметки (до ~300 символов) — для выдачи
textFull
полный текст, ограниченный HTML: p, br, b,
strong, i, em, u, ul, ol,
li, a (только http/https/mailto/tel) — для страницы оформления и билета
textPlain
полный текст без разметки, абзацы — переводами строк (SMS, мессенджеры, чат-бот)
Одного code может прийти несколько элементов (правило перевозчика
и дополнение маршрута) — показывайте все. У стыковочного рейса routeInfo объединяет информацию
всех отрезков без повторов. Тексты меняются без предупреждения: не кэшируйте дольше, чем выдачу.
Здесь есть тариф infant, но нет строки bag.
Стоимость багажа берите из apisearchroute → price.parts[].type = "bag".
Сообщения об отказе: Маршрут не найден (комбинация route-id + from-id +
to-id не существует), Выберите более позднюю дату,
В указанную дату автобус по заданному маршруту не ходит.
GETPOST/apifreeplacenumber/
Список свободных мест на рейсе. Учитывает занятость на всех пересекающихся отрезках маршрута
и брони в статусе ожидания оплаты.
free — свободно, occupied — занято,
not_a_seat — не место (проход, туалет, водитель, лестница)
number
номер места; null, если status = not_a_seat
Ячейки идут построчно (сначала все x первого ряда, затем второго и т. д.), поэтому массив
можно разложить в сетку без дополнительной сортировки. Для стыковочного рейса место помечается
occupied, если занято хотя бы на одном отрезке.
GETPOST/apicarriertrips/
Все ваши рейсы на дату одним запросом: расписание с остановками, номера свободных мест,
оснащение автобуса и схема салона. Метод для перевозчиков-партнёров — контроль загрузки и планирование без перебора
пар остановок.
Доступен только ключам с белым списком рейсов
Метод отдаёт рейсы, разрешённые вашей учётной записи (обычно — рейсы вашего перевозчика),
и открывается менеджером при подключении. Обычный ключ получит
Метод доступен только ключам с белым списком рейсов — для поиска используйте
apisearchroute. Персональные данные пассажиров метод не отдаёт.
Параметры
Параметр
Тип
Описание
useridобяз.
int
Идентификатор партнёра
userkeyобяз.
string
Ключ доступа
dateобяз.
date
Дата рейсов, ГГГГ-ММ-ДД (принимается и ДД.ММ.ГГГГ)
route-idопц.
int
Только один маршрут; id отрезка автоматически сводится к корневому рейсу
seatmapопц.
int
0 — не включать сетку салона (ответ компактнее); по умолчанию сетка включена
расписание перевозчика как в базе продаж, без пересчёта часовых поясов; arrival — дата-время прибытия на конечную
stops
все остановки маршрута по порядку следования
seats.free
номера мест, свободных на всём протяжении маршрута. Занятость на конкретном отрезке — через apifreeplacenumber/apiseatschemas с парой from-id/to-id
seatmap
сетка салона, формат ячеек тот же, что у apiseatschemas: x/y/status/number
servicesOnBoard, servicesOnBoardList
оснащение автобуса, назначенного на рейс в эту дату (подмена ТС учитывается).
Формат и коды — те же, что в apisearchroute
routeInfo
информация для пассажира по рейсу целиком (от первой до последней остановки) на эту дату.
Формат — как в apisearchroute
Отдаются рейсы, которые ходят в указанную дату, включая уже отправившиеся — стоп продажи
(cutoff) здесь не применяется: метод мониторинговый, а не продажный.
Стыковочные (составные) рейсы в списке не показываются — их физические ноги приходят
как самостоятельные рейсы.
Учитываются подтверждённые билеты и брони в ожидании оплаты (15 минут) — как во всех
методах мест.
POST/apibook/
Бронирование. Создаёт заказ в статусе PENDING и удерживает места 15 минут.
Параметры запроса
Параметр
Где
Тип
Описание
useridобяз.
query
int
Идентификатор партнёра
userkeyобяз.
query
string
Ключ доступа
route-idобяз.
query
int
id рейса из apisearchroute
from-idобяз.
query
int
id остановки отправления
to-idобяз.
query
int
id остановки прибытия
dateобяз.
query
date
Дата поездки
Passengersобяз.
body
array
Массив пассажиров — JSON-телом или как форменный массив
Поля пассажира
Поле
Тип
Описание
seatnumberобяз.
int/string
Номер места. Обязателен всегда; повтор одного места в пределах запроса запрещён
lastNameобяз.*
string
Фамилия
firstNameобяз.*
string
Имя
middleNameобяз.*
string
Отчество (пустая строка, если отсутствует)
birthDateобяз.*
date
Дата рождения, ГГГГ-ММ-ДД
genderобяз.*
raw
M или F
citizenshipобяз.*
int
Код гражданства (справочник АЦБПДП)
documenttypeобяз.*
int
Код типа документа (справочник АЦБПДП)
documentобяз.*
string
Серия и номер документа
groupобяз.*
int
1 — взрослый, 2 — детский. Любое другое значение
трактуется как взрослый и оплачивается по взрослому тарифу
bag_qtyопц.
int
Количество мест багажа (бесплатные места вычитаются автоматически по профилю рейса)
mobileопц.
string
Телефон пассажира
* Для рейсов с rt_type = 2 (смежные межрегиональные) персональные данные
не обязательны — достаточно seatnumber. Незаполненные поля подставляются значениями
по умолчанию.
{
"order": {
"id": "10749119", // номер заказа — для apiconfirm / отмены"status": "PENDING", // ожидает подтверждения оплаты"expire": "2026-08-05 14:27:33", // момент автоматического снятия брони"price": { "value": 1680 } // итог по заказу, включая багаж
},
"tickets": [ // ВНИМАНИЕ: массив на верхнем уровне, не внутри order
{
"id": "1020257", // id билета — им оперируют методы отмены"seat": { "number": "12" },
"price": { "type": 1, "value": 1530 }, // type: 1 — взрослый, 2 — детский"bag_qty": { "value": 1 },
"bag_total": { "value": 150 },
"passenger": {
"firstName": "Иван", "middleName": "Иванович", "lastName": "Иванов",
"birthDate": "1985-04-12", "gender": "M", "citizenship": 1,
"documenttype": 0, "document": "4008 644762", "mobile": "79110000000"
},
"route": {
"id": "54713",
"departure": "2026-08-20 22:30:00"
}
}
]
}
Стыковочный рейс: билетов больше, чем пассажиров
При бронировании стыковочного рейса создаётся по билету на каждый отрезок для каждого пассажира.
Суммы price.value и bag_total.value распределяются между отрезками,
а order.price.value содержит итог по заказу. Поле route каждого билета
указывает свой отрезок и дату отправления по нему.
Сообщения об отказе
Маршрут не найден — не совпала тройка route-id/from-id/to-id;
Место N уже занято — место продано или удерживается чужой бронью;
Место N повторяется несколько раз — одно место назначено двум пассажирам в одном запросе;
Неверные входные параметры пассажира — не заполнено обязательное поле;
Выберите более позднюю дату поездки — рейс уже закрыт по времени;
В указанную дату автобус по заданному маршруту не ходит.
GETPOST/apiconfirm/
Подтверждение оплаты. Переводит заказ из PENDING в CONFIRMED
и окончательно закрепляет места.
заказ уже не в статусе PENDING (подтверждён либо отменён)
Время ожидания подтверждения оплаты истекло
прошло более 15 минут с момента создания заказа
Метод заведения заказа не совпадает
заказ создан не через партнёрское API
Строго 15 минут
Отсчёт идёт от момента создания заказа (order.expire в ответе apibook).
После истечения срока места освобождаются и подтвердить заказ невозможно — нужно бронировать заново.
POST/apieditpass/
Правка данных пассажиров и мест в уже созданном заказе с пересчётом стоимости.
Параметры
Параметр
Где
Тип
Описание
useridобяз.
query
int
Идентификатор партнёра
userkeyобяз.
query
string
Ключ доступа
order-idобяз.
query
string
Номер заказа
Passengersобяз.
body
array
Массив пассажиров. В каждом элементе обязательныid (id билета из
apibook/apiconfirm) и seatnumber; остальные поля — как в apibook
Метод не меняет рейс, дату и направление — только состав данных пассажиров, места и багаж
в рамках существующего заказа. Данные первого пассажира списка обновляют карточку покупателя заказа.
GETPOST/apiprecancelorder/
Предварительный расчёт возврата: сколько вернётся по каждому билету и по заказу.
Статусы и деньги не меняются.
Параметры
Параметр
Где
Тип
Описание
useridобяз.
query
int
Идентификатор партнёра
userkeyобяз.
query
string
Ключ доступа
order-idобяз.
query
string
Номер заказа
ticketsопц.
body/query
array
Массив id билетов. Если не передан — расчёт по всем билетам заказа
Совпадают с apiprecancelorder: userid, userkey,
order-id, необязательный массив tickets.
Ответ
JSON
{
"order": {
"id": "10748444",
"tickets": [
{
"ticket_id": "1020257",
"status": "Отменён перед отправлением", // статус из шкалы возврата рейса"refund": 1300, // возврат по билету"refund_bag": 128// возврат за багаж
}
],
"total": 0, // остаток суммы заказа после отмены"refund": 1428// итого возвращено
}
}
Правила
Бесплатная отмена — 15 минут с момента оплаты: возвращается 100 % без удержания;
далее удержание считается по шкале возврата рейса (см. refund_with_charges
в apisearchroute);
при отмене рейса перевозчиком возврат всегда полный;
билеты на стыковочный рейс отменяются только целиком — при передаче id одного отрезка
система сама добавит остальные отрезки этого пассажира;
повторный вызов по уже отменённому билету вернёт информацию о ранее оформленном возврате
(сумма, статус, дата), а не выполнит вторую отмену;
отмена недоступна, если пассажир отмечен как находящийся в автобусе или уже проехавший.
Рекомендуемый порядок
Сначала apiprecancelorder — показать пассажиру сумму к возврату,
затем apicancelorder — выполнить отмену.
GET/apiinsstatus/
Служебный сервис проверки отмены рейса по страховому полису.
Используется страховой компанией при урегулировании убытков.
Не входит в партнёрское API
Авторизация выполняется отдельным ключом (key в query или заголовок
X-Status-Key), пара userid/userkey здесь не используется.
Метод возвращает корректные HTTP-коды (401, 404).
Если direction не передан, ответ содержит отдельные блоки onward и
return, а поле cancelled верхнего уровня равно true,
если отменено любое из направлений.
Стыковочные рейсы
Стыковочный рейс — поездка из нескольких последовательных отрезков, выполняемая одним перевозчиком:
конечная точка предыдущего отрезка является начальной точкой следующего. Отрезков может быть несколько.
Что меняется
Как это выглядит в API
Признак стыковки
в объекте рейса присутствует непустой массив route_parts
Свободные места
freeSeatsCount — пересечение свободных мест всех отрезков
Схема салона
место помечается occupied, если занято хотя бы на одном отрезке
Бронирование
в apibook передаётся route-id стыковочного рейса; система сама создаёт билеты по всем отрезкам
Билеты
их количество = пассажиры × отрезки; суммы распределены по отрезкам, итог — в order.price.value
Отмена
только целиком: отменить один отрезок нельзя
Видимость стыковочных рейсов
Стыковочные рейсы отдаются не всем партнёрам — доступ включается индивидуально в учётной записи.
Если в выдаче нет ожидаемого стыковочного рейса, уточните настройку у вашего менеджера.
Правила возврата: как читать refund_with_charges
Шкала возврата приходит в ответе apisearchroute и индивидуальна для каждого рейса.
Интервалы задаются в минутах до отправления, строки идут от самых ранних к самым поздним.
Поле
Смысл
return_percent
Процент тарифа к возврату. Пустая строка — возврат не производится
time_from
Начало интервала, минут до отправления. Пустая строка — «с момента продажи», без ограничения
time_till
Конец интервала, минут до отправления. Пустая строка — до конца шкалы. Отрицательные значения означают время после отправления
Пример из ответа выше читается так: возврат 100 % — если до отправления более 1440 минут (сутки);
85 % — в интервале от 1440 до 120 минут; 75 % — за последние 120 минут; после отправления возврат
не производится.
Бесплатная отмена 15 минут
Независимо от шкалы, в течение 15 минут после оплаты билет возвращается полностью.
Это же правило действует, если рейс отменён перевозчиком.
Ошибки
Ответ об ошибке всегда содержит поля code и message и приходит с HTTP-статусом
200. Для методов поиска, тарифов, мест, бронирования и подтверждения code
равен "00" — ориентируйтесь на message.
Общие сообщения
message
Что произошло
Что делать
Некорректные параметры запроса
не передан обязательный параметр
проверить состав query-строки
Не найден активный ключ пользователя
неверная пара userid/userkey или доступ отключён
проверить учётные данные, связаться с менеджером
Маршруты не найдены
между остановками нет рейсов
проверить пару from-id/to-id через apigetroutesfrom
Маршрут не найден
тройка route-id/from-id/to-id не совпала
брать все три значения из одного объекта ответа apisearchroute
Станция не найдена или отключена
stationid не существует либо остановка выключена
обновить справочник apigetstations
Выберите более позднюю дату
сработал cutoff
предложить следующую дату
В указанную дату автобус по заданному маршруту не ходит
рейс есть, но не в этот день недели/дату
показать ближайшие даты с рейсами
Место N уже занято
место заняли между поиском и бронированием
перезапросить apifreeplacenumber
Место N повторяется несколько раз
дубль места в запросе
проверить формирование Passengers
Неверные входные параметры пассажира
не заполнено обязательное поле пассажира
дополнить данные
Заказ с таким номером не найден
неверный order-id
проверить номер заказа
Заказ не может быть подтвержден.
заказ не в статусе PENDING
проверить текущий статус
Время ожидания подтверждения оплаты истекло
прошло больше 15 минут
забронировать заново
Метод заведения заказа не совпадает
заказ создан не через API партнёра
операция недоступна
Ключ только для чтения: метод недоступен
учётной записи разрешены только читающие методы, а вызван метод продажи/отмены
использовать методы поиска, мест и схем; за расширением доступа — к менеджеру
Метод доступен только ключам с белым списком рейсов
apicarriertrips вызван обычным партнёрским ключом
метод предназначен перевозчикам; для поиска использовать apisearchroute
Числовые коды методов отмены
Только apicancelorder и apiprecancelorder:
code
Значение
01
Некорректные параметры запроса
02, 03, 05, 07, 09
Внутренняя ошибка базы данных
04
Не найден активный ключ пользователя
06
Заказ с таким номером не найден
08
Пассажир заказа не найден
12
Отмена заблокирована: пассажир в автобусе, уже проехал либо шкала возврата не допускает отмену
31
Не указан номер заказа
32
Заказ не оплачен, уже отменён или билет в недопустимом статусе
33
Билет не привязан к указанному заказу
00
Метод заведения заказа не совпадает
Особенности и ограничения
Слэш в конце адреса обязателен. Без него сервер отвечает редиректом 301 — используйте
-L в curl или сразу корректный URL.
HTTP-код не отражает результат. Всегда проверяйте наличие message в теле ответа.
Исключение — apiinsstatus.
apifreeplacenumber без route-id/date отдаёт HTTP 500.
Валидируйте параметры до вызова.
Время в ответах — только часы:минуты:секунды. Дату берите из параметра запроса; у стыковочных
рейсов дата отправления каждого отрезка приходит в tickets[].route.departure метода
apibook.
Времена приведены к часовому поясу остановки.departure — в поясе остановки
отправления, arrival — в поясе остановки прибытия. Дополнительных пересчётов не требуется.
Наличие остановки в справочнике ≠ наличие рейса. Отключённые остановки в выдачу не попадают,
но действующая остановка может не иметь рейсов на конкретную дату.
Кэшируйте справочники, не кэшируйте места.apigetstations и
apigetroutesfrom меняются редко; свободные места запрашивайте непосредственно
перед бронированием.
Идентификаторы берите из одного ответа. Тройка route-id + from-id +
to-id должна принадлежать одному объекту routes[], иначе будет
Маршрут не найден.
Тестируйте на тестовой учётной записи. Все заказы, созданные через API, попадают в общую
систему продаж; для отладки запрашивайте отдельный доступ.
Маршрутная сеть
Таблица — текущее состояние сети прямо из базы продаж: новый перевозчик или рейс
появляется в ней сам, без правки документации. Состав сети — коммерческая информация,
поэтому раздел открыт только партнёрам с действующим ключом API.
Обновления
Датированные записи о том, что менялось в маршрутной сети и на что при этом стоит обратить
внимание в интеграции. Новые сверху.
Даты и темы открыты всем, состав рейсов — только партнёрам с ключом API.
1 октября 2026
Новое поле routeInfo: информация для пассажира по рейсу
Для получения доступа потребуется договор и заявка с указанием юридического лица, контактного лица
технической поддержки и планируемых объёмов. После подключения выдаются userid и
userkey, при необходимости — отдельная тестовая учётная запись.
Наценка (в том числе отдельная для стыковочных рейсов), скидки на маршрут или отрезок с ограничением
по датам, время стоп-продаж и доступ к стыковочным рейсам — всё это задаётся в учётной записи партнёра
и не требует изменений на вашей стороне.