1. Главная
  2. eSIM API

НовоеREST API, описанный в файле OpenAPI 3.1

eSIM API для турагентств, OTA и реселлеров

Продавайте туристические eSIM через один REST API. Получайте пакеты данных по странам с ценами в валюте вашего агентства, заказывайте eSIM для путешественника, передавайте ему QR-код, следите за использованием и пополняйте. Один базовый URL обслуживает sandbox и Live. Начните с бесплатного ключа sandbox: ключи Live заработают после одобрения вашего агентства.

Получить бесплатные ключи sandboxЧитать руководство по eSIM

Документация написана на английском языке.

Базовый URL
https://api.fx-port.com/api/v1
Аутентификация
Authorization: Bearer fxp_test_...
Префиксы ключей
fxp_test_ / fxp_live_
Эндпоинты
12
Страны с пакетами
190+
Языки примеров кода
9

На этой странице

  • Консоль
  • Пять шагов
  • Цены
  • После продажи
  • Эндпоинты
  • Продакшен
  • Sandbox
  • Для кого
  • FAQ
  • Связанные API
  • Начать

eSIM API: вызов за вызовом

Проследите продажу eSIM шаг за шагом: как запрос собирается, отправляется и получает ответ. Сценарии охватывают продажу eSIM, поддержание подключения путешественника, проверку устройств и бронирований, а также сбои, которые стоит обработать. Запросы и ответы взяты из примеров документации, эта страница никогда не вызывает API.

3 запроса: Список пакетов, Заказ eSIM, Данные установки.

Демонстрационная сессия: тела запросов и ответов взяты из примеров документации, даты сдвинуты вперёд, чтобы оставаться в будущем, а время показано для иллюстрации. Эта страница не отправляет запросов.

Скачать коллекцию Postman

Найти пакет, заказать его, прочитать данные установки

Начните с пакетов одной страны, закажите один для путешественника, затем прочитайте данные установки заказа. Sandbox создаёт тестовую eSIM с фиктивным кодом активации и ничего не списывает, а консоль показывает сокращённую копию ответа каталога.

  1. Список пакетов

    Вызов каталога принимает 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 существует

    Описание GET /esims/packages в документации

  2. Заказ eSIM

    Для создания заказа нужны package_id, адрес электронной почты и номер телефона путешественника. Сохраните booking_id и data.iccid из ответа. В sandbox balanceDebited, 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 существует

    Описание POST /esims/orders в документации

  3. Данные установки

    Вызов данных установки принимает 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, и создайте пополнение. Использование кэшируется, поэтому значение может отставать на несколько минут. История пополнений есть в боковой панели и в транскрипте.

  1. Чтение использования

    Вызов использования принимает 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 существует

    Описание GET /esims/usage/{iccid} в документации

  2. Пакеты пополнения

    Этот вызов возвращает пакеты, которые сегодня можно добавить к данной 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

    Описание GET /esims/topup-packages/{iccid} в документации

  3. Создание пополнения

    Для создания пополнения нужны package_id из этого списка и ICCID. В Live баланс списывается только после того, как поставщик принял пополнение. В sandbox balance в ответе равен нулю, и ничего не списывается.

    Запрос 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

    Описание POST /esims/topups в документации

  4. История пополнений

    История пополнений показывает пополнения одной 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. После продажи прочитайте свои бронирования и убедитесь, что идентификатор бронирования принадлежит вам. Массовое чтение использования есть в боковой панели.

  1. Список устройств

    Вызов совместимых устройств возвращает известные устройства с поддержкой 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 существует

    Описание GET /esims/compatible-devices в документации

  2. Список бронирований

    Список бронирований возвращает заказы 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

    Описание GET /esims/bookings в документации

  3. Проверка владельца

    Проверка владельца отвечает 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 в документации

  4. Массовое чтение

    Один вызов читает использование нескольких 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

    Описание GET /esims/usage/bulk в документации

Сбои и реакция на каждый

Все сбои имеют общее тело, а первый элемент errors содержит устойчивый code. Эти вызовы заказа намеренно завершаются ошибкой, каждый по своей причине и с разной реакцией.

  1. Ключ 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

    Описание POST /esims/orders в документации

  2. Неверный адрес почты

    Значение, которое не является адресом электронной почты, отклоняется с 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

    Описание POST /esims/orders в документации

  3. Повторный заказ

    Заказ пакета, который уже обрабатывается, отклоняется с 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

    Описание POST /esims/orders в документации

  4. Слишком много запросов

    При превышении лимита в минуту вызов отклоняется с 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

    Описание POST /esims/orders в документации

От каталога до подключённого путешественника за пять шагов

Интеграция укладывается в короткий путь: прочитать каталог, создать заказ, передать путешественнику eSIM, следить за использованием и пополнять, когда данные заканчиваются. Что-то меняют только заказ и пополнение. Все остальные вызовы лишь читают.

Прочитайте каталог для одного направления

Запросите пакеты одной страны с ценами уже в валюте вашего агентства и сохраните package_id того пакета, который выбрал путешественник. Всегда передавайте country: полный каталог — очень большой ответ без пагинации. Идентификаторы пакетов берите из ответа, а не зашивайте в код, потому что каталог меняется.

  • GET /api/v1/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

{
  "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: любой последующий вызов требует один из них.

  • POST /api/v1/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

{
  "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 добавляет запрос данных для установки.
Данные активации конфиденциальны: показывайте их только путешественнику, которому принадлежит eSIM.
Если поставщик ещё не вернул eSIM, заказ всё равно существует: ICCID начинается с PENDING-, а данные станут доступны через запрос данных для установки, как только они появятся у поставщика.

Создание заказа eSIM

Передайте путешественнику eSIM

В ответе приходят QR-код и его строка активации, поэтому вы можете показать их на своих экранах. Кроме того, FX-Port просит поставщика отправить QR-код и ссылку для доступа на адрес путешественника, так что пересылать ничего не нужно. Запрос данных для установки позже вернёт те же данные вместе с шагами установки.

  • GET /api/v1/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

{
  "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
  }
}

Данные установки по бронированию или ICCID

Следите за использованием

Читайте остаток данных и срок действия eSIM по её ICCID. Ответ кэшируется до 15 мин., поэтому используйте его для экрана или напоминания, а не как счётчик.

  • GET /api/v1/esims/usage/{iccid}

Запрос

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, и создайте пополнение с одним из них. Если список пуст, eSIM сейчас пополнить нельзя, и путешественнику нужна новая.

  • GET /api/v1/esims/topup-packages/{iccid}
  • POST /api/v1/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

{
  "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
}

Проверка и создание пополнений

Цены, комиссия и баланс агентства

У каждого пакета есть денежные поля, которые сервер считает в валюте вашего агентства. Цена в теле запроса игнорируется, поэтому заказ всегда создаётся по цене, рассчитанной сервером.

Денежные поля пакета eSIM
ПолеЧто содержит
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, которые ваше агентство заказало в том же окружении, что и ваш ключ.

Чтение использования и свежесть данных

Вызов использования возвращает остаток данных, объём пакета, статус и срок действия одной eSIM или до 50 eSIM за один вызов. FX-Port хранит последний ответ до 15 минут, чтобы не превышать лимиты запросов поставщика, поэтому значение может быть таким же старым. Передайте force=true, чтобы снова спросить поставщика, например сразу после пополнения. Не делайте этого в каждом запросе: поставщик ограничивает частоту чтения использования. Если поставщик не отвечает, вы получите последнее известное значение с пометкой «устарело».

Использование одной и многих eSIM

Пополнение: сначала запрос, затем создание

Пополнение состоит из двух вызовов. Сначала запросите список пакетов, которые можно добавить именно к этой eSIM, затем создайте пополнение с одним из возвращённых идентификаторов пакета. Не используйте идентификатор пакета исходного заказа и не храните пакет пополнения на потом: запрашивайте список заново, когда путешественник захочет пополнить eSIM. Пополнение добавляет данные к eSIM, а не заменяет остаток, поэтому читайте результат через использование с force=true.

Проверка и создание пополнений

Когда пополнение невозможно

Поставщики сами выбирают, какие мобильные операторы обслуживают страну, и в редких случаях меняют оператора. Тогда eSIM может работать до окончания срока действия, а её пакет больше нельзя пополнить. Список пакетов пополнения приходит пустым. Если поставщик отклоняет пополнение, баланс не затрагивается, а попытка сохраняется как неудачное бронирование. В ответе приходит supplier_error, на который можно отреагировать в коде.

Почему пополнение может быть недоступно

Данные установки и шаги установки

Вызов данных установки в любой момент возвращает QR-код, данные активации, ссылки для установки и шаги установки заказа. Вызов инструкций возвращает шаги для каждой операционной системы на запрошенном вами языке. Шаги представляют собой общий текст поставщика, поэтому показывайте их рядом с QR-кодом заказа. Показывайте и то и другое только путешественнику, которому принадлежит eSIM.

Данные установки по бронированию или ICCID

Бронирования, история пополнений и проверка владельца

Список бронирований возвращает заказы eSIM вашего агентства в окружении вашего ключа, сначала новые. Искать в нём можно по идентификатору бронирования, имени путешественника, адресу электронной почты, названию пакета или ICCID. Пополнений в этом списке нет: читайте их через историю пополнений конкретной eSIM. Прежде чем строить ссылку или экран вокруг идентификатора бронирования, проверка владельца подскажет, ваш ли он. Бронирование другого агентства и несуществующее бронирование получают одинаковый ответ.

Список и проверка бронирований eSIM

Все эндпоинты eSIM: OpenAPI, Postman и примеры кода

В eSIM API 12 эндпоинтов с одним базовым URL. Каждая строка ведёт на справочную страницу вызова с полями запроса, ответами, ошибками и примерами на 9 языках.

Эндпоинты eSIM API: метод, путь, права ключа и назначение
ЭндпоинтЧто делаетКлюч
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-instructionsQR-код, данные активации, ссылки для установки и шаги установки заказа в виде JSON.Чтение
GET /api/v1/esims/instructions/{iccid}Пошаговая инструкция по установке для одного ICCID по операционным системам на запрошенном вами языке.Чтение

OpenAPI 3.1

Один файл описывает каждый эндпоинт и каждое поле. Сгенерируйте по нему клиент, импортируйте его в инструмент для работы с API или передайте ИИ-ассистенту для написания кода.

Файл OpenAPI 3.1

Коллекция Postman

Коллекция eSIM охватывает все 12 эндпоинтов и разложена по папкам по этапам продажи. Ключей в ней нет, добавьте свои.

Коллекция Postman для eSIM

Примеры кода на 9 языках

Каждая справочная страница показывает запрос на cURL, Node.js, Python, PHP, Go, Java, C#, Swift и Kotlin, сформированный из описания OpenAPI. Любой запрос eSIM доступен на всех этих языках.

Полный справочник API

Документация для ИИ-ассистентов

llms.txt и llms-full.txt отдают ИИ-ассистентам документацию простым текстом, а любую страницу документации можно прочитать в формате Markdown, добавив .md к её адресу.

Индекс llms.txt для ИИ-инструментов и ассистентов

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

Для продакшена: ключи, ошибки, повторы и кэширование

Интеграцию eSIM оценивают в продакшене по аутентификации, сбоям, повторам, кэшированию и лимитам запросов. Вот что нужно знать о каждом из этих пунктов.

Один базовый URL, два вида ключей

Каждый запрос передаёт ключ как bearer-токен в заголовке Authorization. Префикс показывает, где работает ключ: fxp_test_ для sandbox и fxp_live_ для Live. Оба обращаются к одному базовому URL, а каждый JSON-ответ указывает окружение, из которого пришёл, в поле environment. Ключи должны храниться на вашем сервере, а не в браузере или приложении. FX-Port хранит только хеш каждого ключа, поэтому потерянный ключ показать повторно нельзя. Изменение ключа может вступить в силу через несколько минут.

Окружения и коллекции Postman

Какой ключ для каких вызовов

Ключ 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.

Лимиты запросов eSIM на ключ
Тип вызоваВ минуту
Создание заказов и пополнений1,200
Остальные эндпоинты eSIM6,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 вы создаёте сами, бесплатно, и он никогда не затрагивает ваш настоящий баланс.

  1. 1

    Создайте аккаунт

    Зарегистрируйте аккаунт FX-Port. Ключи Sandbox бесплатны, а бронирования в Sandbox не списывают реальных денег.

    Создать аккаунт FX-Port

  2. 2

    Создайте ключ Sandbox

    На странице API в личном кабинете создайте ключ с префиксом fxp_test_. Ключ Read может искать и читать данные, а ключ Read+Write ещё и создаёт тестовые бронирования.

    Открыть страницу API в личном кабинете

  3. 3

    Отправьте первый запрос

    Базовый URL один, а ключ передаётся в заголовке Authorization как bearer-токен. Первый вызов разобран в кратком руководстве.

    Прочитать краткое руководство по API

  4. 4

    Переходите на Live, когда будете готовы

    Подставьте ключ fxp_live_. Live заработает, когда ваше агентство будет одобрено; до этого API отвечает 403 agency_not_active. Реальные бронирования оплачиваются с пополненного баланса.

    Как работает переход на Live

Первый запрос к каталогу на 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.

Тестовые eSIM в среде 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.

Одобрение для ключей Live

Кто создаёт продукты на базе 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 авиабилетов

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

  • API отелей

    Поиск отелей, проверка тарифов, предбронирование и бронирование, получение ваучеров и отмена.

  • API трансферовПревью

    Расчёт стоимости, бронирование, отслеживание и отмена трансферов из аэропорта и в аэропорт.

Не хотите писать код? Агентства могут продавать eSIM и из личного кабинета FX-Port. Продажа eSIM из личного кабинета

Оформите первый заказ eSIM в sandbox

Создайте аккаунт, получите ключ sandbox, запросите пакеты, создайте заказ и прочитайте использование уже сегодня. Ключи Live станут доступны после одобрения вашего агентства.

Создать аккаунтНаписать команде разработчиков

Спросите ИИ-ассистента об этом API

Откройте эту страницу в ассистенте и попросите составить пошаговый план интеграции.

FX-PORT

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

  • Условия
  • Конфиденциальность
  • Свяжитесь с нами
  • Корпоративный
  • Блог
  • API Авиабилеты B2B
  • API Трансферы B2B
  • API Паромы B2B
  • API Отели B2B
  • B2B eSIM API
  • Bed Bank B2B
  • Консолидатор авиабилетов B2B
  • Авиакомпании
  • Аэропорты
  • Страны
  • eSIM

Авиационные услуги

FX-Port — это комплексная B2B платформа дистрибуции авиабилетов, которая позволяет турагентствам получать доступ и продавать авиабилеты по всему миру. С подключениями к более чем 500 авиакомпаниям, агентства могут предлагать конкурентоспособные оптовые тарифы с мгновенными подтверждениями и автоматизированным оформлением билетов.

Наша платформа предоставляет информацию о наличии в реальном времени, инструменты для сравнения цен и автоматизированное управление бронированием. Туристические агентства могут получать доступ к эксклюзивным B2B авиатарифам, управлять комиссиями и оптимизировать свои авиационные операции через нашу интегрированную систему.

Услуги размещения

Получайте доступ к нашей обширной сети из более чем 1,5 миллиона объектов по всему миру через нашу B2B платформу бронирования отелей. Туристические агентства могут предлагать конкурентоспособные тарифы с гарантированными наценками и мгновенным подтверждением номеров во всех категориях размещения.

От роскошных курортов до бюджетных вариантов, наша платформа предоставляет подробную информацию об объектах, динамическое ценообразование и автоматизированное управление бронированием для бесшовной дистрибуции отелей.

Туристические решения

Комплексные трансферные услуги с глобальной сетью проверенных поставщиков, предлагающие трансферы из/в аэропорты, экскурсии по городам и профессиональные услуги водителей. Наша система бронирования паромов соединяет основные морские маршруты с возможностью мгновенного бронирования и конкурентоспособными B2B тарифами.

Специализированные пакеты Умры с полным спектром услуг, включая оформление виз, размещение и транспортировку. Динамическое ценообразование и автоматизированное управление запасами для туристических агентств.

FX-Port революционизирует B2B дистрибуцию путешествий с помощью передовых технологий и комплексных решений. Наша платформа позволяет турагентствам получать доступ к глобальным запасам, эффективно управлять бронированиями и развивать свой бизнес с конкурентоспособными тарифами и автоматизированными инструментами.

С поддержкой нескольких валют, местной обработкой платежей и круглосуточной службой поддержки клиентов мы обеспечиваем бесперебойную работу турагентств по всему миру. Наша платформа предлагает информацию о наличии в реальном времени, мгновенные подтверждения и комплексные инструменты управления бронированием.

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

FX-Port предоставляет корпоративный уровень безопасности, автоматизированное управление комиссиями и подробную аналитику для роста бизнеса. Присоединяйтесь к сотням успешных агентств, использующих нашу платформу для оптимизации своих операций и расширения присутствия на рынке.

© 2026 FX-PORT. Все права защищены.

Перейти к содержимому
FX-Port для поставщиковАвиабилеты—Авиакомпании·Консолидаторы·OTA·GDS-агентстваОтели—Бед-банки·PMS/CMS·ОтелиВсе поставщики туристических услуг
КорпоративныйAPI
Вход
Получить доступ сейчас
Панель управления