v8.3 · 01.10.2026
Партнёрское API · продажа автобусных билетов

API СКСавто

REST-интерфейс для агрегаторов, автовокзалов и агентств: поиск рейсов и остановок, актуальные тарифы, свободные места и схема салона, информация для пассажира по рейсу (граница, документы, провоз животных, важные сообщения), бронирование, подтверждение оплаты, редактирование пассажиров и возврат билетов — включая стыковочные рейсы.

13методов
JSONформат обмена
15 минжизнь брони до оплаты
46подключённых партнёров

Быстрый старт

Полный цикл продажи — семь вызовов. Ниже показан минимальный маршрут от справочника остановок до подтверждённого заказа.

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 место освобождается автоматически.

Общие правила

Адрес и транспорт

Базовый URLhttps://sks-auto.ru/<метод>/ — завершающий слэш обязателен
HTTP-методы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ЧЧ:ММ — время в пути, часы могут превышать 2403:55
expireГГГГ-ММ-ДД ЧЧ:ММ:СС2026-08-05 14:12:33
Ценычисло, рубли; тарифы округляются до десятков1530
group1 — взрослый, 2 — детский1
genderM / 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 обяз.intid остановки из apigetstations

Ответ

JSON
{
  "stations": [
    {
      "id":    "401",
      "title": "Псков АВ Вокзальная, 21",  // пункт и остановка одной строкой
      "lngt":  "28.3644",
      "ltd":   "57.8136"
    }
  ]
}

Возможные ответы об ошибке

  • Станция не найдена или отключена — stationid не существует либо остановка выключена;
  • Станции не найдены — через остановку не проходит ни одного действующего маршрута.
Наличие пары ≠ наличие рейса на дату

Метод отвечает на вопрос «куда в принципе можно уехать». Расписание конкретной даты проверяется методом apisearchroute.

GETPOST/apisearchroute/

Основной метод поиска: рейсы по паре остановок на дату — с расписанием, перевозчиком, условиями возврата, сервисами на борту, свободными местами и полным набором тарифов.

Параметры

ПараметрТипОписание
userid обяз.intИдентификатор партнёра
userkey обяз.stringКлюч доступа
from-id обяз.intid остановки отправления
to-id обяз.intid остановки прибытия
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 объединяет информацию всех отрезков без повторов. Тексты меняются без предупреждения: не кэшируйте дольше, чем выдачу.

Блок route_parts — стыковочные рейсы

JSON
"route_parts": [
  {
    "id":        "45994",     // id отрезка
    "from":      "509",
    "to":        "472",
    "duration":  "05:10:00",
    "departure": "06:40:00",
    "arrival":   "11:50:00",
    "number":    "10120",
    "name":      "Великий Новгород - Псков"
  }
]

freeSeatsCount у стыковочного рейса — пересечение свободных мест всех отрезков: место доступно, только если свободно на каждом участке.

Сообщения об отказе

messageПричина
Некорректные параметры запросане передан один из обязательных параметров
Не найден активный ключ пользователяневерные userid/userkey либо доступ отключён
Маршруты не найденымежду этими остановками рейсов не существует в принципе
Выберите более позднюю датувсе рейсы на дату уже отправились или закрыты по cutoff
В указанную дату автобус по заданному маршруту не ходитрейс существует, но на эту дату/день недели расписания нет

GETPOST/apisearchroute2/

Выгрузка всех прямых рейсов на дату — без указания пары остановок. Предназначен для пакетной синхронизации расписания, не для интерактивного поиска.

Параметры

ПараметрТипОписание
userid обяз.intИдентификатор партнёра
userkey обяз.stringКлюч доступа
date обяз.dateДата, ГГГГ-ММ-ДД

Ответ

Структура routes[] аналогична apisearchroute, но:

  • отдаются только прямые рейсы, стыковочные исключены;
  • нет полей egis_code, carrier_full, carrier_inn, nds;
  • routeInfo — в том же формате, что в apisearchroute;
  • в price.parts[] присутствуют adult, child, bag и три тарифа *_roundtrip.
Метод тяжёлый

Ответ формируется по всему расписанию сети. Вызывайте его в фоне (например, раз в сутки), а для пользовательского поиска используйте apisearchroute.

GETPOST/apigetprice/

Тарифы по конкретному отрезку конкретного рейса на дату.

Параметры

ПараметрТипОписание
userid обяз.intИдентификатор партнёра
userkey обяз.stringКлюч доступа
route-id обяз.intid рейса из apisearchroute
from-id обяз.intid остановки отправления
to-id обяз.intid остановки прибытия
date обяз.dateДата поездки

Ответ

JSON
{
  "ticketTypes": [
    { "type": "adult",            "value": 1530 },
    { "type": "child",            "value": 765  },
    { "type": "infant",           "value": 0    },
    { "type": "adult_roundtrip",  "value": 2900 },
    { "type": "child_roundtrip",  "value": 1450 },
    { "type": "infant_roundtrip", "value": 0    }
  ]
}
Отличия от apisearchroute

Здесь есть тариф infant, но нет строки bag. Стоимость багажа берите из apisearchroute → price.parts[].type = "bag".

Сообщения об отказе: Маршрут не найден (комбинация route-id + from-id + to-id не существует), Выберите более позднюю дату, В указанную дату автобус по заданному маршруту не ходит.

GETPOST/apifreeplacenumber/

Список свободных мест на рейсе. Учитывает занятость на всех пересекающихся отрезках маршрута и брони в статусе ожидания оплаты.

Параметры

ПараметрТипОписание
userid обяз.intИдентификатор партнёра
userkey обяз.stringКлюч доступа
route-id обяз.intid рейса
from-id обяз.intid остановки отправления
to-id обяз.intid остановки прибытия
date обяз.dateДата поездки

Ответ

JSON
{
  "freeSeats": [
    { "number": "3" },
    { "number": "4" },
    { "number": "11" }
  ]
}
Передавайте полный набор параметров

Вызов без route-id или date приводит к ошибке сервера (HTTP 500), а не к JSON-ответу. Валидируйте параметры на своей стороне.

Если route-id указывает на стыковочный рейс, метод сам обходит все отрезки и возвращает пересечение свободных мест.

GETPOST/apiseatschemas/

Схема салона: сетка мест с координатами и статусом каждой ячейки — для отрисовки интерактивного выбора места.

Параметры

Те же, что у apifreeplacenumber: userid, userkey, route-id, from-id, to-id, date.

Ответ

JSON
{
  "freeSeats": [
    { "x": 1, "y": 1, "status": "free",       "number": "1"  },
    { "x": 2, "y": 1, "status": "occupied",   "number": "2"  },
    { "x": 3, "y": 1, "status": "not_a_seat", "number": null }
  ]
}
ПолеОписание
xпозиция ячейки по горизонтали (столбец)
yпозиция ячейки по вертикали (ряд)
statusfree — свободно, 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 опц.int0 — не включать сетку салона (ответ компактнее); по умолчанию сетка включена

Ответ

JSON
{
  "date": "2026-09-05",
  "trips": [
    {
      "id": "54708",
      "number": "10761",
      "date": "2026-09-05",
      "from": { "id": 415, "title": "СПб, АВ Обводный, 36" },
      "to":   { "id": 716, "title": "Балашиха, АС Южная" },
      "departure": "22:30:00",
      "arrival": "2026-09-06 08:00:00",
      "duration": "09:30",
      "stops": [
        { "id": 415, "title": "СПб, АВ Обводный, 36" },
        { "id": 715, "title": "Москва, АВ Центральный" },
        { "id": 716, "title": "Балашиха, АС Южная" }
      ],
      "seats": {
        "total": 34,
        "free_count": 12,
        "occupied_count": 22,
        "free": ["21", "22", "25"]
      },
      "servicesOnBoard": {                // оснащение автобуса на эту дату
        "aircond": true, "wifi": true, "usb": true, "watercooler": true, …
      },
      "servicesOnBoardList": [
        { "code": "wifi", "title": "Wi-Fi", "icon": "images/bus_services/wifi-solid.svg" }
      ],
      "routeInfo": [ … ],                 // информация для пассажира, формат — как в apisearchroute
      "seatmap": [
        { "x": 1, "y": 1, "status": "free", "number": "21" }
      ]
    }
  ]
}
ПолеОписание
id, numberid корневого рейса и его номер (код маршрута)
departure, arrival, durationрасписание перевозчика как в базе продаж, без пересчёта часовых поясов; 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 обяз.queryintИдентификатор партнёра
userkey обяз.querystringКлюч доступа
route-id обяз.queryintid рейса из apisearchroute
from-id обяз.queryintid остановки отправления
to-id обяз.queryintid остановки прибытия
date обяз.querydateДата поездки
Passengers обяз.bodyarray Массив пассажиров — JSON-телом или как форменный массив

Поля пассажира

ПолеТипОписание
seatnumber обяз.int/stringНомер места. Обязателен всегда; повтор одного места в пределах запроса запрещён
lastName обяз.*stringФамилия
firstName обяз.*stringИмя
middleName обяз.*stringОтчество (пустая строка, если отсутствует)
birthDate обяз.*dateДата рождения, ГГГГ-ММ-ДД
gender обяз.*rawM или F
citizenship обяз.*intКод гражданства (справочник АЦБПДП)
documenttype обяз.*intКод типа документа (справочник АЦБПДП)
document обяз.*stringСерия и номер документа
group обяз.*int 1 — взрослый, 2 — детский. Любое другое значение трактуется как взрослый и оплачивается по взрослому тарифу
bag_qty опц.intКоличество мест багажа (бесплатные места вычитаются автоматически по профилю рейса)
mobile опц.stringТелефон пассажира

* Для рейсов с rt_type = 2 (смежные межрегиональные) персональные данные не обязательны — достаточно seatnumber. Незаполненные поля подставляются значениями по умолчанию.

Пример запроса

HTTP
POST /apibook/?userid=1030&userkey=xxxxxxxx-xxxx-xxxx&route-id=54713&from-id=415&to-id=401&date=2026-08-20
Content-Type: application/json

{
  "Passengers": [
    {
      "lastName": "Иванов", "firstName": "Иван", "middleName": "Иванович",
      "birthDate": "1985-04-12", "group": 1, "gender": "M",
      "citizenship": 1, "documenttype": 0, "document": "4008 644762",
      "mobile": "79110000000", "seatnumber": 12, "bag_qty": 1
    }
  ]
}

Ответ

JSON
{
  "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 и окончательно закрепляет места.

Параметры

ПараметрТипОписание
userid обяз.intИдентификатор партнёра
userkey обяз.stringКлюч доступа
order-id обяз.stringНомер заказа из ответа apibook (order.id)

Ответ

JSON
{
  "order": {
    "id":     "10749119",
    "status": "CONFIRMED",
    "price": { "value": 1680 }
  },
  "tickets": [
    {
      "id": "1020257",
      "seat":        { "number": "12" },
      "return_seat": { "number": "" },   // место обратного рейса, если оформлялось
      "price":      { "type": "1", "value": "1530" },
      "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" }
    }
  ]
}

Сообщения об отказе

messageПричина
Заказ с таким номером не найденневерный order-id
Заказ не может быть подтвержден.заказ уже не в статусе PENDING (подтверждён либо отменён)
Время ожидания подтверждения оплаты истеклопрошло более 15 минут с момента создания заказа
Метод заведения заказа не совпадаетзаказ создан не через партнёрское API
Строго 15 минут

Отсчёт идёт от момента создания заказа (order.expire в ответе apibook). После истечения срока места освобождаются и подтвердить заказ невозможно — нужно бронировать заново.

POST/apieditpass/

Правка данных пассажиров и мест в уже созданном заказе с пересчётом стоимости.

Параметры

ПараметрГдеТипОписание
userid обяз.queryintИдентификатор партнёра
userkey обяз.querystringКлюч доступа
order-id обяз.querystringНомер заказа
Passengers обяз.bodyarray Массив пассажиров. В каждом элементе обязательны id (id билета из apibook/apiconfirm) и seatnumber; остальные поля — как в apibook

Ответ

JSON
{
  "order": { "id": "10748352" },
  "tickets": [
    {
      "id": "1020110",
      "price":      { "type": 1, "value": 1530 },
      "bag_qty":   { "value": 1 },
      "bag_total": { "value": 150 },
      "passenger": { "firstName": "Иван", "lastName": "Иванов", /* … */ }
    }
  ]
}
Ограничения

Метод не меняет рейс, дату и направление — только состав данных пассажиров, места и багаж в рамках существующего заказа. Данные первого пассажира списка обновляют карточку покупателя заказа.

GETPOST/apiprecancelorder/

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

Параметры

ПараметрГдеТипОписание
userid обяз.queryintИдентификатор партнёра
userkey обяз.querystringКлюч доступа
order-id обяз.querystringНомер заказа
tickets опц.body/queryarray Массив id билетов. Если не передан — расчёт по всем билетам заказа

Ответ

JSON
{
  "order": {
    "id": "10746880",
    "tickets": [
      { "ticket_id": "1018269", "refund": 1300, "refund_bag": 128 }
    ],
    "refund": 1428          // итого к возврату по заказу
  }
}

Если билет уже возвращён

Метод вернёт массив с историей возврата вместо расчёта:

JSON
[
  {
    "ticket": {
      "ticket_id":   "1018269",
      "status":      "Отменён перед отправлением",
      "refund":      1300,
      "refund_date": "2026-08-01 10:12:44"
    }
  }
]

GETPOST/apicancelorder/

Фактическая отмена билетов и оформление возврата.

Параметры

Совпадают с 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).

Параметры

ПараметрОписание
key обяз.Ключ доступа сервиса
ext_idВнешний номер полиса, например SKS-1234-56-O
policy_idСистемный идентификатор полиса
passenger_idid билета; дополняется direction=onward|return

Ответ

JSON
{
  "ok": true,
  "passenger_id": 1020257,
  "order_id":     10748444,
  "order_status": "CONFIRMED",
  "fio":          "Иванов Иван Иванович",
  "direction":    "onward",
  "cancelled":    false,
  "departure":    "2026-08-20 22:30:00",
  "city_from":    "Санкт-Петербург",
  "city_to":      "Псков"
}

Если 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.

Вход для партнёров

Введите номер учётной записи и ключ — те же, что вы передаёте в параметрах userid и userkey. Ключ передаётся методом POST, не попадает в адресную строку и нигде не сохраняется, кроме вашей сессии.

Нет доступа? Напишите на info@sks-auto.ru — выдадим ключ и подключим к тестовому контуру. Описание методов ниже открыто и без входа.

Обновления

Датированные записи о том, что менялось в маршрутной сети и на что при этом стоит обратить внимание в интеграции. Новые сверху. Даты и темы открыты всем, состав рейсов — только партнёрам с ключом API.

1 октября 2026

Новое поле routeInfo: информация для пассажира по рейсу

новое полеapisearchrouteapicarriertrips

Состав рейсов и подробности интеграции доступны партнёрам с ключом API — войдите в разделе «Маршрутная сеть».

3 сентября 2026

Новый метод apicarriertrips: рейсы перевозчика на дату одним запросом

новый методперевозчикам

Состав рейсов и подробности интеграции доступны партнёрам с ключом API — войдите в разделе «Маршрутная сеть».

29 августа 2026

КРУИЗ 21: Приволжское направление и второй ночной рейс Санкт-Петербург — Москва

новый перевозчикКРУИЗ 21новые остановки

Состав рейсов и подробности интеграции доступны партнёрам с ключом API — войдите в разделе «Маршрутная сеть».

18 августа 2026

ТТК ГЛОБУС: Москва (Северные ворота) и Донецкое направление

новый перевозчикТТК ГЛОБУСновые остановки

Состав рейсов и подробности интеграции доступны партнёрам с ключом API — войдите в разделе «Маршрутная сеть».

Подключение

Для получения доступа потребуется договор и заявка с указанием юридического лица, контактного лица технической поддержки и планируемых объёмов. После подключения выдаются userid и userkey, при необходимости — отдельная тестовая учётная запись.

Электронная почтаart@sks-auto.ru
Телефон+7 (931) 255-52-38
Сайтsks-auto.ru
Версия документа8.1 от 01.09.2026
Что можно настроить индивидуально

Наценка (в том числе отдельная для стыковочных рейсов), скидки на маршрут или отрезок с ограничением по датам, время стоп-продаж и доступ к стыковочным рейсам — всё это задаётся в учётной записи партнёра и не требует изменений на вашей стороне.