Интеграция

WAYBILL API

Данные о контейнерных перевозках — расписание рейсов, морские линии, флот и сервисы — напрямую в вашу систему. Обычные HTTP-запросы, ответы в JSON, ключ в заголовке.

REST · JSON HTTPS gzip Без SDK
0рейсов в расписании
0морских линий
0судов во флоте
0сервисов

Зачем это нужно

Что даёт интеграция

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

Расписание в вашей системе

Рейсы с судном, номером рейса, портами отправления и назначения, датами выхода и прибытия, транзитным временем и терминалом. Фильтры по линии, судну, портам и диапазону дат.

Справочник морских линий

Юридическое лицо, страна регистрации, бассейны работы, направления, агенты в России с контактами и терминалами. Готовый источник для карточек контрагентов.

Флот и вместимость

Суда с номером IMO, типом, вместимостью в TEU, дедвейтом, годом постройки, возрастом и флагом. Пригодится для оценки провозной способности линии на трейде.

Сервисы и маршруты

Идентификаторы сервисов, нитки маршрутов, страны отправления и прибытия. Позволяет строить подбор вариантов доставки по нужному направлению автоматически.

Актуальность без ручной работы

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

Предсказуемый доступ

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

Типичные сценарии

Экспедиторам

Подбор ближайших отходов по маршруту прямо в CRM, без ручного поиска по сайтам линий.

Грузовладельцам

Плановые даты отгрузок в ERP: расписание подтягивается автоматически и обновляется.

Аналитикам

Выгрузка флота и сервисов в BI для оценки провозной способности и динамики трейдов.

Разработчикам

Готовый источник справочников линий, портов и терминалов для внутренних сервисов.

Начало работы

Подключение за три шага

От заявки до первого ответа обычно проходит один рабочий день.

01

Оставьте заявку

Напишите на service@way-bill.ru и укажите название компании, какие разделы данных нужны и примерное число запросов в сутки. Для юридических лиц подготовим договор и счёт.

02

Получите ключ

Мы выдадим персональный ключ вида wb_live_…, согласуем суточный лимит и срок действия. Ключ передаётся один раз — храните его как пароль.

03

Сделайте первый запрос

Проверьте доступ на разделе /v1/meta, затем переходите к нужным данным. Примеры кода на четырёх языках — ниже.

Тестовый доступ. Перед заключением договора выдаём пробный ключ с лимитом 100 запросов в сутки на две недели — этого достаточно, чтобы оценить структуру данных и написать интеграцию.

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

Первый запрос

Ключ передаётся в заголовке X-API-Key. Больше ничего не требуется.

curl -H "X-API-Key: ВАШ_КЛЮЧ" \
     -H "Accept-Encoding: gzip" \
     "https://api.way-billapi.ru/v1/schedule?line=FESCO&limit=5"
import requests

BASE = "https://api.way-billapi.ru/v1"
HEADERS = {"X-API-Key": "ВАШ_КЛЮЧ"}

r = requests.get(f"{BASE}/schedule",
                 headers=HEADERS,
                 params={"line": "FESCO", "limit": 5},
                 timeout=20)
r.raise_for_status()
payload = r.json()

for row in payload["data"]:
    print(row["vessel"], row["voyage"], row["portFrom"], "→", row["portTo"], row["etd"])

print("осталось запросов:",
      payload["meta"]["quota"]["limit"] - payload["meta"]["quota"]["used"])
const BASE = "https://api.way-billapi.ru/v1";

async function schedule(params) {
  const url = new URL(BASE + "/schedule");
  Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));

  const res = await fetch(url, { headers: { "X-API-Key": "ВАШ_КЛЮЧ" } });
  if (!res.ok) {
    const err = await res.json();
    throw new Error(err.error.code + ": " + err.error.message);
  }
  return res.json();
}

schedule({ line: "FESCO", limit: 5 }).then(p => console.table(p.data));
<?php
$base = "https://api.way-billapi.ru/v1";
$url  = $base . "/schedule?" . http_build_query(["line" => "FESCO", "limit" => 5]);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING       => "gzip",
    CURLOPT_HTTPHEADER     => ["X-API-Key: ВАШ_КЛЮЧ"],
    CURLOPT_TIMEOUT        => 20,
]);
$body = curl_exec($ch);
curl_close($ch);

$payload = json_decode($body, true);
foreach ($payload["data"] as $row) {
    echo $row["vessel"], " ", $row["voyage"], " ", $row["etd"], PHP_EOL;
}

Справочник

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

Версия API — v1. Все разделы доступны только по HTTPS и только методом GET.

Базовый адрес

https://api.way-billapi.ru/v1

Полный адрес запроса складывается из базового адреса и имени раздела, например https://api.way-billapi.ru/v1/lines. Запросы по HTTP автоматически переводятся на HTTPS.

Авторизация

Ключ передаётся заголовком:

X-API-Key: wb_live_a7f3c9d2e1b48605

Поддерживается и вариант Authorization: Bearer <ключ> — удобно, если ваш HTTP-клиент заточен под этот формат. Запрос без ключа получит ответ 401, с неизвестным или отозванным ключом — 403.

Не размещайте ключ в коде страниц, мобильных приложениях и публичных репозиториях: он даёт доступ от вашего имени и расходует ваш лимит. Обращайтесь к API со своего сервера.

Формат ответа

Успешный ответ всегда устроен одинаково: данные в data, служебная информация в meta.

{
  "data": [ … ],
  "meta": {
    "total": 1284,
    "limit": 100,
    "offset": 0,
    "updated": "2026-08-23",
    "quota": { "limit": 5000, "used": 132 }
  }
}

Поле total — сколько записей всего подошло под фильтры, updated — дата последнего обновления данных на нашей стороне, quota — ваш суточный лимит и текущий расход.

Постраничный обход: параметры limit (по умолчанию 100, максимум 1000) и offset. Забирайте страницы, пока offset + limit меньше total.

Лимиты

Суточный лимит закрепляется за ключом и обнуляется в полночь по UTC. Текущий расход виден в meta.quota каждого ответа — отдельный запрос для этого делать не нужно.

При исчерпании лимита приходит 429 с кодом daily_limit. Если лимита стабильно не хватает, напишите нам — увеличим.

Эндпоинты

GET /v1/meta Даты обновления и объёмы данных

Лёгкий запрос для проверки доступа и мониторинга свежести данных. Параметров нет.

{
  "data": {
    "schedule": { "updated": "2026-08-23", "voyages": 1284 },
    "lines":    { "updated": "2026-08-17", "total": 131, "active": 70 },
    "vessels":  248,
    "services": 125
  }
}
GET /v1/schedule Расписание рейсов
ПараметрТипОписание
lineстрокаНазвание линии, точное совпадение
vesselстрокаНазвание судна
voyageстрокаНомер рейса
portFromстрокаПорт отправления, поиск по вхождению
portToстрокаПорт назначения, поиск по вхождению
terminalстрокаТерминал прибытия
etdFromдатаВыход не раньше, формат ГГГГ-ММ-ДД
etdToдатаВыход не позже
limit, offsetчислоПостраничный обход
GET /v1/schedule?portTo=Novorossiysk&etdFrom=2026-09-01&limit=2

{
  "data": [
    {
      "line": "AKKON LINES", "vessel": "LIDER PERIHAN", "voyage": "2536W",
      "portFrom": "Gebze", "etd": "2026-09-02",
      "portTo": "Novorossiysk", "terminal": "НУТЭП",
      "eta": "2026-09-06", "transit": "4"
    }
  ],
  "meta": { "total": 314, "limit": 2, "offset": 0, "updated": "2026-08-23" }
}
GET /v1/lines Каталог морских линий
ПараметрТипОписание
qстрокаПоиск по названию и юридическому лицу
basinстрокаБассейн: Балтийский, Азово-Черноморский, Дальневосточный, Каспийский, Арктический
active1 или 0Только действующие или только недействующие
limit, offsetчислоПостраничный обход

В списке отдаются краткие карточки: название, слаг, юридическое лицо, страна, бассейны, статус и статистика флота.

GET /v1/lines/{slug} Карточка линии целиком

Слаг берётся из поля slug в списке линий, например /v1/lines/fesco. Возвращает описание, адрес, направления, агентов с контактами, список сервисов и полный список судов. Если линия не найдена — 404.

GET /v1/vessels Флот
ПараметрТипОписание
lineстрокаФлот одной линии
imoстрокаКонкретное судно по номеру IMO
limit, offsetчислоПостраничный обход
{
  "data": [
    { "line": "FESCO", "name": "FESCO SOFIA", "imo": "9237503",
      "type": "Container Ship", "teu": 2702, "dwt": 33745,
      "built": "2002", "age": 24, "flag": "Russia" }
  ]
}
GET /v1/services Сервисы и маршруты
ПараметрТипОписание
lineстрокаСервисы одной линии
countryFromстрокаСтрана отправления
podстрокаПорт прибытия
limit, offsetчислоПостраничный обход
GET /v1/positions Координаты судов · по согласованию

Текущие координаты судов, скорость и курс. Раздел предоставляется по отдельному согласованию: данные поступают от внешнего поставщика AIS, и их передача третьим лицам регулируется его условиями. При отключённом доступе раздел отвечает 503 с пояснением.

Ошибки

Ошибка приходит в том же формате, что и данные, но с ключом error:

{ "error": { "code": "daily_limit", "message": "Исчерпан суточный лимит запросов." } }
Код HTTPcodeЧто случилось
401no_keyЗаголовок с ключом не передан
403bad_keyКлюч неизвестен или отозван
403key_expiredСрок действия ключа истёк
403scope_deniedКлюч не даёт доступа к этому разделу
404not_foundНеизвестный адрес или линия не найдена
405method_not_allowedИспользован метод, отличный от GET
429daily_limitИсчерпан суточный лимит
503positions_disabledРаздел позиций не подключён
500internalВнутренняя ошибка, повторите запрос позже

Рекомендации

  • Включите gzip. Заголовок Accept-Encoding: gzip сокращает объём ответа примерно на 84 процента.
  • Кэшируйте. Расписание меняется раз в сутки, справочники — реже. Сверяйтесь с полем meta.updated и не тяните одно и то же по кругу.
  • Берите страницами. Запрос с limit=1000 экономит вызовы там, где вы всё равно обрабатываете весь массив.
  • Обрабатывайте 429. При исчерпании лимита сделайте паузу до следующих суток, а не повторяйте запрос в цикле.
  • Ставьте таймаут. Пятнадцати-двадцати секунд достаточно; при обрыве повторите один раз.

Вопросы

Частые вопросы

Расписание рейсов — ежедневно. Справочники линий, флота и сервисов — по мере поступления изменений от линий, обычно несколько раз в месяц. Точная дата последнего обновления каждого набора приходит в поле meta.updated.

Нет. Это обычные HTTP-запросы с одним заголовком, работают из любого языка и даже из браузерной консоли. Примеры для четырёх языков есть выше.

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

Запросы начнут получать 429 до наступления следующих суток по UTC. Доступ не блокируется и не требует восстановления — просто дождитесь обнуления счётчика или попросите увеличить лимит.

Напишите нам — отзовём старый ключ и выдадим новый в течение рабочего дня. Отзыв действует сразу.

В пределах версии v1 мы не удаляем и не переименовываем существующие поля. Новые поля могут добавляться — пишите разбор ответа так, чтобы он их игнорировал.

Подключить API

Расскажите о задаче — предложим набор разделов и лимит под неё, выдадим тестовый ключ.

Made on
Tilda