← Стать партнёром

API для партнёров

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

Авторизация

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

curl https://mail.astoriatravel.az/api/partner/v1/ping \
  -H "Authorization: Bearer atp_your_key"

Endpoints

https://mail.astoriatravel.az/api/partner/v1

GET/ping
GET/listings
Ваши номера ("room:ID", по одному на тип номера) и машины ("car:ID") с количеством единиц.
GET/availability?listing=room:12&from=2026-11-01&to=2026-11-30
Свободные единицы по дням. "available": null — лимит не задан; "booked" — продано здесь, "blocked" — дни, занятые по вашему календарю iCal.
POST/availability
"available" — количество единиц, свободных для продажи с этого момента, как их показывает ваша система; бронирования, сделанные здесь позже, вычитаются автоматически. null возвращает обычное количество номеров. "closed": true закрывает продажи. Даты включительно, не более 366 дней на элемент.
GET/bookings?since=2026-11-01T00:00:00Z
Бронирования ваших объектов на Astoria Travel, сначала новые. "since" возвращает только созданные или изменённые после этого времени.
GET / POST/webhook
Укажите адрес, который получает события бронирований. "POST webhook/test" отправляет тестовое событие.

GET /listings

{
  "listings": [
    { "listing": "room:12", "type": "room", "id": 12, "hotel_id": 7, "name": "Hotel Baku — Standard Double", "units": 5, "active": true },
    { "listing": "car:5", "type": "car", "id": 5, "airport": "GYD", "name": "Toyota Camry (GYD)", "units": 1, "active": true }
  ]
}

POST /availability

curl -X POST https://mail.astoriatravel.az/api/partner/v1/availability \
  -H "Authorization: Bearer atp_your_key" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"listing":"room:12","from":"2026-11-01","to":"2026-11-05","available":3}]}'
{
  "items": [
    { "listing": "room:12", "from": "2026-11-01", "to": "2026-11-05", "available": 3 },
    { "listing": "room:12", "from": "2026-12-30", "to": "2027-01-02", "closed": true },
    { "listing": "car:5",   "from": "2026-11-10", "to": "2026-11-10", "available": 0 }
  ]
}

События вебхука

booking.created, booking.updated (оплата или смена статуса), booking.cancelled и ping. Каждое событие — POST с телом JSON такого вида:

{
  "event": "booking.created",
  "sent_at": "2026-11-01T10:15:00+04:00",
  "booking": {
    "booking_ref": "20261101101500",
    "module": "hotels",
    "listing": "room:12",
    "date_from": "2026-11-20",
    "date_to": "2026-11-23",
    "units": 1,
    "status": "pending",
    "payment_status": "unpaid",
    "adults": 2,
    "children": 0,
    "guest": { "name": "Ivan Petrov", "email": "ivan@example.com", "phone": "+7 900 000 00 00", "special_requests": "" },
    "price": "540.00",
    "currency": "RUB",
    "created_at": "2026-11-01 10:15:00"
  }
}
curl -X POST https://mail.astoriatravel.az/api/partner/v1/webhook \
  -H "Authorization: Bearer atp_your_key" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/astoria-webhook"}'

Проверка подписи

Заголовок X-Astoria-Signature — это "sha256=" и HMAC-SHA256 исходного тела с секретом вебхука. Ответьте любым статусом 2xx; остальные ответы записываются в журнал.

PHP

$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, $webhookSecret);
if (! hash_equals($expected, $_SERVER['HTTP_X_ASTORIA_SIGNATURE'] ?? '')) {
    http_response_code(401);
    exit;
}
$event = json_decode($body, true);   // $event['event'], $event['booking']
http_response_code(200);

Node.js

const crypto = require('crypto');
// rawBody: the request body exactly as received (Buffer or string)
const expected = 'sha256=' + crypto.createHmac('sha256', webhookSecret).update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-astoria-signature'] || ''));

Календари (iCal)

Без API: вставьте в панели партнёра ссылку на свой календарь для каждого типа номера или машины (читается каждые 15 минут) и добавьте нашу ссылку на календарь из панели в свою систему.

Ошибки

Ошибки приходят со статусом 4xx и телом {"error": "код", "message": "текст"}. 401 — нет ключа или он неверный, 404 — не ваш объект, 422 — неверные данные, 429 — слишком много запросов.

Плагин WordPress

Astoria Travel Connect делает всё это из админки WordPress: свободные единицы, наши бронирования с уведомлениями на почту и хук do_action("astoria_travel_booking") для разработчиков.

Astoria Travel Connect (.zip)

Скачайте приложение!

В нашем приложении есть всё для путешествий: безопасная оплата и бронирование в 4 простых шага. Что ещё нужно?

Скачайте приложение!