PHPackages                             letoceiling/travelpayouts - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. letoceiling/travelpayouts

ActiveLibrary[API Development](/categories/api)

letoceiling/travelpayouts
=========================

Полный пакет для работы с Travelpayouts API (Авиабилеты, Ж/д билеты, Автобусы, Электрички)

1.1.0(4mo ago)00MITPHPPHP ^8.1CI passing

Since Dec 21Pushed 4mo agoCompare

[ Source](https://github.com/letoceiling-coder/travelpayouts)[ Packagist](https://packagist.org/packages/letoceiling/travelpayouts)[ RSS](/packages/letoceiling-travelpayouts/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (7)Versions (3)Used By (0)

Travelpayouts API Package
=========================

[](#travelpayouts-api-package)

[![CI](https://github.com/letoceiling-coder/travelpayouts/workflows/CI/badge.svg)](https://github.com/letoceiling-coder/travelpayouts/actions)

Полный и гибкий PHP-пакет для работы с Travelpayouts API. Поддерживает поиск и работу с авиабилетами, ж/д билетами, автобусами, электричками и статистикой партнерской программы.

Содержание
----------

[](#содержание)

- [Возможности](#%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8)
- [Требования](#%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
- [Установка](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
- [Быстрый старт](#%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82)
- [Документация по сервисам](#%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%D0%BC)
    - [Авиабилеты (FlightService)](#%EF%B8%8F-%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B-flightservice)
    - [Ж/д билеты (RailwayService)](#-%D0%B6%D0%B4-%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B-railwayservice)
    - [Автобусы (BusService)](#-%D0%B0%D0%B2%D1%82%D0%BE%D0%B1%D1%83%D1%81%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B-busservice)
    - [Электрички (CommuterService)](#-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%BA%D0%B8-commuterservice)
    - [Статистика (StatisticsService)](#-%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0-statisticsservice)
- [Расширенные возможности](#%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8)
- [Структура данных](#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
- [Обработка ошибок](#%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA)
- [Валидация](#%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F)
- [Интеграция с Laravel](#%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81-laravel)
- [Лучшие практики](#%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8)
- [Примеры использования](#%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
- [Тестирование](#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Дополнительная документация](#%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F)

Возможности
-----------

[](#возможности)

- ✈️ **Авиабилеты (Aviasales API)** - поиск билетов, календари цен, популярные направления
- 🚂 **Ж/д билеты** - поиск билетов на поезда, информация о станциях
- 🚌 **Автобусные билеты** - поиск автобусных маршрутов
- 🚋 **Электрички** - поиск билетов на электрички
- 📊 **Статистика** - статистика бронирований, баланс, партнерская программа
- 🔄 **Кэширование** - встроенная поддержка кэширования для оптимизации
- 📝 **Логирование** - поддержка PSR-3 логирования
- 🔁 **Retry механизм** - автоматические повторы запросов при ошибках
- ✅ **Валидация** - автоматическая валидация входных данных
- 🎯 **Type Safety** - строгая типизация (PHP 8.1+)
- 🏗️ **Laravel интеграция** - готовый Service Provider и Facade

Требования
----------

[](#требования)

- PHP &gt;= 8.1
- Guzzle HTTP Client ^7.0
- Symfony Validator ^6.0|^7.0
- Illuminate/Support ^10.0|^11.0 (для Laravel)

Установка
---------

[](#установка)

### Установка через Composer

[](#установка-через-composer)

```
composer require letoceiling/travelpayouts
```

### Laravel

[](#laravel)

Пакет автоматически регистрирует Service Provider. Опубликуйте конфигурационный файл:

```
php artisan vendor:publish --provider="Letoceiling\Travelpayouts\TravelpayoutsServiceProvider"
```

В файле `.env` добавьте:

```
TRAVELPAYOUTS_TOKEN=your_api_token
TRAVELPAYOUTS_MARKER=your_marker
```

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

[](#быстрый-старт)

### Базовая конфигурация

[](#базовая-конфигурация)

```
use Letoceiling\Travelpayouts\TravelpayoutsClient;

$client = new TravelpayoutsClient([
    'token' => 'your_api_token',
    'marker' => 'your_marker', // опционально
    'base_uri' => 'https://api.travelpayouts.com', // по умолчанию
    'timeout' => 30, // опционально, по умолчанию 30 секунд
]);
```

### Laravel

[](#laravel-1)

```
use Letoceiling\Travelpayouts\Facades\Travelpayouts;

// Использование через Facade
$results = Travelpayouts::flight()->getDirectFlights([
    'origin' => 'MOW',
    'destination' => 'LED',
]);
```

Документация по сервисам
------------------------

[](#документация-по-сервисам)

### ✈️ Авиабилеты (FlightService)

[](#️-авиабилеты-flightservice)

**Важно:** Для работы с API авиабилетов необходимо зарегистрироваться на платформе Travelpayouts и подключиться к программе Aviasales. API данных доступно всем партнёрам сразу после регистрации.

#### getDirectFlights() - Прямые рейсы без пересадок

[](#getdirectflights---прямые-рейсы-без-пересадок)

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

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления (например, 'MOW')
- `destination` (string, обязательный) - IATA код города назначения (например, 'LED')
- `depart_date` (string, опциональный) - Месяц вылета в формате YYYY-MM (например, '2025-12')
- `return_date` (string, опциональный) - Месяц возвращения в формате YYYY-MM
- `market` (string, опциональный) - Рынок данных, по умолчанию 'ru'
- `currency` (string, опциональный) - Валюта цен (USD, EUR, RUB и т.д.)

**Возвращает:** `array` - Массив с данными о билетах, структурированный по датам

**Пример:**

```
$flightService = $client->flight();

$flights = $flightService->getDirectFlights([
    'origin' => 'MOW',
    'destination' => 'LED',
    'depart_date' => '2025-12',
    'return_date' => '2025-12',
    'market' => 'ru',
    'currency' => 'USD',
]);

// Структура ответа:
// [
//     'success' => true,
//     'data' => [
//         '2025-12-01' => [
//             'price' => 4500,
//             'currency' => 'USD',
//             'airline' => 'SU',
//             'flight_number' => 123,
//             'departure_at' => '2025-12-01T10:00:00Z',
//             'return_at' => '2025-12-01T12:00:00Z',
//             'transfers' => 0,
//         ],
//         ...
//     ]
// ]

foreach ($flights['data'] ?? [] as $date => $flight) {
    echo "Дата: {$date}\n";
    echo "Цена: {$flight['price']} {$flight['currency']}\n";
    echo "Авиакомпания: {$flight['airline']}\n";
    echo "Вылет: {$flight['departure_at']}\n";
}
```

#### getPriceCalendar() - Календарь цен (v1 API)

[](#getpricecalendar---календарь-цен-v1-api)

Возвращает самый дешевый билет для каждого дня месяца (без пересадок, с одной или двумя пересадками).

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления
- `destination` (string, обязательный) - IATA код города назначения
- `departure_date` (string, опциональный) - Месяц вылета в формате YYYY-MM
- `return_date` (string, опциональный) - Месяц возвращения в формате YYYY-MM
- `calendar_type` (string, опциональный) - Тип календаря: 'departure\_date' или 'return\_date', по умолчанию 'departure\_date'
- `trip_duration` (int, опциональный) - Длительность пребывания в днях (для поездок туда-обратно)
- `market` (string, опциональный) - Рынок данных, по умолчанию 'ru'

**Возвращает:** `array` - Календарь цен по дням месяца

**Пример:**

```
$calendar = $flightService->getPriceCalendar([
    'origin' => 'MOW',
    'destination' => 'BCN',
    'departure_date' => '2025-12',
    'return_date' => '2025-12',
    'calendar_type' => 'departure_date',
    'trip_duration' => 7,
    'market' => 'ru',
]);

// Результат содержит календарь с ценами на каждый день
foreach ($calendar['data'] ?? [] as $date => $price) {
    echo "Дата: {$date}, Минимальная цена: {$price}\n";
}
```

#### getLowPriceCalendar() - Календарь низких цен (v2 API)

[](#getlowpricecalendar---календарь-низких-цен-v2-api)

Более современная версия API календаря цен с улучшенной структурой данных.

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления
- `destination` (string, обязательный) - IATA код города назначения
- `depart_date` (string, опциональный) - Дата или месяц в формате YYYY-MM-DD или YYYY-MM
- `return_date` (string, опциональный) - Дата возвращения
- `currency` (string, опциональный) - Валюта цен

**Возвращает:** `array` - Календарь низких цен

**Пример:**

```
$calendar = $flightService->getLowPriceCalendar([
    'origin' => 'MOW',
    'destination' => 'LED',
    'depart_date' => '2025-12-21',
    'return_date' => '2025-12-28',
    'currency' => 'USD',
]);
```

#### getWeekPriceMatrix() - Матрица цен на неделю

[](#getweekpricematrix---матрица-цен-на-неделю)

Возвращает цены на билеты в пределах недели относительно указанных дат вылета и возвращения.

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления
- `destination` (string, обязательный) - IATA код города назначения
- `depart_date` (string, опциональный) - Дата вылета
- `return_date` (string, опциональный) - Дата возвращения
- `currency` (string, опциональный) - Валюта цен

**Возвращает:** `array` - Матрица цен на неделю

**Пример:**

```
$matrix = $flightService->getWeekPriceMatrix([
    'origin' => 'MOW',
    'destination' => 'LED',
    'depart_date' => '2025-12-21',
    'return_date' => '2025-12-28',
    'currency' => 'USD',
]);
```

#### getMonthPriceMatrix() - Матрица цен на месяц

[](#getmonthpricematrix---матрица-цен-на-месяц)

Полная матрица цен для всего месяца.

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления
- `destination` (string, обязательный) - IATA код города назначения
- `depart_date` (string, опциональный) - Месяц в формате YYYY-MM
- `return_date` (string, опциональный) - Месяц возвращения
- `currency` (string, опциональный) - Валюта цен

**Возвращает:** `array` - Матрица цен на месяц

**Пример:**

```
$matrix = $flightService->getMonthPriceMatrix([
    'origin' => 'MOW',
    'destination' => 'LED',
    'depart_date' => '2025-12',
    'currency' => 'USD',
]);
```

#### getPopularDirections() - Популярные направления

[](#getpopulardirections---популярные-направления)

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

**Параметры:**

- `origin` (string, обязательный) - IATA код города отправления
- `currency` (string, опциональный) - Валюта цен

**Возвращает:** `array` - Массив популярных направлений

**Пример:**

```
$directions = $flightService->getPopularDirections('MOW', 'USD');

foreach ($directions as $direction) {
    echo "Направление: {$direction['destination']}\n";
    echo "Цена: {$direction['price']} USD\n";
    echo "Популярность: {$direction['count']}\n"; // Количество поисков
}
```

#### getAirlines() - Справочник авиакомпаний

[](#getairlines---справочник-авиакомпаний)

Получить полный список всех авиакомпаний.

**Возвращает:** `array` - Справочник авиакомпаний с кодами IATA, названиями и другой информацией

**Пример:**

```
$airlines = $flightService->getAirlines();

foreach ($airlines as $code => $airline) {
    echo "Код: {$code}\n";
    echo "Название: {$airline['name']}\n";
    echo "Страна: {$airline['country']}\n";
}
```

#### getAirports() - Справочник аэропортов

[](#getairports---справочник-аэропортов)

Получить полный список всех аэропортов.

**Возвращает:** `array` - Справочник аэропортов с кодами IATA, координатами и другой информацией

**Пример:**

```
$airports = $flightService->getAirports();

foreach ($airports as $code => $airport) {
    echo "Код: {$code}\n";
    echo "Название: {$airport['name']}\n";
    echo "Город: {$airport['city']}\n";
    echo "Координаты: {$airport['coordinates']['lat']}, {$airport['coordinates']['lon']}\n";
}
```

#### getCities() - Справочник городов

[](#getcities---справочник-городов)

Получить полный список всех городов.

**Возвращает:** `array` - Справочник городов с кодами IATA и названиями

**Пример:**

```
$cities = $flightService->getCities();

foreach ($cities as $code => $city) {
    echo "Код: {$code}\n";
    echo "Название: {$city['name']}\n";
    echo "Страна: {$city['country']}\n";
}

// Найти город по коду
if (isset($cities['MOW'])) {
    echo "Москва найдена: " . $cities['MOW']['name'] . "\n";
}
```

### 🚂 Ж/д билеты (RailwayService)

[](#-жд-билеты-railwayservice)

#### search() - Поиск ж/д билетов

[](#search---поиск-жд-билетов)

**Параметры:**

- `origin` (string, обязательный) - Город или станция отправления
- `destination` (string, обязательный) - Город или станция назначения
- `departure_date` (string, обязательный) - Дата отправления в формате Y-m-d
- `return_date` (string, опциональный) - Дата возвращения в формате Y-m-d
- `adults` (int, опциональный) - Количество взрослых, по умолчанию 1, максимум 10
- `children` (int, опциональный) - Количество детей, максимум 10
- `infants` (int, опциональный) - Количество младенцев, максимум 2
- `class` (string, опциональный) - Класс вагона: 'first', 'second', 'third', 'fourth'

**Возвращает:** `SearchResult` - Объект с результатами поиска

**Пример:**

```
$railwayService = $client->railway();

// Простой поиск
$results = $railwayService->search([
    'origin' => 'Moscow',
    'destination' => 'Saint Petersburg',
    'departure_date' => '2025-12-25',
]);

// Поиск с возвратом и пассажирами
$results = $railwayService->search([
    'origin' => 'Moscow',
    'destination' => 'Saint Petersburg',
    'departure_date' => '2025-12-25',
    'return_date' => '2025-12-30',
    'adults' => 2,
    'children' => 1,
    'infants' => 0,
    'class' => 'second',
]);

// Работа с результатами
echo "Найдено рейсов: " . $results->getCount() . "\n";

if ($results->isNotEmpty()) {
    foreach ($results->trips as $trip) {
        echo "Маршрут: {$trip['origin']} -> {$trip['destination']}\n";
        echo "Дата отправления: {$trip['departureDate']}\n";
        echo "Время отправления: {$trip['departureTime']}\n";
        if (isset($trip['arrivalDate'])) {
            echo "Дата прибытия: {$trip['arrivalDate']}\n";
            echo "Время прибытия: {$trip['arrivalTime']}\n";
        }
        echo "Цена: {$trip['price']} {$trip['currency']}\n";
        if (isset($trip['class'])) {
            echo "Класс: {$trip['class']}\n";
        }
    }

    // Метаданные поиска
    if ($results->meta) {
        echo "Всего найдено: " . $results->meta->totalCount . "\n";
    }

    // Пагинация
    if ($results->pagination) {
        echo "Страница: {$results->pagination->currentPage} из {$results->pagination->lastPage}\n";
    }
}
```

#### getStations() - Информация о станциях

[](#getstations---информация-о-станциях)

Получить список станций с возможностью поиска.

**Параметры:**

- `query` (string, опциональный) - Поисковый запрос для фильтрации станций

**Возвращает:** `array` - Массив станций

**Пример:**

```
// Поиск станций
$stations = $railwayService->getStations('Moscow');

foreach ($stations as $station) {
    echo "Название: {$station['name']}\n";
    echo "Код: {$station['code']}\n";
    echo "Город: {$station['city']}\n";
}

// Получить все станции
$allStations = $railwayService->getStations();
```

#### getTripDetails() - Детали рейса

[](#gettripdetails---детали-рейса)

Получить детальную информацию о конкретном рейсе.

**Параметры:**

- `tripId` (string, обязательный) - ID рейса

**Возвращает:** `array` - Детальная информация о рейсе

**Пример:**

```
$tripDetails = $railwayService->getTripDetails('trip_id_123');

echo "Маршрут: {$tripDetails['origin']} -> {$tripDetails['destination']}\n";
echo "Поезд: {$tripDetails['train']}\n";
echo "Вагоны: " . count($tripDetails['cars'] ?? []) . "\n";
foreach ($tripDetails['cars'] ?? [] as $car) {
    echo "  - Вагон {$car['number']}: {$car['type']}, мест свободно: {$car['seats_available']}\n";
}
```

### 🚌 Автобусные билеты (BusService)

[](#-автобусные-билеты-busservice)

#### search() - Поиск автобусных билетов

[](#search---поиск-автобусных-билетов)

**Параметры:** Аналогичны RailwayService::search()

**Возвращает:** `SearchResult` - Объект с результатами поиска

**Пример:**

```
$busService = $client->bus();

$results = $busService->search([
    'origin' => 'Moscow',
    'destination' => 'Kazan',
    'departure_date' => '2025-12-25',
    'adults' => 1,
]);
```

#### getStations() - Станции автобусов

[](#getstations---станции-автобусов)

```
$stations = $busService->getStations('Moscow');
```

#### getTripDetails() - Детали рейса

[](#gettripdetails---детали-рейса-1)

```
$tripDetails = $busService->getTripDetails('trip_id_123');
```

### 🚋 Электрички (CommuterService)

[](#-электрички-commuterservice)

#### search() - Поиск билетов на электрички

[](#search---поиск-билетов-на-электрички)

**Параметры:** Аналогичны RailwayService::search()

**Возвращает:** `SearchResult` - Объект с результатами поиска

**Пример:**

```
$commuterService = $client->commuter();

$results = $commuterService->search([
    'origin' => 'Moscow',
    'destination' => 'Zelenograd',
    'departure_date' => '2025-12-25',
]);
```

#### getStations() - Станции электричек

[](#getstations---станции-электричек)

```
$stations = $commuterService->getStations('Moscow');
```

#### getTripDetails() - Детали рейса

[](#gettripdetails---детали-рейса-2)

```
$tripDetails = $commuterService->getTripDetails('trip_id_123');
```

### 📊 Статистика (StatisticsService)

[](#-статистика-statisticsservice)

#### getBookings() - Статистика бронирований

[](#getbookings---статистика-бронирований)

Получить статистику бронирований через вашу партнерскую программу.

**Важно:** Этот метод возвращает статистику уже оформленных бронирований, но НЕ выполняет бронирование.

**Параметры:**

- `start_date` (string, опциональный) - Начальная дата периода в формате Y-m-d
- `end_date` (string, опциональный) - Конечная дата периода в формате Y-m-d
- `status` (string, опциональный) - Статус бронирования ('confirmed', 'cancelled' и т.д.)

**Возвращает:** `array` - Массив с информацией о бронированиях

**Пример:**

```
$statisticsService = $client->statistics();

// Статистика за период
$bookings = $statisticsService->getBookings([
    'start_date' => '2025-01-01',
    'end_date' => '2025-12-31',
    'status' => 'confirmed',
]);

foreach ($bookings as $booking) {
    echo "Бронирование #{$booking['id']}\n";
    echo "Дата: {$booking['date']}\n";
    echo "Сумма: {$booking['amount']} {$booking['currency']}\n";
    echo "Комиссия: {$booking['commission']} {$booking['currency']}\n";
    echo "Статус: {$booking['status']}\n";
}
```

#### getPartnerStats() - Статистика партнера

[](#getpartnerstats---статистика-партнера)

Получить общую статистику по партнерской программе.

**Параметры:**

- `params` (array, опциональный) - Дополнительные параметры запроса

**Возвращает:** `array` - Статистика партнера

**Пример:**

```
$partnerStats = $statisticsService->getPartnerStats();

echo "Всего бронирований: {$partnerStats['total_bookings']}\n";
echo "Общая сумма: {$partnerStats['total_amount']} {$partnerStats['currency']}\n";
echo "Комиссия: {$partnerStats['total_commission']} {$partnerStats['currency']}\n";
echo "Конверсия: {$partnerStats['conversion_rate']}%\n";
```

#### getBalance() - Баланс

[](#getbalance---баланс)

Получить текущий баланс в партнерской программе.

**Возвращает:** `array` - Информация о балансе

**Пример:**

```
$balance = $statisticsService->getBalance();

echo "Текущий баланс: {$balance['balance']} {$balance['currency']}\n";
echo "Доступно к выводу: {$balance['available']} {$balance['currency']}\n";
echo "В обработке: {$balance['pending']} {$balance['currency']}\n";
```

Расширенные возможности
-----------------------

[](#расширенные-возможности)

### Кэширование

[](#кэширование)

Пакет поддерживает кэширование через PSR-16 SimpleCache интерфейс для оптимизации производительности и уменьшения нагрузки на API.

```
use Psr\SimpleCache\CacheInterface;

// Laravel
use Illuminate\Support\Facades\Cache;

$client->setCache(Cache::store('redis')); // или app('cache.store')

// Теперь все запросы будут кэшироваться автоматически
// Время жизни кэша настраивается для каждого сервиса
```

**Рекомендации Travelpayouts по времени жизни кэша:**

- API данных (авиабилеты): **24 часа**
- Станции, города, аэропорты, авиакомпании: **7-30 дней**
- Статистика: **5-15 минут**
- Поиск ж/д/автобусов: **1 час**
- Популярные направления: **7 дней**

**Настройка времени жизни кэша для конкретного сервиса:**

```
$flightService = $client->flight();
$flightService->setDefaultTtl(86400); // 24 часа
```

### Логирование

[](#логирование)

Поддержка PSR-3 логирования для отслеживания запросов и ошибок:

```
use Psr\Log\LoggerInterface;

// Laravel
$logger = app('log');

$client->setLogger($logger);

// Все запросы и ошибки будут логироваться
// Уровни логирования:
// - INFO: Успешные запросы
// - WARNING: Повторы запросов
// - ERROR: Ошибки API
```

**Пример настройки логирования в Laravel:**

```
// config/logging.php
'channels' => [
    'travelpayouts' => [
        'driver' => 'daily',
        'path' => storage_path('logs/travelpayouts.log'),
        'level' => 'debug',
    ],
],

// Использование
$client->setLogger(Log::channel('travelpayouts'));
```

### Retry механизм

[](#retry-механизм)

Автоматические повторы запросов при временных ошибках (timeout, 5xx ошибки):

```
$client = new TravelpayoutsClient([
    'token' => 'your_token',
    'retries' => 3,        // Количество попыток
    'retry_delay' => 1000, // Задержка между попытками (мс)
    'enable_retry' => true, // Включить/выключить retry механизм
]);
```

**Настройка retry в Laravel конфигурации:**

```
// config/travelpayouts.php
return [
    'retries' => env('TRAVELPAYOUTS_RETRIES', 3),
    'retry_delay' => env('TRAVELPAYOUTS_RETRY_DELAY', 1000),
];
```

Структура данных
----------------

[](#структура-данных)

### SearchResult

[](#searchresult)

Объект, возвращаемый методами поиска для ж/д, автобусов и электричек:

```
use Letoceiling\Travelpayouts\DTOs\SearchResult;

$results = $railwayService->search($params);

// Свойства:
$results->trips;        // array - Массив найденных рейсов
$results->meta;         // SearchMeta|null - Метаданные поиска
$results->pagination;   // Pagination|null - Информация о пагинации

// Методы:
$results->getCount();     // int - Количество найденных рейсов
$results->isEmpty();      // bool - Проверка на пустой результат
$results->isNotEmpty();   // bool - Проверка на наличие результатов
$results->toArray();      // array - Преобразование в массив
```

### SearchMeta

[](#searchmeta)

Метаданные о поисковом запросе:

```
$meta = $results->meta;

$meta->totalCount;      // int|null - Всего найдено рейсов
$meta->filteredCount;   // int|null - Количество после фильтрации
$meta->filters;         // array|null - Примененные фильтры
$meta->additional;      // array|null - Дополнительная информация
```

### Pagination

[](#pagination)

Информация о пагинации:

```
$pagination = $results->pagination;

$pagination->currentPage; // int - Текущая страница
$pagination->perPage;     // int - Элементов на странице
$pagination->total;       // int - Всего элементов
$pagination->lastPage;    // int - Последняя страница

// Методы:
$pagination->hasNextPage();     // bool - Есть следующая страница
$pagination->hasPreviousPage(); // bool - Есть предыдущая страница
$pagination->toArray();         // array - Преобразование в массив
```

Обработка ошибок
----------------

[](#обработка-ошибок)

Пакет использует исключения для обработки различных типов ошибок:

```
use Letoceiling\Travelpayouts\Exceptions\ValidationException;
use Letoceiling\Travelpayouts\Exceptions\ApiException;
use Letoceiling\Travelpayouts\Exceptions\InvalidTokenException;
use Letoceiling\Travelpayouts\Exceptions\TravelpayoutsException;

try {
    $results = $railwayService->search($params);
} catch (ValidationException $e) {
    // Ошибки валидации входных данных
    $errors = $e->getErrors();
    foreach ($errors as $field => $message) {
        echo "{$field}: {$message}\n";
    }
} catch (InvalidTokenException $e) {
    // Неверный или отсутствующий API токен
    echo "Invalid API token: " . $e->getMessage() . "\n";
    // Проверьте токен в конфигурации
} catch (ApiException $e) {
    // Ошибки API (4xx, 5xx)
    echo "API Error: " . $e->getMessage() . "\n";
    $response = $e->getResponse(); // Получить полный ответ
    $statusCode = $e->getCode();   // HTTP статус код

    // Обработка специфичных ошибок
    if ($statusCode === 429) {
        echo "Превышен лимит запросов. Попробуйте позже.\n";
    } elseif ($statusCode >= 500) {
        echo "Ошибка сервера Travelpayouts. Попробуйте позже.\n";
    }
} catch (TravelpayoutsException $e) {
    // Общие ошибки пакета
    echo "Error: " . $e->getMessage() . "\n";
} catch (\Exception $e) {
    // Неожиданные ошибки
    echo "Unexpected error: " . $e->getMessage() . "\n";
}
```

Валидация
---------

[](#валидация)

Все запросы автоматически валидируются перед отправкой к API:

### Ж/д, Автобусы, Электрички

[](#жд-автобусы-электрички)

- `origin` - обязательное, минимум 2 символа
- `destination` - обязательное, минимум 2 символа
- `departure_date` - обязательное, формат Y-m-d, не раньше сегодня
- `return_date` - опциональное, должно быть позже `departure_date`
- `adults` - опциональное, по умолчанию 1, минимум 1, максимум 10
- `children` - опциональное, минимум 0, максимум 10
- `infants` - опциональное, минимум 0, максимум 2
- `class` - опциональное, должно быть одним из: 'first', 'second', 'third', 'fourth'

### Авиабилеты

[](#авиабилеты)

- `origin` - обязательное, IATA код города (3 символа, буквы)
- `destination` - обязательное, IATA код города (3 символа, буквы)
- `depart_date` / `departure_date` - опциональное, формат YYYY-MM или YYYY-MM-DD
- `return_date` - опциональное, формат YYYY-MM или YYYY-MM-DD
- `market` - опциональное, по умолчанию 'ru', обычно 'ru', 'en', 'tr' и т.д.
- `currency` - опциональное, валюта цен (USD, EUR, RUB и т.д.)

Интеграция с Laravel
--------------------

[](#интеграция-с-laravel)

### Service Provider

[](#service-provider)

Пакет автоматически регистрирует Service Provider в Laravel. Клиент доступен через dependency injection:

```
use Letoceiling\Travelpayouts\TravelpayoutsClient;

class FlightController extends Controller
{
    public function __construct(
        private TravelpayoutsClient $travelpayouts
    ) {}

    public function search()
    {
        $results = $this->travelpayouts->flight()->getDirectFlights([
            'origin' => 'MOW',
            'destination' => 'LED',
        ]);

        return response()->json($results);
    }
}
```

### Facade

[](#facade)

Используйте Facade для удобного доступа:

```
use Letoceiling\Travelpayouts\Facades\Travelpayouts;

Route::get('/flights', function () {
    $flights = Travelpayouts::flight()->getDirectFlights([
        'origin' => 'MOW',
        'destination' => 'LED',
    ]);

    return view('flights', ['flights' => $flights]);
});
```

### Конфигурация

[](#конфигурация)

Опубликуйте конфигурационный файл:

```
php artisan vendor:publish --provider="Letoceiling\Travelpayouts\TravelpayoutsServiceProvider"
```

Файл `config/travelpayouts.php`:

```
return [
    'token' => env('TRAVELPAYOUTS_TOKEN'),
    'marker' => env('TRAVELPAYOUTS_MARKER'),
    'base_uri' => env('TRAVELPAYOUTS_BASE_URI', 'https://api.travelpayouts.com'),
    'timeout' => env('TRAVELPAYOUTS_TIMEOUT', 30),
    'retries' => env('TRAVELPAYOUTS_RETRIES', 3),
    'retry_delay' => env('TRAVELPAYOUTS_RETRY_DELAY', 1000),
];
```

### Кэширование в Laravel

[](#кэширование-в-laravel)

```
use Illuminate\Support\Facades\Cache;
use Letoceiling\Travelpayouts\Facades\Travelpayouts;

// Настройка кэширования
Travelpayouts::setCache(Cache::store('redis'));

// Использование с кэшированием
$flights = Travelpayouts::flight()->getDirectFlights([
    'origin' => 'MOW',
    'destination' => 'LED',
]);
```

### Логирование в Laravel

[](#логирование-в-laravel)

```
use Illuminate\Support\Facades\Log;
use Letoceiling\Travelpayouts\Facades\Travelpayouts;

Travelpayouts::setLogger(Log::channel('travelpayouts'));
```

### Service Container Binding

[](#service-container-binding)

Вы можете переопределить клиент в сервис-провайдере:

```
// app/Providers/AppServiceProvider.php
use Letoceiling\Travelpayouts\TravelpayoutsClient;

public function register()
{
    $this->app->singleton(TravelpayoutsClient::class, function ($app) {
        $config = $app['config']['travelpayouts'];

        $client = new TravelpayoutsClient([
            'token' => $config['token'],
            'marker' => $config['marker'],
            'base_uri' => $config['base_uri'],
            'timeout' => $config['timeout'],
        ]);

        // Настройка кэширования
        if ($config['cache']['enabled'] ?? false) {
            $client->setCache($app['cache.store']);
        }

        // Настройка логирования
        $client->setLogger($app['log']);

        return $client;
    });
}
```

Лучшие практики
---------------

[](#лучшие-практики)

### 1. Всегда используйте кэширование

[](#1-всегда-используйте-кэширование)

```
// ✅ Хорошо
$client->setCache($cache);
$flights = $client->flight()->getDirectFlights($params);

// ❌ Плохо - каждый раз запрос к API
$flights = $client->flight()->getDirectFlights($params);
```

### 2. Обрабатывайте ошибки

[](#2-обрабатывайте-ошибки)

```
// ✅ Хорошо
try {
    $results = $railwayService->search($params);
} catch (ValidationException $e) {
    return response()->json(['errors' => $e->getErrors()], 422);
} catch (ApiException $e) {
    Log::error('Travelpayouts API error', ['exception' => $e]);
    return response()->json(['error' => 'Service unavailable'], 503);
}

// ❌ Плохо - игнорирование ошибок
$results = $railwayService->search($params);
```

### 3. Используйте правильные форматы дат

[](#3-используйте-правильные-форматы-дат)

```
// ✅ Хорошо
'departure_date' => '2025-12-25', // Y-m-d для ж/д
'depart_date' => '2025-12',       // YYYY-MM для авиа (месяц)
'depart_date' => '2025-12-25',    // YYYY-MM-DD для авиа (дата)

// ❌ Плохо
'departure_date' => '25.12.2025', // Неправильный формат
```

### 4. Валидируйте входные данные на стороне приложения

[](#4-валидируйте-входные-данные-на-стороне-приложения)

```
// ✅ Хорошо
$request->validate([
    'origin' => 'required|string|min:2',
    'destination' => 'required|string|min:2',
    'departure_date' => 'required|date|after:today',
]);

// Пакет также валидирует данные, но лучше проверить заранее
```

### 5. Логируйте важные операции

[](#5-логируйте-важные-операции)

```
// ✅ Хорошо
Log::info('Flight search', [
    'origin' => $params['origin'],
    'destination' => $params['destination'],
    'date' => $params['depart_date'],
]);
```

### 6. Используйте правильные IATA коды

[](#6-используйте-правильные-iata-коды)

```
// ✅ Хорошо - используйте справочники
$cities = $flightService->getCities();
if (!isset($cities[$origin])) {
    throw new InvalidArgumentException("Invalid origin city code: {$origin}");
}

// ❌ Плохо - хардкод без проверки
$flights = $flightService->getDirectFlights(['origin' => 'XXX']);
```

Примеры использования
---------------------

[](#примеры-использования)

### Поиск дешевых авиабилетов

[](#поиск-дешевых-авиабилетов)

```
$flightService = $client->flight();

// Найти самые дешевые билеты из Москвы в Санкт-Петербург на декабрь
$calendar = $flightService->getLowPriceCalendar([
    'origin' => 'MOW',
    'destination' => 'LED',
    'depart_date' => '2025-12',
    'currency' => 'RUB',
]);

// Найти самый дешевый день
$minPrice = PHP_INT_MAX;
$bestDate = null;

foreach ($calendar['data'] ?? [] as $date => $flight) {
    if (isset($flight['price']) && $flight['price'] < $minPrice) {
        $minPrice = $flight['price'];
        $bestDate = $date;
    }
}

if ($bestDate) {
    echo "Самый дешевый билет на {$bestDate}: {$minPrice} RUB\n";
} else {
    echo "Билеты не найдены\n";
}
```

### Поиск популярных направлений

[](#поиск-популярных-направлений)

```
$directions = $flightService->getPopularDirections('MOW', 'USD');

// Отсортировать по цене
usort($directions, fn($a, $b) => ($a['price'] ?? 0)  ($b['price'] ?? 0));

// Показать топ-10 самых дешевых направлений
$top10 = array_slice($directions, 0, 10);
foreach ($top10 as $direction) {
    echo "{$direction['destination']}: {$direction['price']} USD\n";
}
```

### Комплексный поиск ж/д билетов

[](#комплексный-поиск-жд-билетов)

```
$railwayService = $client->railway();

try {
    // Поиск билетов на поезд
    $results = $railwayService->search([
        'origin' => 'Moscow',
        'destination' => 'Saint Petersburg',
        'departure_date' => '2025-12-25',
        'return_date' => '2025-12-30',
        'adults' => 2,
        'children' => 1,
        'class' => 'second',
    ]);

    if ($results->isEmpty()) {
        echo "Билеты не найдены\n";
        return;
    }

    echo "Найдено рейсов: " . $results->getCount() . "\n";

    // Показать информацию о каждом рейсе
    foreach ($results->trips as $index => $trip) {
        echo "\n--- Рейс #" . ($index + 1) . " ---\n";
        echo "Отправление: {$trip['origin']}\n";
        echo "Прибытие: {$trip['destination']}\n";
        echo "Дата отправления: {$trip['departureDate']}\n";
        echo "Время отправления: {$trip['departureTime']}\n";

        if (isset($trip['arrivalDate'])) {
            echo "Дата прибытия: {$trip['arrivalDate']}\n";
            echo "Время прибытия: {$trip['arrivalTime']}\n";
        }

        echo "Цена: {$trip['price']} {$trip['currency']}\n";

        if (isset($trip['class'])) {
            echo "Класс: {$trip['class']}\n";
        }
    }

    // Метаданные
    if ($results->meta) {
        echo "\nВсего найдено: " . ($results->meta->totalCount ?? 'N/A') . "\n";
    }

    // Пагинация
    if ($results->pagination && $results->pagination->hasNextPage()) {
        echo "Есть еще результаты на следующих страницах\n";
    }

} catch (ValidationException $e) {
    echo "Ошибки валидации:\n";
    foreach ($e->getErrors() as $field => $message) {
        echo "  {$field}: {$message}\n";
    }
} catch (ApiException $e) {
    echo "Ошибка API: " . $e->getMessage() . "\n";
}
```

### Работа со статистикой

[](#работа-со-статистикой)

```
$statisticsService = $client->statistics();

try {
    // Получить статистику за текущий месяц
    $bookings = $statisticsService->getBookings([
        'start_date' => date('Y-m-01'),
        'end_date' => date('Y-m-t'),
    ]);

    // Получить баланс
    $balance = $statisticsService->getBalance();

    echo "Текущий баланс: {$balance['balance']} {$balance['currency']}\n";
    echo "Доступно к выводу: {$balance['available']} {$balance['currency']}\n";
    echo "В обработке: {$balance['pending']} {$balance['currency']}\n";
    echo "Бронирований за месяц: " . count($bookings) . "\n";

    // Подсчет общей суммы комиссий
    $totalCommission = 0;
    foreach ($bookings as $booking) {
        if (isset($booking['commission'])) {
            $totalCommission += $booking['commission'];
        }
    }
    echo "Общая комиссия за месяц: {$totalCommission} {$balance['currency']}\n";

} catch (ApiException $e) {
    echo "Ошибка при получении статистики: " . $e->getMessage() . "\n";
}
```

### Использование с кэшированием

[](#использование-с-кэшированием)

```
use Psr\SimpleCache\CacheInterface;

// Настройка кэширования
$client->setCache($cache);

// Первый запрос - идет к API
$flights1 = $client->flight()->getDirectFlights([
    'origin' => 'MOW',
    'destination' => 'LED',
]);

// Второй запрос - из кэша (если TTL не истек)
$flights2 = $client->flight()->getDirectFlights([
    'origin' => 'MOW',
    'destination' => 'LED',
]);
```

Тестирование
------------

[](#тестирование)

```
# Запустить все тесты
composer test

# Статический анализ кода
composer analyse

# Проверка стиля кода
composer check-style

# Автоисправление стиля
composer fix
```

Troubleshooting
---------------

[](#troubleshooting)

### Ошибка "Token is required"

[](#ошибка-token-is-required)

**Проблема:** Не указан API токен

**Решение:**

```
// Проверьте конфигурацию
$client = new TravelpayoutsClient([
    'token' => 'your_api_token', // Обязательно
]);
```

### Ошибка "Invalid API token"

[](#ошибка-invalid-api-token)

**Проблема:** Указан неверный токен

**Решение:**

- Проверьте токен в личном кабинете Travelpayouts
- Убедитесь, что токен скопирован полностью
- Проверьте, что токен не истек

### Пустые результаты поиска

[](#пустые-результаты-поиска)

**Проблема:** Поиск не возвращает результатов

**Возможные причины:**

- Нет рейсов на указанные даты
- Неправильно указаны города/станции
- Дата в прошлом
- Неправильный формат даты

**Решение:**

```
// Проверьте параметры
$results = $railwayService->search([
    'origin' => 'Moscow',           // Правильное название
    'destination' => 'Saint Petersburg',
    'departure_date' => '2025-12-25', // Дата в будущем, формат Y-m-d
]);

if ($results->isEmpty()) {
    echo "Рейсы не найдены на указанные даты\n";
    // Попробуйте другую дату или проверьте наличие рейсов
}
```

### Медленная работа API

[](#медленная-работа-api)

**Проблема:** Запросы выполняются медленно

**Решение:**

1. Включите кэширование
2. Увеличьте timeout
3. Используйте retry механизм

```
$client = new TravelpayoutsClient([
    'token' => 'your_token',
    'timeout' => 60, // Увеличить таймаут
]);

$client->setCache($cache); // Включить кэширование
```

### Ошибка 429 (Too Many Requests)

[](#ошибка-429-too-many-requests)

**Проблема:** Превышен лимит запросов

**Решение:**

- Включите кэширование для уменьшения количества запросов
- Увеличьте задержку между запросами
- Используйте retry механизм с экспоненциальной задержкой

```
$client = new TravelpayoutsClient([
    'token' => 'your_token',
    'retries' => 3,
    'retry_delay' => 2000, // Увеличить задержку
]);
```

FAQ
---

[](#faq)

### Можно ли оформлять билеты через пакет?

[](#можно-ли-оформлять-билеты-через-пакет)

**Нет.** Пакет предоставляет только функциональность поиска. Оформление билетов происходит на сайтах партнеров Travelpayouts. Пользователи перенаправляются на сайт партнера для завершения бронирования.

### Есть ли тестовая среда?

[](#есть-ли-тестовая-среда)

**Нет.** Travelpayouts не предоставляет отдельной тестовой среды. После регистрации вы получаете доступ к реальному API.

### Как получить IATA коды городов?

[](#как-получить-iata-коды-городов)

Используйте метод `getCities()`:

```
$cities = $flightService->getCities();
foreach ($cities as $code => $city) {
    echo "{$code}: {$city['name']}\n";
}
```

### Как долго кэшировать данные?

[](#как-долго-кэшировать-данные)

Travelpayouts рекомендует:

- API данных (авиабилеты): 24 часа
- Справочники (города, аэропорты): 7-30 дней
- Статистика: 5-15 минут

### Поддерживается ли API поиска в реальном времени?

[](#поддерживается-ли-api-поиска-в-реальном-времени)

Текущая версия пакета использует API данных (кэшированные данные). API поиска в реальном времени требует отдельной заявки и соответствия требованиям (минимум 50,000 пользователей в месяц).

### Как отслеживать бронирования?

[](#как-отслеживать-бронирования)

Используйте метод `getBookings()` в StatisticsService для получения статистики бронирований через вашу партнерскую программу.

Дополнительная документация
---------------------------

[](#дополнительная-документация)

- [Возможности API и ограничения](API_CAPABILITIES.md) - Что поддерживается и что нет
- [Официальная документация Travelpayouts](https://support.travelpayouts.com/hc/ru/sections/360004490151-API-%D0%BE%D1%82-Travelpayouts)
- [API авиабилетов (Aviasales)](https://support.travelpayouts.com/hc/ru/sections/201008338)
- [API данных Aviasales](https://support.travelpayouts.com/hc/ru/articles/203956163-API-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-Aviasales-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%B0%D1%80%D1%82%D0%BD%D1%91%D1%80%D0%BE%D0%B2)
- [CHANGELOG](CHANGELOG.md)
- [CONTRIBUTING](CONTRIBUTING.md)

Важные замечания
----------------

[](#важные-замечания)

### ⚠️ Ограничения пакета

[](#️-ограничения-пакета)

**Пакет НЕ поддерживает:**

- ❌ Оформление билетов
- ❌ Покупку билетов
- ❌ Оплату билетов
- ❌ Тестовую среду (sandbox)

**Что поддерживается:**

- ✅ Поиск билетов (авиа, ж/д, автобусы, электрички)
- ✅ Сравнение цен
- ✅ Получение справочной информации
- ✅ Статистика бронирований (после оформления пользователями)

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

Подробнее см. [API\_CAPABILITIES.md](API_CAPABILITIES.md)

### API данных vs API поиска

[](#api-данных-vs-api-поиска)

**API данных (используется в пакете):**

- Доступно всем партнёрам после регистрации
- Данные кэшируются на стороне Travelpayouts (2-7 дней)
- Подходит для информирования пользователей и контентных страниц
- Рекомендуется кэшировать на 24 часа

**API поиска в реальном времени:**

- Требует одобрения заявки
- Минимум 50,000 пользователей в месяц
- Актуальные данные в реальном времени
- Подходит для полноценного поиска билетов

### IATA коды

[](#iata-коды)

Для работы с API авиабилетов используются IATA коды городов (например, MOW для Москвы, LED для Санкт-Петербурга). Список кодов можно получить через метод `getCities()`.

### Кэширование

[](#кэширование-1)

Travelpayouts рекомендует кэшировать результаты API данных на своей стороне минимум на 24 часа для уменьшения нагрузки на серверы и увеличения скорости работы приложения.

Лицензия
--------

[](#лицензия)

MIT License

Поддержка
---------

[](#поддержка)

Если у вас возникли вопросы или проблемы:

- Создайте [Issue](https://github.com/letoceiling-coder/travelpayouts/issues) в репозитории
- Обратитесь к [официальной документации Travelpayouts](https://support.travelpayouts.com)

Авторы
------

[](#авторы)

- **Letoceiling Coder** - *Разработка* - [GitHub](https://github.com/letoceiling-coder)

Благодарности
-------------

[](#благодарности)

- Travelpayouts за предоставление API
- Сообществу за обратную связь и улучшения

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance74

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity44

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

139d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/bba6a99134d905eaed0dcccbc768321a5d14edc29aab6dedc45cac31beb0d36e?d=identicon)[letoceiling-coder](/maintainers/letoceiling-coder)

---

Top Contributors

[![Postads](https://avatars.githubusercontent.com/u/25578332?v=4)](https://github.com/Postads "Postads (3 commits)")

---

Tags

apibusticketstravelairlineflightstrainrailwaytravelpayoutsaviasales

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/letoceiling-travelpayouts/health.svg)

```
[![Health](https://phpackages.com/badges/letoceiling-travelpayouts/health.svg)](https://phpackages.com/packages/letoceiling-travelpayouts)
```

###  Alternatives

[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[ardakilic/mutlucell

Mutlucell SMS API wrapper for sending sms text messages for Laravel

457.3k](/packages/ardakilic-mutlucell)[dariusiii/tmdb-laravel

Laravel Package for TMDB ( The Movie Database ) API. Provides easy access to the wtfzdotnet/php-tmdb-api library.

1821.1k](/packages/dariusiii-tmdb-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
