НовоеREST API, описанный в файле OpenAPI 3.1
eSIM API для турагентств, OTA и реселлеров
Продавайте туристические eSIM через один REST API. Получайте пакеты данных по странам с ценами в валюте вашего агентства, заказывайте eSIM для путешественника, передавайте ему QR-код, следите за использованием и пополняйте. Один базовый URL обслуживает sandbox и Live. Начните с бесплатного ключа sandbox: ключи Live заработают после одобрения вашего агентства.
Документация написана на английском языке.
- Базовый URL
https://api.fx-port.com/api/v1- Аутентификация
Authorization: Bearer fxp_test_...- Префиксы ключей
fxp_test_ / fxp_live_- Эндпоинты
- 12
- Страны с пакетами
- 190+
- Языки примеров кода
- 9
eSIM API: вызов за вызовом
Проследите продажу eSIM шаг за шагом: как запрос собирается, отправляется и получает ответ. Сценарии охватывают продажу eSIM, поддержание подключения путешественника, проверку устройств и бронирований, а также сбои, которые стоит обработать. Запросы и ответы взяты из примеров документации, эта страница никогда не вызывает API.
3 запроса: Список пакетов, Заказ eSIM, Данные установки.
Демонстрационная сессия: тела запросов и ответов взяты из примеров документации, даты сдвинуты вперёд, чтобы оставаться в будущем, а время показано для иллюстрации. Эта страница не отправляет запросов.
Найти пакет, заказать его, прочитать данные установки
Начните с пакетов одной страны, закажите один для путешественника, затем прочитайте данные установки заказа. Sandbox создаёт тестовую eSIM с фиктивным кодом активации и ничего не списывает, а консоль показывает сокращённую копию ответа каталога.
Список пакетов
Вызов каталога принимает
countryиtypeи возвращает подходящие пакеты с ценами в валюте вашего агентства. Сохранитеpackage_idтого пакета, который выбрал путешественник.Запрос GET /esims/packages curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 180 ms · 3.6 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 6000 ratelimit-policy: 6000;w=60 { "environment": "sandbox", "success": true, "endpoint": "/packages", "data": [ { "id": "france-in-7days-1gb", "package_id": "france-in-7days-1gb", "type": "sim", "price": 402.5, "base_price": 402.5, "amount": 1024, "day": 7, "is_unlimited": false, "title": "1 GB - 7 days", "is_fair_usage_policy": false, "fair_usage_policy": null, "data": "1 GB", "voice": null, "text": null, "country_name": "France", "country_code": "FR", "country_slug": "france", // ... "operator_name": "KPN France Data only", "operator_id": 1704, // ... "operator_type": "local", "operator_is_prepaid": false, "operator_esim_type": "Prepaid", "operator_warning": null, "operator_apn_type": "automatic", "operator_is_roaming": true, // ... "operator_plan_type": "data", "operator_activation_policy": "first-usage", "operator_is_kyc_verify": false, "operator_rechargeability": true, // ... // ... 1 more // ... "is_regional": false, // ... 10 more }, // ... ], "meta": { "total_packages": 12, "filters_applied": { // ... 2 more }, "locale": "en", "agency_currency": "DZD", "currency": "DZD", "supplier_currency": "USD", "exchange_rate": 250, "commission_percentage": "12 %", "commission_rate": 12 } }Пример сокращён для показа
- PASS Код статуса: 200
- PASS $.success равно true
- PASS $.data[0].package_id существует
- PASS $.data[0].balance_debit_amount существует
Заказ eSIM
Для создания заказа нужны
package_id, адрес электронной почты и номер телефона путешественника. Сохранитеbooking_idиdata.iccidиз ответа. В sandboxbalanceDebited,transactionCreatedиpayoutCreatedравныfalse.Запрос POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'Ответ 200 OK · 900 ms · 1.5 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 1200 ratelimit-policy: 1200;w=60 x-fx-limit-class: booking { "environment": "sandbox", "success": true, "data": { "order": { "code": "20261101-106852", "order_id": "20261101-106852", "package_id": "france-in-7days-1gb", "type": "sim", "description": "Order for John Smith", "esim_type": "local", "created_at": "2026-11-09 15:23:22", "package": "KPN France Data only-1 GB - 7 days", "data": "1 GB", "validity": 7, "price": 468.84, "currency": "DZD", "total_price": 468.84, "retail_price": 468.84, "agency_currency": "DZD", "supplier_currency": "USD", "exchange_rate": 250, "voice": null, "text": null, "coverage": "" }, "sim": { "iccid": "8900000540463077957", "created_at": "2026-11-09 15:23:22", "lpa": "lpa.airalo.com", "imsis": null, "qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", // ... "direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "apn_type": "automatic", "apn_value": "N/A", "apn": { // ... 2 more }, "is_roaming": true, "confirmation_code": null, "msisdn": null, "sharing": { "access_code": 8803, "link": "https://esims.cloud/v8hy7-usgkq6wg" } }, "iccid": "8900000540463077957" }, "booking_id": "FX-1793546602916", "message": "eSIM order placed successfully", "balanceDebited": false, "balance_debited": false, "transactionCreated": false, "transaction_created": false, "payoutCreated": false, "payout_created": false }Пример сокращён для показа
- PASS Код статуса: 200
- PASS $.environment равно sandbox
- PASS $.balance_debited равно false
- PASS $.data.iccid существует
Данные установки
Вызов данных установки принимает
booking_idи возвращает QR-код, данные активации, ссылки для установки и шаги установки заказа. Показывайте их только путешественнику, которому принадлежит eSIM.Запрос GET /esims/bookings/{booking_id}/setup-instructions curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 210 ms · 1.8 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 6000 ratelimit-policy: 6000;w=60 { "environment": "sandbox", "success": true, "data": { "code": "20261101-106852", "order_id": "20261101-106852", "currency": "DZD", "package_id": "france-in-7days-1gb", "quantity": 1, "type": "sim", "description": "Order for John Smith", "esim_type": "local", "validity": 7, "package": "KPN France Data only-1 GB - 7 days", "data": "1 GB", "price": 468.84, "created_at": "2026-11-09 15:23:22", // ... "installation_guides": { "en": "https://www.airalo.com/help/getting-started-with-airalo" }, "text": null, "voice": null, "sims": [ { "created_at": "2026-11-09 15:23:22", "iccid": "8900000540463077957", "lpa": "lpa.airalo.com", "imsis": null, "qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", // ... "apn_type": "automatic", "apn_value": "N/A", "is_roaming": true, "confirmation_code": null, "apn": { "ios": { "apn_type": "automatic", "apn_value": "N/A" }, "android": { "apn_type": "automatic", "apn_value": "N/A" } }, "msisdn": null, "direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "direct_android_installation_url": "https://esimsetup.android.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "sharing": { "access_code": 8803, "link": "https://esims.cloud/v8hy7-usgkq6wg" } } ], "total_price": 468.84, "retail_price": 468.84, "agency_currency": "DZD" } }Пример сокращён для показа
- PASS Код статуса: 200
- PASS $.data.package_id равно france-in-7days-1gb
- PASS $.data.sims[0].iccid существует
Описание GET /esims/bookings/{booking_id}/setup-instructions в документации
Прочитать использование и пополнить
Когда у путешественника есть eSIM, прочитайте остаток данных, узнайте, какие пакеты можно добавить именно к этой eSIM, и создайте пополнение. Использование кэшируется, поэтому значение может отставать на несколько минут. История пополнений есть в боковой панели и в транскрипте.
Чтение использования
Вызов использования принимает ICCID заказа и возвращает
remainingиtotalв мегабайтах,statusи срок действия. Ответ берётся из кэша, аforce=trueснова спрашивает поставщика.Запрос GET /esims/usage/{iccid} curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 160 ms · 261 B 200 OK { "environment": "sandbox", "success": true, "data": { "data": { "remaining": 1024, "total": 1024, "expired_at": "2026-11-16 15:23:29", "is_unlimited": false, "status": "ACTIVE", "remaining_voice": 0, "remaining_text": 0, "total_voice": 0, "total_text": 0 }, "meta": { "message": "success" } } }- PASS Код статуса: 200
- PASS $.data.data.status равно ACTIVE
- PASS $.data.data.remaining существует
Пакеты пополнения
Этот вызов возвращает пакеты, которые сегодня можно добавить к данной eSIM. Пустой список значит, что пополнить eSIM сейчас нельзя. Берите
package_idпополнения из этого списка, а не из исходного заказа.Запрос GET /esims/topup-packages/{iccid} curl https://api.fx-port.com/api/v1/esims/topup-packages/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 240 ms · 1.1 KB 200 OK { "environment": "sandbox", "success": true, "data": { "data": [ { "id": "france-in-7days-1gb-topup", "package_id": "france-in-7days-1gb-topup", "type": "topup", "price": 468.84, "amount": 1024, "day": 7, "is_unlimited": false, "title": "1 GB - 7 days", "data": "1 GB", "short_info": null, // ... 12 more }, { // ... 22 more } ] } }Пример сокращён для показа
- PASS Код статуса: 200
- PASS $.data.data: 2 элемента
- PASS $.data.data[0].type равно topup
Создание пополнения
Для создания пополнения нужны
package_idиз этого списка и ICCID. В Live баланс списывается только после того, как поставщик принял пополнение. В sandboxbalanceв ответе равен нулю, и ничего не списывается.Запрос POST /esims/topups curl https://api.fx-port.com/api/v1/esims/topups \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb-topup", "iccid": "8900000540463077957", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123" }'Ответ 200 OK · 900 ms · 682 B 200 OK { "environment": "sandbox", "success": true, "data": { "topup": { "code": "20261101-106853", "order_id": "20261101-106853", "package_id": "france-in-7days-1gb-topup", // ... 10 more }, "iccid": "8900000540463077957", "balance": { // ... 3 more } }, "booking_id": "FX-1793546625391", "message": "eSIM topup completed successfully", "balanceDebited": false, "balance_debited": false, "transactionCreated": false, "transaction_created": false, "payoutCreated": false, "payout_created": false }- PASS Код статуса: 200
- PASS $.environment равно sandbox
- PASS $.balance_debited равно false
- PASS $.data.balance.current равно 0
История пополнений
История пополнений показывает пополнения одной eSIM, сначала новые. В списке бронирований пополнений нет, поэтому искать их нужно здесь.
Запрос GET /esims/bookings/{iccid}/topup-history curl https://api.fx-port.com/api/v1/esims/bookings/8900000540463077957/topup-history \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 130 ms · 615 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "id": "bd6ff7d7-392f-4d56-8dea-4f0f3dff0af9", "booking_id": "FX-1793546625391", "order_id": "20261101-106853", "status": "confirmed", "currency": "DZD", "total_price": 468.84, "agency_commission": 50.24, "type": "topup", "package_name": "1 GB - 7 days", "iccid": "8900000540463077957", "customer_email": "[email protected]", "customer_first_name": "John", "customer_last_name": "Smith", "customer_phone": "+15555550123", "provider_name": "Airalo", // ... 4 more } ] }- PASS Код статуса: 200
- PASS $.data[0].type равно topup
Описание GET /esims/bookings/{iccid}/topup-history в документации
Проверить устройство, затем прочитать бронирования
До продажи проверьте, что телефон путешественника поддерживает eSIM. После продажи прочитайте свои бронирования и убедитесь, что идентификатор бронирования принадлежит вам. Массовое чтение использования есть в боковой панели.
Список устройств
Вызов совместимых устройств возвращает известные устройства с поддержкой eSIM, с полями
brand,modelиos. Найдите телефон путешественника до продажи.Запрос GET /esims/compatible-devices curl https://api.fx-port.com/api/v1/esims/compatible-devices \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 120 ms · 283 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "model": "T803D", "os": "android", "brand": "Alcatel", "name": "V3 Ultra" }, { "model": "iPhone15,2", "os": "ios", "brand": "Apple", "name": "iPhone 14 Pro" } ], "meta": { "total_devices": 631, "cached_at": "2026-11-09T15:07:43.957236", "cache_age_days": 0.01 } }- PASS Код статуса: 200
- PASS $.success равно true
- PASS $.data[0].model существует
Список бронирований
Список бронирований возвращает заказы eSIM вашего агентства, сначала новые. Этот запрос просит одно бронирование через
limit, аpaginationпоказывает, сколько заказов подошло и есть ли следующая страница.Запрос GET /esims/bookings curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 150 ms · 714 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "id": "639417b4-b103-4ece-bd5d-850315322278", "booking_id": "FX-1793546602916", "order_id": "20261101-106852", "status": "confirmed", "currency": "DZD", // ... 4 more "iccid": "8900000540463077957", // ... 9 more } ], "pagination": { "total": 61, "page": 1, "limit": 1, "pages": 61, "total_pages": 61, "has_more": true } }- PASS Код статуса: 200
- PASS $.data: 1 элемент
- PASS $.pagination.has_more равно true
Проверка владельца
Проверка владельца отвечает
is_ownerсо значением true, когда бронирование принадлежит вашему агентству. Бронирование другого агентства и несуществующее получают одинаковый ответ, поэтому по этому вызову нельзя перебирать идентификаторы.Запрос GET /esims/bookings/{booking_id}/verify curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/verify \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 90 ms · 167 B 200 OK { "environment": "sandbox", "isOwner": true, "is_owner": true, "userAgencyId": "0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d", "bookingAgencyId": "0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d" }- PASS Код статуса: 200
- PASS $.is_owner равно true
Описание GET /esims/bookings/{booking_id}/verify в документации
Массовое чтение
Один вызов читает использование нескольких eSIM из списка
iccidsи возвращает запись на каждый ICCID с собственнымstatus. Всегда передавайтеiccids.Запрос GET /esims/usage/bulk curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK · 220 ms · 321 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "iccid": "8900000540463077957", "data": { "data": { "remaining": 1024, "total": 1024, "expired_at": "2026-11-16 15:23:29", "is_unlimited": false, "status": "ACTIVE", "remaining_voice": 0, // ... 3 more }, "meta": { "message": "success" } }, "status": "success" } ] }- PASS Код статуса: 200
- PASS $.data[0].status равно success
Сбои и реакция на каждый
Все сбои имеют общее тело, а первый элемент errors содержит устойчивый code. Эти вызовы заказа намеренно завершаются ошибкой, каждый по своей причине и с разной реакцией.
Ключ Read в заказе
Ключ Read в вызове заказа отклоняется с
403иread_write_permission_requiredещё до чтения тела. Переключитесь на ключ Read+Write.Запрос POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'Ответ 403 Forbidden · 90 ms · 456 B 403 Forbidden { "environment": "sandbox", "success": false, "errors": [ { "code": "read_write_permission_required", "type": "permission_error", "title": "Read write permission required", "message": "This endpoint requires an API key with read_write permission.", "field": null, "details": {}, "documentation_url": "https://fx-port.com/docs/errors#read_write_permission_required" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 403 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS Код статуса: 403
- PASS Код ошибки: read_write_permission_required
- PASS $.errors[0].type равно permission_error
Неверный адрес почты
Значение, которое не является адресом электронной почты, отклоняется с
400иinvalid_email, аfieldуказывает наemail. Исправьте значение, прежде чем отправлять заказ снова: тот же запрос завершится так же.Запрос POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "traveler-at-example.com", "phone": "+15555550123", "description": "Order for John Smith" }'Ответ 400 Bad Request · 100 ms · 381 B 400 Bad Request { "environment": "sandbox", "success": false, "errors": [ { "code": "invalid_email", "type": "validation_error", "title": "Invalid email", "message": "email is not a valid email address", "field": "email", "details": {}, "documentation_url": "https://fx-port.com/docs/errors#invalid_email" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 400 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS Код статуса: 400
- PASS Код ошибки: invalid_email
- PASS $.errors[0].field равно email
Повторный заказ
Заказ пакета, который уже обрабатывается, отклоняется с
409иduplicate_request. Не отправляйте его сразу снова: сначала найдите бронирование и закажите повторно, только если оно не создано.Запрос POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'Ответ 409 Conflict · 110 ms · 423 B 409 Conflict { "environment": "sandbox", "success": false, "errors": [ { "code": "duplicate_request", "type": "conflict", "title": "Duplicate request", "message": "An identical order is already being processed. Please wait before retrying.", "field": null, "details": {}, "documentation_url": "https://fx-port.com/docs/errors#duplicate_request" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 409 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS Код статуса: 409
- PASS Код ошибки: duplicate_request
- PASS $.errors[0].type равно conflict
Слишком много запросов
При превышении лимита в минуту вызов отклоняется с
429иrate_limit_exceeded, а заголовокRetry-Afterговорит, сколько секунд ждать. Затем повторите запрос с нарастающей задержкой.Запрос POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'Ответ 429 Too Many Requests · 80 ms · 504 B 429 Too Many Requests Retry-After: 12 { "environment": "sandbox", "success": false, "errors": [ { "code": "rate_limit_exceeded", "type": "rate_limit_error", "title": "Rate limit exceeded", "message": "Too many requests hit the API too quickly. Please retry your request after the time specified in the `ratelimit-reset` header.", "field": null, "details": { "retry_after": 12 }, "documentation_url": "https://fx-port.com/docs/errors#rate_limit_exceeded" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 429 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS Код статуса: 429
- PASS Код ошибки: rate_limit_exceeded
- PASS Заголовок Retry-After присутствует
- PASS $.errors[0].details.retry_after равно 12
От каталога до подключённого путешественника за пять шагов
Интеграция укладывается в короткий путь: прочитать каталог, создать заказ, передать путешественнику eSIM, следить за использованием и пополнять, когда данные заканчиваются. Что-то меняют только заказ и пополнение. Все остальные вызовы лишь читают.
Прочитайте каталог для одного направления
Запросите пакеты одной страны с ценами уже в валюте вашего агентства и сохраните package_id того пакета, который выбрал путешественник. Всегда передавайте country: полный каталог — очень большой ответ без пагинации. Идентификаторы пакетов берите из ответа, а не зашивайте в код, потому что каталог меняется.
Запрос
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK
{
"environment": "sandbox",
"success": true,
"endpoint": "/packages",
"data": [
{
"id": "france-in-7days-1gb",
"package_id": "france-in-7days-1gb",
"type": "sim",
"price": 402.5,
"base_price": 402.5,
// ... 28 more
"total_price": 468.84,
"balance_debit_amount": 418.6,
"b2b_price": 418.6,
"agency_commission": "12 %",
"commission_rate": 12,
"currency": "DZD",
// ... 2 more
},
// ...
],
"meta": {
"total_packages": 12,
"filters_applied": {
// ... 2 more
},
"locale": "en",
"agency_currency": "DZD",
"currency": "DZD",
"supplier_currency": "USD",
"exchange_rate": 250,
"commission_percentage": "12 %",
"commission_rate": 12
}
}Создайте заказ
Передайте package_id вместе с адресом электронной почты и телефоном путешественника. Один заказ создаёт ровно одну eSIM, а в режиме Live списывает средства с баланса вашего агентства. Сохраните из ответа booking_id и ICCID: любой последующий вызов требует один из них.
Запрос
curl https://api.fx-port.com/api/v1/esims/orders \
-H "Authorization: Bearer fxp_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"package_id": "france-in-7days-1gb",
"first_name": "John",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+15555550123",
"description": "Order for John Smith"
}'Ответ 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"order": {
"code": "20261101-106852",
"order_id": "20261101-106852",
"package_id": "france-in-7days-1gb",
// ... 17 more
},
"sim": {
// ... 4 more
"qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 7 more
"sharing": {
"access_code": 8803,
"link": "https://esims.cloud/v8hy7-usgkq6wg"
}
},
"iccid": "8900000540463077957"
},
"booking_id": "FX-1793546602916",
"message": "eSIM order placed successfully",
"balanceDebited": false,
"balance_debited": false,
"transactionCreated": false,
"transaction_created": false,
"payoutCreated": false,
"payout_created": false
}| Поле | Что содержит |
|---|---|
booking_id | Идентификатор заказа в FX-Port. Сохраните его для данных установки, проверки принадлежности и собственного учёта. |
data.iccid | Идентификатор eSIM. Использование, пополнения и инструкции по установке запрашиваются по ICCID. |
data.sim.qrcode data.sim.qrcode_url | Строка активации, которую кодирует QR-код, и ссылка на изображение QR-кода. |
data.sim.direct_apple_installation_url data.sim.sharing | Ссылка, запускающая установку на iPhone, и страница доступа, где путешественник может открыть eSIM по коду доступа. Ссылку для Android добавляет запрос данных для установки. |
PENDING-, а данные станут доступны через запрос данных для установки, как только они появятся у поставщика.Передайте путешественнику eSIM
В ответе приходят QR-код и его строка активации, поэтому вы можете показать их на своих экранах. Кроме того, FX-Port просит поставщика отправить QR-код и ссылку для доступа на адрес путешественника, так что пересылать ничего не нужно. Запрос данных для установки позже вернёт те же данные вместе с шагами установки.
Запрос
curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"code": "20261101-106852",
"order_id": "20261101-106852",
"currency": "DZD",
"package_id": "france-in-7days-1gb",
"quantity": 1,
"type": "sim",
"description": "Order for John Smith",
"esim_type": "local",
"validity": 7,
"package": "KPN France Data only-1 GB - 7 days",
"data": "1 GB",
// ... 5 more
"sims": [
{
"created_at": "2026-11-09 15:23:22",
"iccid": "8900000540463077957",
// ... 2 more
"qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 6 more
"direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 2 more
}
],
// ... 3 more
}
}Следите за использованием
Читайте остаток данных и срок действия eSIM по её ICCID. Ответ кэшируется до 15 мин., поэтому используйте его для экрана или напоминания, а не как счётчик.
Запрос
curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Ответ 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"data": {
"remaining": 1024,
"total": 1024,
"expired_at": "2026-11-16 15:23:29",
"is_unlimited": false,
"status": "ACTIVE",
"remaining_voice": 0,
"remaining_text": 0,
"total_voice": 0,
"total_text": 0
},
"meta": {
"message": "success"
}
}
}Пополните, когда данные закончатся
Запросите пакеты, которые можно добавить именно к этой eSIM, и создайте пополнение с одним из них. Если список пуст, eSIM сейчас пополнить нельзя, и путешественнику нужна новая.
Запрос
curl https://api.fx-port.com/api/v1/esims/topups \
-H "Authorization: Bearer fxp_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"package_id": "france-in-7days-1gb-topup",
"iccid": "8900000540463077957",
"first_name": "John",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+15555550123"
}'Ответ 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"topup": {
"code": "20261101-106853",
"order_id": "20261101-106853",
"package_id": "france-in-7days-1gb-topup",
"package": "KPN France Data only-1 GB - 7 days",
"data": "1 GB",
"validity": 7,
"price": 468.84,
// ... 6 more
},
"iccid": "8900000540463077957",
"balance": {
"previous": 0,
"current": 0,
"currency": "DZD"
}
},
"booking_id": "FX-1793546625391",
"message": "eSIM topup completed successfully",
"balanceDebited": false,
"balance_debited": false,
"transactionCreated": false,
"transaction_created": false,
"payoutCreated": false,
"payout_created": false
}Цены, комиссия и баланс агентства
У каждого пакета есть денежные поля, которые сервер считает в валюте вашего агентства. Цена в теле запроса игнорируется, поэтому заказ всегда создаётся по цене, рассчитанной сервером.
| Поле | Что содержит |
|---|---|
base_price price | Цена пакета до вашей комиссии. Это не та сумма, которая списывается с баланса. |
total_price retail_price | Цена для путешественника, уже с вашей комиссией. |
balance_debit_amount b2b_price | Сумма, которая уходит с баланса агентства, когда вы заказываете пакет в режиме Live. Читайте её, а не вычисляйте. |
agency_commission commission_rate | Ваша ставка комиссии в виде текста и числа. В заказах комиссия возвращается суммой. |
В примере каталога путешественник платит 468.84 DZD. Заказ в режиме Live списывает с баланса 418.60 DZD, а разница, 50.24 DZD, составляет вашу комиссию.
Ставка зависит от вашего агентства
Ставка комиссии приходит с каждым пакетом и у разных агентств может отличаться. У корпоративного агентства по договору она может быть нулевой, и тогда итоговая цена равна сумме списания.
Читайте поля, а не пересчитывайте их
Сумма списания может быть выше базовой цены, потому что в неё входят суммы, специфичные для вашего агентства. Поэтому читайте balance_debit_amount и никогда не вычисляйте её из base_price. Слово price в каталоге означает базовую цену, а в заказах, пакетах пополнения и данных установки — розничную цену: используйте везде base_price и total_price, и путаницы не будет.
Цены в валюте вашего агентства
Каждая сумма уже переведена в валюту вашего агентства, в какой бы валюте ни работал поставщик. В ответе также указаны валюта поставщика и курс, поэтому вы можете сами проверить курс и больше ничего не пересчитывать.
После продажи: использование, пополнения и данные установки
Продажа не заканчивается заказом. Эти вызовы помогают путешественнику оставаться на связи и работают только с теми eSIM, которые ваше агентство заказало в том же окружении, что и ваш ключ.
Чтение использования и свежесть данных
Вызов использования возвращает остаток данных, объём пакета, статус и срок действия одной eSIM или до 50 eSIM за один вызов. FX-Port хранит последний ответ до 15 минут, чтобы не превышать лимиты запросов поставщика, поэтому значение может быть таким же старым. Передайте force=true, чтобы снова спросить поставщика, например сразу после пополнения. Не делайте этого в каждом запросе: поставщик ограничивает частоту чтения использования. Если поставщик не отвечает, вы получите последнее известное значение с пометкой «устарело».
Пополнение: сначала запрос, затем создание
Пополнение состоит из двух вызовов. Сначала запросите список пакетов, которые можно добавить именно к этой eSIM, затем создайте пополнение с одним из возвращённых идентификаторов пакета. Не используйте идентификатор пакета исходного заказа и не храните пакет пополнения на потом: запрашивайте список заново, когда путешественник захочет пополнить eSIM. Пополнение добавляет данные к eSIM, а не заменяет остаток, поэтому читайте результат через использование с force=true.
Когда пополнение невозможно
Поставщики сами выбирают, какие мобильные операторы обслуживают страну, и в редких случаях меняют оператора. Тогда eSIM может работать до окончания срока действия, а её пакет больше нельзя пополнить. Список пакетов пополнения приходит пустым. Если поставщик отклоняет пополнение, баланс не затрагивается, а попытка сохраняется как неудачное бронирование. В ответе приходит supplier_error, на который можно отреагировать в коде.
Данные установки и шаги установки
Вызов данных установки в любой момент возвращает QR-код, данные активации, ссылки для установки и шаги установки заказа. Вызов инструкций возвращает шаги для каждой операционной системы на запрошенном вами языке. Шаги представляют собой общий текст поставщика, поэтому показывайте их рядом с QR-кодом заказа. Показывайте и то и другое только путешественнику, которому принадлежит eSIM.
Бронирования, история пополнений и проверка владельца
Список бронирований возвращает заказы eSIM вашего агентства в окружении вашего ключа, сначала новые. Искать в нём можно по идентификатору бронирования, имени путешественника, адресу электронной почты, названию пакета или ICCID. Пополнений в этом списке нет: читайте их через историю пополнений конкретной eSIM. Прежде чем строить ссылку или экран вокруг идентификатора бронирования, проверка владельца подскажет, ваш ли он. Бронирование другого агентства и несуществующее бронирование получают одинаковый ответ.
Все эндпоинты eSIM: OpenAPI, Postman и примеры кода
В eSIM API 12 эндпоинтов с одним базовым URL. Каждая строка ведёт на справочную страницу вызова с полями запроса, ответами, ошибками и примерами на 9 языках.
| Эндпоинт | Что делает | Ключ |
|---|---|---|
GET /api/v1/esims/packages | Список пакетов одной страны или региона с ценами в валюте вашего агентства. Всегда передавайте страну: весь каталог очень большой и без пагинации. | Чтение |
GET /api/v1/esims/compatible-devices | Известные устройства с поддержкой eSIM — для проверки до покупки путешественником. | Чтение |
POST /api/v1/esims/orders | Создаёт одну eSIM из пакета для путешественника и выпускает её у поставщика. В Live списывает сумму с баланса агентства. | Чтение + запись |
GET /api/v1/esims/topup-packages/{iccid} | Пакеты, которые сегодня можно добавить к конкретной eSIM. Пустой список значит, что пополнить её сейчас нельзя. | Чтение |
POST /api/v1/esims/topups | Добавляет пакет пополнения к существующей eSIM. В Live баланс списывается только после того, как поставщик принял пополнение. | Чтение + запись |
GET /api/v1/esims/usage/{iccid} | Остаток данных, объём пакета, статус и срок действия одной eSIM. Ответу может быть до 15 минут. | Чтение |
GET /api/v1/esims/usage/bulk | Использование до 50 eSIM одним вызовом: по записи на каждый ICCID, у каждой свой статус. | Чтение |
GET /api/v1/esims/bookings | Заказы eSIM вашего агентства, сначала новые, с поиском и пагинацией. Пополнений в этом списке нет. | Чтение |
GET /api/v1/esims/bookings/{iccid}/topup-history | Пополнения одной eSIM, сначала новые. Если пополнений не было, список пуст. | Чтение |
GET /api/v1/esims/bookings/{booking_id}/verify | Проверяет, что идентификатор бронирования принадлежит вашему агентству, прежде чем строить вокруг него ссылку или экран. | Чтение |
GET /api/v1/esims/bookings/{booking_id}/setup-instructions | QR-код, данные активации, ссылки для установки и шаги установки заказа в виде JSON. | Чтение |
GET /api/v1/esims/instructions/{iccid} | Пошаговая инструкция по установке для одного ICCID по операционным системам на запрошенном вами языке. | Чтение |
OpenAPI 3.1
Один файл описывает каждый эндпоинт и каждое поле. Сгенерируйте по нему клиент, импортируйте его в инструмент для работы с API или передайте ИИ-ассистенту для написания кода.
Коллекция Postman
Коллекция eSIM охватывает все 12 эндпоинтов и разложена по папкам по этапам продажи. Ключей в ней нет, добавьте свои.
Примеры кода на 9 языках
Каждая справочная страница показывает запрос на cURL, Node.js, Python, PHP, Go, Java, C#, Swift и Kotlin, сформированный из описания OpenAPI. Любой запрос eSIM доступен на всех этих языках.
Документация для ИИ-ассистентов
llms.txt и llms-full.txt отдают ИИ-ассистентам документацию простым текстом, а любую страницу документации можно прочитать в формате Markdown, добавив .md к её адресу.
Для продакшена: ключи, ошибки, повторы и кэширование
Интеграцию eSIM оценивают в продакшене по аутентификации, сбоям, повторам, кэшированию и лимитам запросов. Вот что нужно знать о каждом из этих пунктов.
Один базовый URL, два вида ключей
Каждый запрос передаёт ключ как bearer-токен в заголовке Authorization. Префикс показывает, где работает ключ: fxp_test_ для sandbox и fxp_live_ для Live. Оба обращаются к одному базовому URL, а каждый JSON-ответ указывает окружение, из которого пришёл, в поле environment. Ключи должны храниться на вашем сервере, а не в браузере или приложении. FX-Port хранит только хеш каждого ключа, поэтому потерянный ключ показать повторно нельзя. Изменение ключа может вступить в силу через несколько минут.
Какой ключ для каких вызовов
Ключ Read может получать список пакетов, проверять устройства, читать использование и бронирования. Для создания заказа или пополнения нужен ключ Read+Write, а ключ Read при такой попытке получает read_write_permission_required. Любой ключ можно привязать к списку IP-адресов, и вызов с другого адреса получит ip_not_allowed. Используйте ключ Read везде, где код только показывает результаты.
Единый формат для любых ошибок
Неудачный вызов возвращает массив errors. Его первый элемент содержит устойчивый code, type, который подсказывает, как реагировать, и поле field, в котором ошибка. Проверяйте код, а не сообщение. Общий список ошибок для авиабилетов, отелей, eSIM и аккаунта содержит 180 кодов. Когда поставщик отклоняет заказ или пополнение, приходит supplier_error с собственным HTTP-статусом поставщика. Ничего не списывается, а неудачное бронирование сохраняется. Сразу после перезапуска каталог и список устройств могут ответить 202 с success, равным false: подождите несколько секунд и повторите запрос.
Повтор без двойного заказа
В FX-Port нет ключа идемпотентности, поэтому заголовок Idempotency-Key отправлять не нужно. Чтение безопасно повторять, а создание заказа или пополнения нет. FX-Port отклоняет очевидный дубликат с 409 и duplicate_request: это заказ пакета, который ещё обрабатывается. В режиме Live он также отклоняет тот же пакет, заказанный повторно в течение 60 секунд после последнего подтверждённого заказа вашего агентства, независимо от путешественника. Заказ обычно обрабатывается за несколько секунд, но медленный поставщик может отвечать намного дольше. Если вызов завершился по тайм-ауту или соединение оборвалось, не отправляйте заказ сразу повторно, потому что eSIM может уже существовать. Найдите её по параметру search в списке бронирований, используя адрес электронной почты путешественника, и закажите снова, только если ничего не создано.
Без webhooks: запрашивайте, когда нужно
FX-Port не обращается к вашему URL ни в sandbox, ни в Live. В ответе на заказ приходит eSIM или заглушка PENDING-, пока поставщик ещё не вернул её. Всё остальное вы запрашиваете сами, когда нужно: данные установки, использование или список бронирований.
Кэширование и скорость
Использование хранится до 15 минут, а список пакетов пополнения несколько минут, при этом force=true обходит кэш. Каталог без фильтра очень большой и приходит без пагинации, поэтому передавайте country и принимайте сжатие через Accept-Encoding: gzip. Названия пакетов приходят на языке параметра locale; первый запрос на языке, отличном от английского, медленнее, потому что текст запрашивается в этот момент, а затем кэшируется.
Лимиты запросов
Лимиты считаются по каждому ключу и в минуту в двух группах, а каждый ответ содержит ratelimit-limit и ratelimit-remaining, так что можно сбавить темп, прежде чем вам начнут отказывать. После 429 подождите число секунд из Retry-After и повторите запрос с экспоненциальной задержкой и джиттером. Если одновременно выполняется слишком много заказов или пополнений одного ключа или агентства, ответом может быть concurrency_limit_exceeded.
| Тип вызова | В минуту |
|---|---|
| Создание заказов и пополнений | 1,200 |
| Остальные эндпоинты eSIM | 6,000 |
Пока потолок одновременно выполняемых заказов и пополнений работает в режиме наблюдения: он учитывается, но не применяется, поэтому из-за него пока ничего не отклоняется, а день включения ограничения объявит журнал изменений. Считайте эти числа текущей политикой, а не обещанием. У ключей Sandbox те же поминутные счётчики, что и у ключей Live, поэтому нагрузочные тесты планируйте, а не запускайте в цикле.
Имена и версии
Поля запроса записываются в snake_case, например first_name и agent_id. Прежние названия по-прежнему работают: user_id воспринимается как agent_id и добавляет запись в warnings, а customer_email принимается как email без неё. Во многих ответах старый ключ сохраняется рядом с двойником в snake_case с тем же значением, например order_id рядом с code, а параметр ?naming=snake оставляет только ключи в snake_case. Версия задаётся в пути, /api/v1: несовместимое изменение получит новый префикс, а новые поля и написания добавляются без нарушения совместимости.
Начните в бесплатном sandbox, затем переходите на Live
Всё, что описано на этой странице, сегодня работает в sandbox. Ключ sandbox вы создаёте сами, бесплатно, и он никогда не затрагивает ваш настоящий баланс.
Создайте аккаунт
Зарегистрируйте аккаунт FX-Port. Ключи Sandbox бесплатны, а бронирования в Sandbox не списывают реальных денег.
Создайте ключ Sandbox
На странице API в личном кабинете создайте ключ с префиксом
fxp_test_. Ключ Read может искать и читать данные, а ключ Read+Write ещё и создаёт тестовые бронирования.Отправьте первый запрос
Базовый URL один, а ключ передаётся в заголовке
Authorizationкак bearer-токен. Первый вызов разобран в кратком руководстве.Переходите на Live, когда будете готовы
Подставьте ключ
fxp_live_. Live заработает, когда ваше агентство будет одобрено; до этого API отвечает403 agency_not_active. Реальные бронирования оплачиваются с пополненного баланса.
Первый запрос к каталогу на cURL. Документация показывает тот же запрос на каждом поддерживаемом языке.
Запрос
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Быстрый старт: первый вызов в sandbox
Что делает sandbox
Заказ в sandbox создаёт у поставщика настоящую тестовую eSIM с фиктивным кодом активации, поэтому установить её на телефон нельзя. Ничего не списывается, и ответы об этом сообщают: balanceDebited, transactionCreated и payoutCreated равны false. Пополнение отвечает нулевым балансом. Использование статично: новая eSIM показывает полный объём пакета и статус ACTIVE. Бронирования sandbox видны только ключам sandbox.
Что можно проверить только в Live
Проверка баланса, проверка дубликатов и блокировка баланса работают только в Live. Поэтому ответы 402 с insufficient_balance, 409 для того же пакета, заказанного снова в течение 60 секунд, и 503 с balance_lock_timeout в sandbox не появляются. Обработку этих случаев пишите по списку кодов ошибок.
Переход на Live
Ключи Live привязаны к одобрению агентства: пока ваше агентство не одобрено, ключ Live отвечает agency_not_active, а ключ sandbox продолжает работать. Заказы в Live оплачиваются с пополненного баланса агентства. Переход на Live меняет ключ, а не код, потому что sandbox и Live используют один базовый URL.
Кто создаёт продукты на базе eSIM API
Каждой аудитории важна своя часть одних и тех же вызовов.
Агентства, которые продают поездки
Агентства продают eSIM вместе с авиабилетом и отелем. Они оформляют заказ на адрес электронной почты самого путешественника, чтобы поставщик отправил ему QR-код и ссылку для доступа, и читают использование, когда путешественник спрашивает. Ставка комиссии приходит с каждым пакетом, а agent_id фиксирует, какой пользователь вашего агентства оформил заказ.
OTA и маркетплейсы
Маркетплейсы сначала делают страницу выбора: одна страна за раз, локальные или региональные пакеты, сети и объём данных каждого пакета, а перед покупкой проверку устройства. Экран со списком eSIM путешественника может прочитать использование до 50 из них одним вызовом.
Travel-tech и корпоративные команды
Travel-tech команды и отделы корпоративных поездок создают собственные инструменты бронирования. Всё, что нужно для старта, открыто: файл OpenAPI, коллекция Postman и документация в виде простого текста, которую может прочитать ИИ-ассистент для кода, так что первый прототип строится на реальном контракте.
eSIM API: частые вопросы
Что такое eSIM API FX-Port и для кого оно?
Это REST API, с помощью которого турагентство, OTA или реселлер продаёт туристические eSIM с данными через одну интеграцию. Вы получаете список пакетов направления с ценами в валюте вашего агентства и заказываете один из них для путешественника. Вы передаёте путешественнику QR-код, следите за использованием и пополняете eSIM. Всё работает по JSON поверх HTTPS, а файл OpenAPI описывает каждый эндпоинт.
Есть ли бесплатный sandbox и как получить ключ?
Да. Создайте аккаунт FX-Port, откройте страницу API в личном кабинете и создайте ключ sandbox: сделать это можно самостоятельно и бесплатно. Заказ в sandbox создаёт тестовую eSIM с фиктивным кодом активации, поэтому установить её на телефон нельзя. С баланса ничего не списывается. Sandbox и Live используют один базовый URL, так что код, который вы тестируете, и есть код, который вы выпускаете.
Что нужно для перехода на Live?
Чтобы ключ Live заработал, ваше агентство должно быть одобрено. До этого ключ Live отклоняется, а ключ sandbox продолжает работать. Заказы в Live оплачиваются с пополненного баланса агентства, которого sandbox никогда не касается, а любой ключ можно привязать к списку IP-адресов. Для перехода достаточно сменить ключ; каждый ответ называет окружение, из которого пришёл.
В каких странах и какие пакеты можно продавать?
Пакеты доступны для 190+ стран, а региональные наборы показаны в своём регионе. Пакеты различаются объёмом данных, сроком действия, сетями и возможностью пополнения. Читайте эти поля и идентификатор пакета из ответа каталога, а не прописывайте их в коде. Запрашивайте по одной стране, потому что весь каталог очень большой. Отдельный список устройств позволяет проверить телефон путешественника до продажи.
Как путешественник получает eSIM?
Ответ на заказ содержит QR-код, его строку активации, ссылку для установки на iPhone и страницу доступа. Вы можете показать их на своих экранах. Кроме того, FX-Port просит поставщика отправить по электронной почте QR-код и ссылку для доступа на адрес путешественника, как только eSIM создана. Если поставщик ещё не вернул eSIM, заказ всё равно существует, а данные позже доступны через вызов данных установки.
Как связаны цены, комиссия и баланс?
У каждого пакета есть такие денежные поля в валюте вашего агентства: базовая цена до вашей комиссии, итоговая цена для путешественника, сумма, списываемая с баланса, и ваша ставка комиссии. Ваша комиссия равна итоговой цене минус сумма списания. Читайте эти поля, а не пересчитывайте их, потому что сумма списания зависит от вашего агентства. В sandbox ничего не списывается, а в Live сумма уходит с баланса агентства.
Можно ли пополнить eSIM и как узнать остаток?
Да, двумя вызовами: запросите пакеты, которые можно добавить именно к этой eSIM, затем создайте пополнение с одним из них. Пополнение возможно не всегда, потому что поставщик может сменить оператора в стране. Тогда пустой список означает, что путешественнику нужна новая eSIM. Использование кэшируется до 15 минут, поэтому считайте его недавним значением; одним вызовом можно прочитать до 50 eSIM.
Как сообщается о сбоях и есть ли webhooks?
Сбой приходит в одном формате с устойчивым кодом ошибки, и проверять нужно именно код, а не текст сообщения. Чтение безопасно повторять с нарастающей задержкой. Создание заказа или пополнения устроено иначе: ключа идемпотентности нет, поэтому после тайм-аута найдите бронирование, прежде чем пробовать снова. FX-Port отклоняет очевидный дубликат, например тот же пакет, заказанный дважды в течение 60 секунд в Live. Webhooks нет.
Можно ли отменить заказ eSIM или вернуть деньги через API?
Нет. В API нет эндпоинта для отмены заказа eSIM или возврата. Каждый заказ создаёт ровно одну eSIM, поэтому проверьте пакет и данные путешественника, прежде чем отправлять его. Если поставщик отклоняет заказ, ничего не списывается, а неудачное бронирование сохраняется. По проблеме с конкретным заказом напишите команде разработчиков и укажите его идентификатор бронирования.
Что нужно для старта и какие инструменты помогут?
Вам нужны ключ sandbox и HTTP-клиент. В документации есть файл OpenAPI 3.1, коллекция Postman, примеры кода на 9 языках и текстовые выгрузки для ИИ-ассистентов. Храните ключи на своём сервере, а не в браузере или приложении. Больше времени уйдёт на ваш собственный процесс оформления заказа, доставку QR-кода путешественнику и обработку ошибок.
Другие API платформы FX-Port
eSIM обычно нужна в поездке. Авиабилеты и отели используют те же ключи, то же тело ошибки и те же соглашения, что и eSIM, а их бронирования хранятся в той же истории аккаунта.
Поиск, расчёт цены и бронирование авиабилетов, оплата удержанных заказов, отмена и получение билетов.
Поиск отелей, проверка тарифов, предбронирование и бронирование, получение ваучеров и отмена.
- API трансферовПревью
Расчёт стоимости, бронирование, отслеживание и отмена трансферов из аэропорта и в аэропорт.
Не хотите писать код? Агентства могут продавать eSIM и из личного кабинета FX-Port. Продажа eSIM из личного кабинета
Оформите первый заказ eSIM в sandbox
Создайте аккаунт, получите ключ sandbox, запросите пакеты, создайте заказ и прочитайте использование уже сегодня. Ключи Live станут доступны после одобрения вашего агентства.