1. Strona główna
  2. eSIM API

NowośćREST API z plikiem OpenAPI 3.1

API eSIM dla biur podróży, OTA i resellerów

Sprzedawaj eSIM dla podróżnych przez jedno REST API. Wyświetlaj pakiety danych według kraju z cenami w walucie agencji, zamawiaj eSIM dla podróżnego, przekazuj mu kod QR, sprawdzaj zużycie i doładowuj. Jeden bazowy URL obsługuje sandbox i Live. Zacznij od bezpłatnego klucza sandbox; klucze Live działają po zatwierdzeniu Twojej agencji.

Pobierz bezpłatne klucze sandboxCzytaj przewodnik po eSIM

Dokumentacja jest dostępna w języku angielskim.

Bazowy URL
https://api.fx-port.com/api/v1
Uwierzytelnianie
Authorization: Bearer fxp_test_...
Prefiksy kluczy
fxp_test_ / fxp_live_
Endpointy
12
Kraje z pakietami
190+
Języki przykładów kodu
9

Na tej stronie

  • Konsola
  • Pięć kroków
  • Ceny
  • Po sprzedaży
  • Endpointy
  • Produkcja
  • Sandbox
  • Kto na tym buduje
  • FAQ
  • Powiązane API
  • Zacznij

API eSIM, wywołanie po wywołaniu

Prześledź sprzedaż eSIM krok po kroku: każde żądanie jest budowane, wysyłane i otrzymuje odpowiedź. Sesje obejmują sprzedaż eSIM, utrzymanie łączności podróżnego, sprawdzanie urządzeń i rezerwacji oraz błędy, które warto obsłużyć. Żądania i odpowiedzi to przykłady z dokumentacji, a ta strona nigdy nie wywołuje API.

3 żądania: Wyświetl pakiety, Zamów eSIM, Odczytaj dane konfiguracyjne.

Sesja poglądowa: treści żądań i odpowiedzi to przykłady z dokumentacji, daty są przesunięte do przodu, by zawsze wypadały po dniu dzisiejszym, a czasy mają charakter poglądowy. Ta strona nie wysyła żadnych żądań.

Pobierz kolekcję Postman

Znajdź pakiet, zamów go, odczytaj dane konfiguracyjne

Zacznij od pakietów jednego kraju, zamów jeden dla podróżnego, a potem odczytaj dane konfiguracyjne zamówienia. Sandbox tworzy testowe eSIM z fikcyjnym kodem aktywacyjnym i niczego nie obciąża, a konsola pokazuje skróconą kopię odpowiedzi z katalogu.

  1. Wyświetl pakiety

    Wywołanie katalogu przyjmuje country i type i zwraca pasujące pakiety z cenami w walucie agencji. Zachowaj package_id pakietu wybranego przez podróżnego.

    Żądanie GET /esims/packages
    curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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
      }
    }

    Przykład skrócony do wyświetlenia

    • PASS Kod statusu to 200
    • PASS $.success równa się true
    • PASS $.data[0].package_id istnieje
    • PASS $.data[0].balance_debit_amount istnieje

    Opis GET /esims/packages w dokumentacji

  2. Zamów eSIM

    Utworzenie zamówienia wymaga package_id oraz adresu e-mail i numeru telefonu podróżnego. Zachowaj z odpowiedzi booking_id i data.iccid. W sandboxie balanceDebited, transactionCreated i payoutCreated mają wartość false.

    Żądanie 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"
    }'
    Odpowiedź 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
    }

    Przykład skrócony do wyświetlenia

    • PASS Kod statusu to 200
    • PASS $.environment równa się sandbox
    • PASS $.balance_debited równa się false
    • PASS $.data.iccid istnieje

    Opis POST /esims/orders w dokumentacji

  3. Odczytaj dane konfiguracyjne

    Wywołanie z danymi konfiguracyjnymi przyjmuje booking_id i zwraca kod QR, dane aktywacyjne, linki instalacyjne i kroki instalacji zamówienia. Pokazuj je tylko podróżnemu, który jest właścicielem eSIM.

    Żądanie 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"
    Odpowiedź 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"
      }
    }

    Przykład skrócony do wyświetlenia

    • PASS Kod statusu to 200
    • PASS $.data.package_id równa się france-in-7days-1gb
    • PASS $.data.sims[0].iccid istnieje

    Opis GET /esims/bookings/{booking_id}/setup-instructions w dokumentacji

Odczytaj zużycie, potem doładuj

Gdy podróżny ma już eSIM, odczytaj, ile danych zostało, zapytaj, które pakiety można dodać do tego konkretnego eSIM, a potem utwórz doładowanie. Zużycie jest zapisywane w pamięci podręcznej, więc wartość może mieć kilka minut. Historia doładowań jest na pasku bocznym i w transkrypcji.

  1. Odczytaj zużycie

    Wywołanie zużycia przyjmuje ICCID zamówienia i zwraca remaining oraz total w megabajtach, status i termin ważności. Odpowiedź pochodzi z pamięci podręcznej, a force=true ponownie pyta dostawcę.

    Żądanie GET /esims/usage/{iccid}
    curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.data.data.status równa się ACTIVE
    • PASS $.data.data.remaining istnieje

    Opis GET /esims/usage/{iccid} w dokumentacji

  2. Pakiety doładowań

    To wywołanie wyświetla pakiety, które można dziś dodać do tego konkretnego eSIM. Pusta lista oznacza, że teraz nie można go doładować. package_id doładowania weź z tej listy, nigdy z pierwotnego zamówienia.

    Żądanie GET /esims/topup-packages/{iccid}
    curl https://api.fx-port.com/api/v1/esims/topup-packages/8900000540463077957 \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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
          }
        ]
      }
    }

    Przykład skrócony do wyświetlenia

    • PASS Kod statusu to 200
    • PASS $.data.data ma 2 elementy
    • PASS $.data.data[0].type równa się topup

    Opis GET /esims/topup-packages/{iccid} w dokumentacji

  3. Utwórz doładowanie

    Utworzenie doładowania wymaga package_id z tej listy i ICCID. Na Live saldo jest obciążane dopiero po przyjęciu przez dostawcę. W sandboxie balance w odpowiedzi wynosi zero i nic nie jest obciążane.

    Żądanie 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"
    }'
    Odpowiedź 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 Kod statusu to 200
    • PASS $.environment równa się sandbox
    • PASS $.balance_debited równa się false
    • PASS $.data.balance.current równa się 0

    Opis POST /esims/topups w dokumentacji

  4. Historia doładowań

    Historia doładowań zawiera doładowania jednego eSIM, od najnowszych. Doładowań nie ma na liście rezerwacji, więc tu je znajdziesz.

    Żądanie 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"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.data[0].type równa się topup

    Opis GET /esims/bookings/{iccid}/topup-history w dokumentacji

Sprawdź urządzenie, potem odczytaj rezerwacje

Przed sprzedażą sprawdź, czy telefon podróżnego obsługuje eSIM. Po sprzedaży odczytaj swoje rezerwacje i sprawdź, czy dany numer rezerwacji należy do Ciebie. Zbiorczy odczyt zużycia jest na pasku bocznym.

  1. Sprawdź listę urządzeń

    Wywołanie zgodnych urządzeń zwraca urządzenia znane z obsługi eSIM, z polami brand, model i os. Wyszukaj telefon podróżnego przed sprzedażą.

    Żądanie GET /esims/compatible-devices
    curl https://api.fx-port.com/api/v1/esims/compatible-devices \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.success równa się true
    • PASS $.data[0].model istnieje

    Opis GET /esims/compatible-devices w dokumentacji

  2. Wyświetl rezerwacje

    Lista rezerwacji zwraca zamówienia eSIM Twojej agencji, od najnowszych. To żądanie prosi o jedną rezerwację przez limit, a pagination mówi, ile zamówień pasuje i czy następuje kolejna strona.

    Żądanie GET /esims/bookings
    curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.data ma 1 element
    • PASS $.pagination.has_more równa się true

    Opis GET /esims/bookings w dokumentacji

  3. Sprawdź własność

    Sprawdzenie własności odpowiada is_owner o wartości true, gdy rezerwacja należy do Twojej agencji. Rezerwacja innej agencji i rezerwacja, która nie istnieje, dostają tę samą odpowiedź, więc wywołanie nie służy do odgadywania numerów.

    Żądanie 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"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.is_owner równa się true

    Opis GET /esims/bookings/{booking_id}/verify w dokumentacji

  4. Zbiorczy odczyt zużycia

    Jedno wywołanie odczytuje zużycie kilku eSIM wymienionych w iccids i zwraca jeden wpis na ICCID, każdy z własnym status. Zawsze wysyłaj iccids.

    Żądanie GET /esims/usage/bulk
    curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Odpowiedź 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 Kod statusu to 200
    • PASS $.data[0].status równa się success

    Opis GET /esims/usage/bulk w dokumentacji

Niepowodzenia i jak reagować na każde

Wszystkie niepowodzenia mają jedną treść, a pierwszy element errors ma stały code. Te wywołania zamówień kończą się błędem celowo, każde z innego powodu i z inną reakcją.

  1. Klucz Odczyt przy zamówieniu

    Klucz Odczyt użyty w wywołaniu zamówienia jest odrzucany kodem 403 i read_write_permission_required, zanim treść zostanie odczytana. Przełącz się na klucz Odczyt + zapis.

    Żądanie 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"
    }'
    Odpowiedź 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 Kod statusu to 403
    • PASS Kod błędu to read_write_permission_required
    • PASS $.errors[0].type równa się permission_error

    Opis POST /esims/orders w dokumentacji

  2. Nieprawidłowy adres e-mail

    Wartość, która nie jest adresem e-mail, jest odrzucana kodem 400 i invalid_email, a field wskazuje email. Popraw wartość, zanim ponownie wyślesz zamówienie: to samo żądanie zakończy się tak samo.

    Żądanie 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"
    }'
    Odpowiedź 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 Kod statusu to 400
    • PASS Kod błędu to invalid_email
    • PASS $.errors[0].field równa się email

    Opis POST /esims/orders w dokumentacji

  3. Zdublowane zamówienie

    Zamówienie pakietu, który jest już przetwarzany, jest odrzucane kodem 409 i duplicate_request. Nie wysyłaj go od razu ponownie: najpierw wyszukaj rezerwację i zamów ponownie tylko wtedy, gdy żadna nie powstała.

    Żądanie 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"
    }'
    Odpowiedź 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 Kod statusu to 409
    • PASS Kod błędu to duplicate_request
    • PASS $.errors[0].type równa się conflict

    Opis POST /esims/orders w dokumentacji

  4. Zbyt wiele żądań

    Po przekroczeniu limitu na minutę wywołanie jest odrzucane kodem 429 i rate_limit_exceeded, a nagłówek Retry-After podaje, ile sekund czekać. Potem ponów z backoffem.

    Żądanie 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"
    }'
    Odpowiedź 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 Kod statusu to 429
    • PASS Kod błędu to rate_limit_exceeded
    • PASS Nagłówek Retry-After jest obecny
    • PASS $.errors[0].details.retry_after równa się 12

    Opis POST /esims/orders w dokumentacji

Od katalogu do podróżnego z łącznością w pięciu krokach

Integracja to krótka ścieżka: odczytaj katalog, utwórz zamówienie, przekaż podróżnemu eSIM, śledź zużycie i doładuj, gdy skończą się dane. Zmieniają coś tylko zamówienie i doładowanie. Każde inne wywołanie tylko odczytuje.

Odczytaj katalog dla jednego kierunku

Wyświetl pakiety jednego kraju, z cenami już w walucie agencji, i zachowaj package_id pakietu wybranego przez podróżnego. Zawsze wysyłaj country: cały katalog to bardzo duża odpowiedź bez paginacji. Identyfikatory pakietów odczytuj z odpowiedzi zamiast wpisywać je na stałe, bo katalog się zmienia.

  • GET /api/v1/esims/packages

Żądanie

curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
  -H "Authorization: Bearer fxp_test_YOUR_KEY"

Odpowiedź 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
  }
}

Katalog pakietów według kraju

Utwórz zamówienie

Wyślij package_id razem z adresem e-mail i numerem telefonu podróżnego. Jedno zamówienie tworzy dokładnie jedno eSIM, a na Live obciąża saldo Twojej agencji. Zachowaj z odpowiedzi booking_id i ICCID, bo każde kolejne wywołanie potrzebuje jednego z nich.

  • POST /api/v1/esims/orders

Żądanie

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

Odpowiedź 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
}
Co zawiera odpowiedź na zamówienie
PoleCo zawiera
booking_id Numer zamówienia w FX-Port. Zachowaj go na potrzeby danych konfiguracyjnych, sprawdzenia własności i własnej ewidencji.
data.iccid Identyfikator eSIM. Zużycie, doładowania i instrukcje instalacji są pobierane według ICCID.
data.sim.qrcode data.sim.qrcode_url Ciąg aktywacyjny zakodowany w kodzie QR oraz link do obrazu kodu QR.
data.sim.direct_apple_installation_url data.sim.sharing Link uruchamiający instalację na iPhonie oraz strona udostępniania, na której podróżny może otworzyć eSIM za pomocą kodu dostępu. Link dla Androida dodaje wywołanie z danymi konfiguracyjnymi.
Dane aktywacyjne są wrażliwe: pokazuj je tylko podróżnemu, który jest właścicielem eSIM.
Jeśli dostawca nie zwrócił jeszcze eSIM, zamówienie i tak istnieje: ICCID zaczyna się od PENDING-, a dane będą dostępne w wywołaniu z danymi konfiguracyjnymi, gdy tylko dostawca je przekaże.

Tworzenie zamówienia eSIM

Przekaż podróżnemu eSIM

Odpowiedź zawiera kod QR i jego ciąg aktywacyjny, więc możesz pokazać je na własnych ekranach. FX-Port prosi też dostawcę o wysłanie kodu QR i linku do udostępnienia na adres e-mail podróżnego, więc nie musisz tego przekazywać dalej. Wywołanie z danymi konfiguracyjnymi zwraca te same dane ponownie, także później, wraz z krokami instalacji.

  • GET /api/v1/esims/bookings/{booking_id}/setup-instructions

Żądanie

curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \
  -H "Authorization: Bearer fxp_test_YOUR_KEY"

Odpowiedź 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
  }
}

Dane konfiguracyjne według rezerwacji lub ICCID

Śledź zużycie

Odczytaj pozostałe dane i termin ważności eSIM według jego ICCID. Odpowiedź jest przechowywana w pamięci podręcznej nawet do 15 minut, więc używaj jej na ekranie lub w przypomnieniu, a nie jako licznika.

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

Żądanie

curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
  -H "Authorization: Bearer fxp_test_YOUR_KEY"

Odpowiedź 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"
    }
  }
}

Zużycie eSIM, pojedyncze i zbiorcze

Doładuj, gdy skończą się dane

Wyświetl pakiety, które można dodać do tego konkretnego eSIM, a potem utwórz doładowanie z jednym z nich. Jeśli lista jest pusta, tego eSIM nie można teraz doładować i podróżny potrzebuje nowego.

  • GET /api/v1/esims/topup-packages/{iccid}
  • POST /api/v1/esims/topups

Żądanie

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

Odpowiedź 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
}

Sprawdzanie i tworzenie doładowań

Ceny, prowizja i Twoje saldo

Każdy pakiet zawiera pola z kwotami, obliczone na serwerze w walucie Twojej agencji. Cena przesłana w treści żądania jest ignorowana, więc zamówienie zawsze powstaje po cenie wyliczonej przez serwer.

Pola z kwotami pakietu eSIM
PoleCo zawiera
base_price price Cena pakietu przed doliczeniem Twojej prowizji. To nie jest kwota obciążająca Twoje saldo.
total_price retail_price Cena do pobrania od podróżnego, z wliczoną Twoją prowizją.
balance_debit_amount b2b_price Kwota odejmowana od salda agencji, gdy zamawiasz pakiet na Live. Odczytuj ją, nie wyliczaj.
agency_commission commission_rate Twoja stawka prowizji, jako tekst i jako liczba. Rezerwacje zwracają Twoją prowizję jako kwotę.

W przykładzie z katalogu podróżny płaci 468.84 DZD. Zamówienie na Live obciąża Twoje saldo kwotą 418.60 DZD, a różnica, 50.24 DZD, to Twoja prowizja.

Stawka należy do Twojej agencji

Stawka prowizji wraca z każdym pakietem i nie jest taka sama dla każdej agencji. Agencja korporacyjna objęta umową może mieć stawkę zero, a wtedy cena całkowita jest równa obciążeniu.

Odczytuj pola, nie odtwarzaj ich

Obciążenie może być wyższe od ceny bazowej, bo wchodzą w nie kwoty specyficzne dla Twojej agencji. Dlatego odczytuj balance_debit_amount i nigdy nie wyliczaj go z base_price. Słowo price oznacza cenę bazową w katalogu, ale cenę detaliczną w zamówieniach, pakietach doładowań i danych konfiguracyjnych: używaj wszędzie base_price i total_price, a niejednoznaczność zniknie.

Ceny w walucie Twojej agencji

Każda kwota jest już przeliczona na walutę Twojej agencji, niezależnie od waluty dostawcy. Odpowiedź pokazuje też walutę dostawcy i kurs wymiany, więc możesz sam sprawdzić kurs i nigdy nie musisz przeliczać ponownie.

Jak powstają ceny eSIM

Po sprzedaży: zużycie, doładowania i dane konfiguracyjne

Sprzedaż nie kończy się na zamówieniu. Te wywołania utrzymują łączność podróżnego i działają tylko dla eSIM zamówionych przez Twoją agencję w tym samym środowisku co Twój klucz.

Odczyt zużycia i jego aktualność

Wywołanie zużycia zwraca pozostałe dane, limit pakietu, status i termin ważności jednego eSIM albo nawet 50 eSIM w jednym wywołaniu. FX-Port przechowuje ostatnią odpowiedź nawet do 15 minut, aby chronić limity zapytań dostawcy, więc podana wartość może być tak stara. Przekaż force=true, aby ponownie zapytać dostawcę, na przykład tuż po doładowaniu. Nie rób tego przy każdym żądaniu, bo dostawca ogranicza częstotliwość odczytu zużycia. Jeśli dostawca nie może odpowiedzieć, otrzymasz ostatnią znaną wartość oznaczoną jako nieaktualną.

Zużycie eSIM, pojedyncze i zbiorcze

Doładowania: najpierw zapytaj, potem utwórz

Doładowanie to dwa wywołania. Najpierw wyświetl pakiety, które można dodać do tego konkretnego eSIM, a potem utwórz doładowanie z jednym ze zwróconych identyfikatorów pakietu. Nigdy nie używaj ponownie identyfikatora pakietu z pierwotnego zamówienia i nie przechowuj pakietu doładowania na później: zapytaj ponownie, gdy podróżny zechce doładować eSIM. Doładowanie dodaje dane do eSIM i nie zastępuje tego, co zostało, więc wynik odczytaj ze zużycia z force=true.

Sprawdzanie i tworzenie doładowań

Gdy doładowanie nie jest możliwe

Dostawcy wybierają, którzy operatorzy sieci komórkowych obsługują dany kraj, i w rzadkich przypadkach zmieniają któregoś z nich. eSIM może wtedy działać do wygaśnięcia, a jego pakietu nie można już doładować. Lista pakietów doładowań wraca pusta. Jeśli dostawca odrzuci doładowanie, Twoje saldo pozostaje nietknięte, a próba zostaje zapisana jako nieudana rezerwacja. Odpowiedzią jest supplier_error, na który możesz zareagować.

Dlaczego doładowanie może być niedostępne

Dane konfiguracyjne i kroki instalacji

Wywołanie z danymi konfiguracyjnymi zwraca kod QR, dane aktywacyjne, linki instalacyjne i kroki instalacji zamówienia, kiedy tylko ich potrzebujesz. Wywołanie z instrukcjami zwraca kroki dla każdego systemu operacyjnego, w żądanym języku. Kroki to ogólny tekst od dostawcy, więc pokaż je obok kodu QR zamówienia. Oba pokazuj tylko podróżnemu, który jest właścicielem eSIM.

Dane konfiguracyjne według rezerwacji lub ICCID

Rezerwacje, historia doładowań i własność

Lista rezerwacji zwraca zamówienia eSIM Twojej agencji w środowisku Twojego klucza, od najnowszych. Możesz ją przeszukiwać według numeru rezerwacji, nazwiska podróżnego, adresu e-mail, nazwy pakietu lub ICCID. Doładowań nie ma na tej liście: odczytaj je z historii doładowań danego eSIM. Zanim zbudujesz link lub ekran wokół numeru rezerwacji, sprawdzenie własności powie, czy jest Twój. Rezerwacja innej agencji i rezerwacja, która nie istnieje, dostają tę samą odpowiedź.

Lista i weryfikacja rezerwacji eSIM

Każdy endpoint eSIM, z OpenAPI, Postmanem i przykładami kodu

API eSIM ma 12 endpointów pod jednym bazowym URL. Każdy wiersz otwiera stronę referencyjną danego wywołania z polami żądania, odpowiedziami, błędami i przykładami w 9 językach.

Endpointy API eSIM z metodą, ścieżką, uprawnieniem klucza i przeznaczeniem
EndpointDo czego służyKlucz
GET /api/v1/esims/packagesWyświetla pakiety jednego kraju lub regionu z cenami już w walucie agencji. Zawsze wysyłaj kraj: cały katalog jest bardzo duży i nie ma paginacji.Odczyt
GET /api/v1/esims/compatible-devicesUrządzenia znane z obsługi eSIM, do sprawdzenia, zanim podróżny kupi.Odczyt
POST /api/v1/esims/ordersTworzy jedno eSIM z pakietu dla podróżnego i konfiguruje je u dostawcy. Na Live obciąża saldo agencji.Odczyt + zapis
GET /api/v1/esims/topup-packages/{iccid}Pakiety, które można dziś dodać do jednego konkretnego eSIM. Pusta lista oznacza, że teraz nie można go doładować.Odczyt
POST /api/v1/esims/topupsDodaje pakiet doładowania do istniejącego eSIM. Na Live saldo jest obciążane dopiero po przyjęciu przez dostawcę.Odczyt + zapis
GET /api/v1/esims/usage/{iccid}Pozostałe dane, limit, status i termin ważności jednego eSIM. Odpowiedź może mieć nawet 15 minut.Odczyt
GET /api/v1/esims/usage/bulkZużycie nawet 50 eSIM w jednym wywołaniu, jeden wpis na ICCID, każdy z własnym statusem.Odczyt
GET /api/v1/esims/bookingsZamówienia eSIM Twojej agencji, od najnowszych, z wyszukiwaniem i paginacją. Doładowań nie ma na tej liście.Odczyt
GET /api/v1/esims/bookings/{iccid}/topup-historyDoładowania jednego eSIM, od najnowszych. Lista jest pusta, gdy eSIM nie ma żadnego doładowania.Odczyt
GET /api/v1/esims/bookings/{booking_id}/verifySprawdza, czy numer rezerwacji należy do Twojej agencji, zanim zbudujesz wokół niego link lub ekran.Odczyt
GET /api/v1/esims/bookings/{booking_id}/setup-instructionsKod QR, dane aktywacyjne, linki instalacyjne i kroki instalacji zamówienia, jako JSON.Odczyt
GET /api/v1/esims/instructions/{iccid}Instrukcje instalacji krok po kroku dla jednego ICCID, osobno dla każdego systemu operacyjnego, w żądanym języku.Odczyt

OpenAPI 3.1

Jeden plik opisuje każdy endpoint i każde pole. Wygeneruj z niego klienta, zaimportuj go do narzędzia API albo przekaż asystentowi programistycznemu.

Plik OpenAPI 3.1

Kolekcja Postman

Kolekcja eSIM obejmuje wszystkie 12 endpointów w folderach odpowiadających etapom sprzedaży. Nie zawiera kluczy, więc dodaj własne.

Kolekcja Postman dla eSIM

Przykłady kodu w 9 językach

Każda strona referencyjna pokazuje swoje żądanie w cURL, Node.js, Python, PHP, Go, Java, C#, Swift i Kotlin, wygenerowane z opisu OpenAPI. Każde żądanie eSIM jest dostępne we wszystkich z nich.

Pełna dokumentacja referencyjna API

Dokumentacja dla asystentów AI

llms.txt i llms-full.txt przekazują asystentom AI dokumentację jako zwykły tekst, a każdą stronę dokumentacji można odczytać jako Markdown, dodając .md do jej adresu.

Indeks llms.txt dla narzędzi AI

Dokumentacja API eSIM

Gotowe na produkcję: klucze, błędy, ponowienia i buforowanie

Integracja eSIM jest oceniana na produkcji pod kątem uwierzytelniania, błędów, ponowień, buforowania i limitów zapytań. Oto, co warto wiedzieć o każdym z nich.

Jeden bazowy URL, dwa rodzaje kluczy

Każde żądanie zawiera klucz jako token Bearer w nagłówku Authorization. Prefiks mówi, gdzie klucz działa: fxp_test_ w sandboxie i fxp_live_ na Live. Oba trafiają na ten sam bazowy URL, a każda odpowiedź JSON podaje w environment, z jakiego środowiska pochodzi. Klucze należą na Twój serwer, nigdy do przeglądarki ani aplikacji. FX-Port przechowuje tylko skrót każdego klucza, więc zgubionego klucza nie można wyświetlić ponownie. Zmiana klucza może zacząć działać po kilku minutach.

Środowiska i kolekcje Postman

Który klucz do jakiego wywołania

Klucz Odczyt może wyświetlać pakiety, sprawdzać urządzenia, odczytywać zużycie i rezerwacje. Utworzenie zamówienia lub doładowania wymaga klucza Odczyt + zapis, a klucz Odczyt, który spróbuje to zrobić, dostaje read_write_permission_required. Każdy klucz można ograniczyć do listy adresów IP, a wywołanie z innego adresu dostaje ip_not_allowed. Tam, gdzie kod tylko wyświetla wyniki, używaj klucza Odczyt.

Klucze i poziomy uprawnień

Jeden format błędu dla każdego niepowodzenia

Nieudane wywołanie zwraca tablicę errors. Jej pierwszy element ma stały code, type mówiący, jak zareagować, i field, którego dotyczy błąd. Testuj kod, nigdy komunikat. Lista błędów wspólna dla lotów, hoteli, eSIM i konta zawiera 180 kodów. Gdy dostawca odrzuci zamówienie lub doładowanie, odpowiedzią jest supplier_error z własnym statusem HTTP dostawcy. Nic nie jest obciążane, a nieudana rezerwacja zostaje zapisana. Tuż po restarcie katalog i lista urządzeń mogą odpowiedzieć 202 z success ustawionym na false: poczekaj kilka sekund i zapytaj ponownie.

Pełna lista kodów błędów

Ponawianie bez podwójnego zamówienia

FX-Port nie ma klucza idempotentności, więc nie ma nagłówka Idempotency-Key do wysłania. Odczyty można bezpiecznie powtarzać; utworzenia zamówienia lub doładowania nie. FX-Port odrzuca oczywisty duplikat kodem 409 i duplicate_request: zamówienie pakietu, który jest jeszcze przetwarzany. Na Live odrzuca też ten sam pakiet zamówiony ponownie w ciągu 60 sekund od ostatniego potwierdzonego zamówienia Twojej agencji, niezależnie od podróżnego. Zamówienia zwykle odpowiadają w kilka sekund, ale wolny dostawca może potrzebować znacznie więcej. Jeśli wywołanie przekroczy limit czasu lub połączenie zostanie zerwane, nie wysyłaj zamówienia od razu ponownie, bo eSIM może już istnieć. Poszukaj go parametrem search listy rezerwacji, podając adres e-mail podróżnego, i zamów ponownie tylko wtedy, gdy nic nie powstało.

Bezpieczne ponawianie po przekroczeniu limitu czasu

Bez webhooków: pytasz, gdy potrzebujesz

FX-Port nie wywołuje żadnego Twojego adresu URL, ani w sandboxie, ani na Live. Zamówienie odpowiada eSIM albo znacznikiem PENDING-, dopóki dostawca go nie zwróci. O wszystko inne pytasz wtedy, gdy tego potrzebujesz: dane konfiguracyjne, zużycie lub listę rezerwacji.

Buforowanie i szybkość

Zużycie jest przechowywane nawet do 15 minut, a lista pakietów doładowań przez kilka minut, a force=true pomija pamięć podręczną. Katalog bez filtra to bardzo duża odpowiedź bez paginacji, więc wysyłaj country i akceptuj kompresję przez Accept-Encoding: gzip. Nazwy pakietów wracają w języku parametru locale; pierwsze żądanie w języku innym niż angielski jest wolniejsze, bo tekst jest wtedy pobierany, a potem buforowany.

Limity zapytań

Limity są liczone na klucz i na minutę w dwóch grupach, a każda odpowiedź zawiera ratelimit-limit i ratelimit-remaining, więc możesz zwolnić, zanim zostaniesz odrzucony. Po 429 poczekaj liczbę sekund z Retry-After i ponów z wykładniczym backoffem i jitterem. Zbyt wiele zamówień lub doładowań jednego klucza albo agencji wykonywanych jednocześnie może dostać odpowiedź concurrency_limit_exceeded.

Limity zapytań eSIM na klucz
Rodzaj wywołaniaNa minutę
Tworzenie zamówień i doładowań1,200
Każdy inny endpoint eSIM6,000

Na razie pułap zamówień i doładowań wykonywanych jednocześnie działa w trybie obserwacji: jest liczony, ale nie egzekwowany, więc nic nie jest jeszcze z jego powodu odrzucane, a dzień jego egzekwowania ogłosi changelog. Traktuj te liczby jako obecną politykę, a nie obietnicę. Klucze sandbox mają te same liczniki na minutę co klucze Live, więc testy obciążeniowe planuj według harmonogramu, zamiast uruchamiać je w pętli.

Limity zapytań na klucz

Nazwy i wersje

Pola żądań mają format snake_case, na przykład first_name i agent_id. Starsze zapisy nadal działają: user_id jest odczytywane jako agent_id i dodaje wpis w warnings, a customer_email jest przyjmowane jako email bez takiego wpisu. W wielu odpowiedziach starszy klucz zostaje obok swojego odpowiednika snake_case z tą samą wartością, na przykład order_id obok code, a ?naming=snake zwraca wyłącznie klucze snake_case. Wersja jest w ścieżce, /api/v1: zmiana łamiąca zgodność dostałaby nowy prefiks, a nowe pola i zapisy są tylko dodawane, bez łamania zgodności.

Zacznij w bezpłatnym sandboxie, potem przejdź na Live

Wszystko na tej stronie działa dziś w sandboxie. Klucz sandbox zakładasz sam, jest bezpłatny i nigdy nie dotyka Twojego prawdziwego salda.

  1. 1

    Załóż konto

    Zarejestruj konto w FX-Port. Klucze sandbox są bezpłatne, a rezerwacje w sandboxie nie generują żadnych rzeczywistych opłat.

    Załóż konto w FX-Port

  2. 2

    Utwórz klucz sandbox

    Na stronie API w panelu utwórz klucz zaczynający się od fxp_test_. Klucz Odczyt może wyszukiwać i odczytywać dane; klucz Odczyt + zapis może także tworzyć rezerwacje testowe.

    Otwórz stronę API w panelu

  3. 3

    Wyślij pierwsze żądanie

    Adres bazowy jest jeden, a klucz przekazujesz w nagłówku Authorization jako token Bearer. Pierwsze wywołanie krok po kroku opisuje przewodnik Szybki start.

    Przeczytaj przewodnik Szybki start po API

  4. 4

    Przejdź na Live, gdy będziesz gotowy

    Podmień klucz na fxp_live_. Live działa po zatwierdzeniu Twojej agencji; do tego czasu API odpowiada 403 agency_not_active. Rzeczywiste rezerwacje opłaca się z zasilonego salda.

    Przeczytaj, jak działa przejście na Live

Pierwsze żądanie do katalogu w cURL. Dokumentacja pokazuje to samo żądanie w każdym obsługiwanym języku.

Żądanie

curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
  -H "Authorization: Bearer fxp_test_YOUR_KEY"

Szybki start: pierwsze wywołanie w sandboxie

Co robi sandbox

Zamówienie w sandboxie tworzy u dostawcy prawdziwe testowe eSIM z fikcyjnym kodem aktywacyjnym, więc nie da się go zainstalować w telefonie. Nic nie jest obciążane, o czym informują odpowiedzi: balanceDebited, transactionCreated i payoutCreated mają wartość false. Doładowanie zwraca saldo równe zero. Zużycie jest statyczne: nowe eSIM pokazuje pełny limit i status ACTIVE. Rezerwacje z sandboxa są widoczne tylko dla kluczy sandbox.

eSIM w sandboxie

Co może sprawdzić tylko Live

Kontrola salda, kontrola duplikatów i blokada salda działają tylko na Live. Dlatego odpowiedzi 402 z insufficient_balance, 409 dla tego samego pakietu zamówionego ponownie w ciągu 60 sekund oraz 503 z balance_lock_timeout nigdy nie pojawiają się w sandboxie. Ich obsługę napisz na podstawie listy kodów błędów.

Pełna lista kodów błędów

Przejście na Live

Klucze Live są powiązane z zatwierdzeniem agencji: dopóki Twoja agencja nie zostanie zatwierdzona, klucz Live odpowiada agency_not_active, a Twój klucz sandbox nadal działa. Zamówienia Live są opłacane z zasilonego salda agencji. Przejście na Live zmienia klucz, nie kod, bo sandbox i Live mają jeden bazowy URL.

Zatwierdzenie wymagane dla kluczy Live

Kto buduje na API eSIM

Każda grupa opiera się na innej części tych samych wywołań.

Agencje sprzedające podróże

Agencje sprzedają eSIM razem z lotem i hotelem. Zamawiają z własnym adresem e-mail podróżnego, aby dostawca wysłał kod QR i link do udostępnienia, a zużycie odczytują, gdy podróżny o nie zapyta. Stawka prowizji wraca z każdym pakietem, a agent_id zapisuje, który użytkownik Twojej agencji złożył zamówienie.

OTA i marketplace’y

Marketplace’y budują najpierw stronę przeglądania: jeden kraj naraz, pakiety lokalne lub regionalne, sieci i limit danych każdego pakietu oraz sprawdzenie urządzenia, zanim podróżny kupi. Ekran z listą eSIM podróżnego może odczytać zużycie nawet 50 z nich w jednym wywołaniu.

Zespoły travel-tech i korporacyjne

Zespoły technologiczne branży turystycznej i działy podróży służbowych budują własne narzędzia rezerwacyjne. Wszystko, czego potrzebują na start, jest publiczne: plik OpenAPI, kolekcja Postman i dokumentacja w postaci zwykłego tekstu, którą może czytać asystent AI do programowania, więc pierwszy prototyp powstaje na podstawie prawdziwego kontraktu.

API eSIM: najczęstsze pytania

Czym jest API eSIM FX-Port i dla kogo jest przeznaczone?

To REST API, dzięki któremu biuro podróży, OTA lub reseller sprzedaje eSIM z danymi dla podróżnych w ramach jednej integracji. Wyświetlasz pakiety danego kierunku z cenami w walucie agencji i zamawiasz jeden dla podróżnego. Przekazujesz mu kod QR, śledzisz zużycie i doładowujesz. Wszystko to JSON przez HTTPS, a plik OpenAPI opisuje każdy endpoint.

Czy jest bezpłatny sandbox i jak zdobyć klucz?

Tak. Załóż konto FX-Port, otwórz stronę API w panelu i utwórz klucz sandbox; możesz to zrobić sam, bez żadnych kosztów. Zamówienie w sandboxie tworzy testowe eSIM z fikcyjnym kodem aktywacyjnym, więc nie da się go zainstalować w telefonie. Twoje saldo nie jest obciążane. Sandbox i Live mają jeden bazowy URL, więc kod, który testujesz, jest kodem, który wdrażasz.

Czego wymaga przejście na Live?

Twoja agencja musi zostać zatwierdzona, zanim klucz Live zacznie działać. Do tego czasu klucz Live jest odrzucany, a Twój klucz sandbox nadal działa. Zamówienia Live są opłacane z zasilonego salda agencji, którego sandbox nigdy nie dotyka, a każdy klucz można ograniczyć do listy adresów IP. Przejście oznacza wyłącznie zmianę klucza; każda odpowiedź podaje środowisko, z którego pochodzi.

Jakie kraje i pakiety mogę sprzedawać?

Pakiety są dostępne dla ponad 190 krajów, a pakiety regionalne pojawiają się pod swoim regionem. Pakiety różnią się limitem danych, okresem ważności, sieciami i możliwością doładowania. Te pola oraz identyfikator pakietu odczytuj z odpowiedzi katalogu zamiast wpisywać je na stałe. Pytaj o jeden kraj naraz, bo cały katalog to bardzo duża odpowiedź. Osobna lista urządzeń pozwala sprawdzić telefon podróżnego przed sprzedażą.

Jak podróżny otrzymuje eSIM?

Odpowiedź na zamówienie zawiera kod QR, jego ciąg aktywacyjny, link instalacyjny dla iPhone’a i stronę udostępniania. Możesz pokazać je na własnych ekranach. FX-Port prosi też dostawcę o wysłanie kodu QR i linku do udostępnienia na adres e-mail podróżnego, gdy tylko eSIM zostanie utworzone. Jeśli dostawca nie zwrócił jeszcze eSIM, zamówienie i tak istnieje, a dane będą dostępne później w wywołaniu z danymi konfiguracyjnymi.

Jak łączą się ceny, prowizja i moje saldo?

Każdy pakiet zawiera te pola z kwotami w walucie agencji: cenę bazową przed prowizją, cenę całkowitą do pobrania od podróżnego, kwotę obciążającą Twoje saldo oraz stawkę prowizji. Twoja prowizja to cena całkowita minus obciążenie. Odczytuj te pola zamiast je odtwarzać, bo obciążenie jest specyficzne dla Twojej agencji. W sandboxie nic nie jest obciążane; na Live obciążenie opuszcza saldo agencji.

Czy mogę doładować eSIM i jak sprawdzić, ile zostało?

Tak, w dwóch wywołaniach: wyświetl pakiety, które można dodać do danego eSIM, a potem utwórz doładowanie z jednym z nich. Doładowanie nie zawsze jest możliwe, bo dostawca może zmienić operatora w danym kraju. Pusta lista oznacza wtedy, że podróżny potrzebuje nowego eSIM. Zużycie jest przechowywane w pamięci podręcznej nawet do 15 minut, więc traktuj je jako niedawną wartość, a jedno wywołanie odczytuje nawet 50 eSIM.

Jak raportowane są błędy i czy są webhooki?

Błąd wraca w jednym formacie ze stałym kodem błędu, i to ten kod powinien testować Twój program, a nie treść komunikatu. Odczyty można bezpiecznie powtarzać z backoffem. Utworzenie zamówienia lub doładowania jest inne: nie ma klucza idempotentności, więc po przekroczeniu limitu czasu wyszukaj rezerwację, zanim spróbujesz ponownie. FX-Port odrzuca oczywisty duplikat, na przykład ten sam pakiet zamówiony dwa razy w ciągu 60 sekund na Live. Webhooków nie ma.

Czy mogę anulować zamówienie eSIM lub zwrócić środki przez API?

Nie. API nie ma endpointu do anulowania zamówienia eSIM ani do zwrotu środków. Każde zamówienie tworzy dokładnie jedno eSIM, więc sprawdź pakiet i dane podróżnego, zanim je wyślesz. Jeśli dostawca odrzuci zamówienie, nic nie jest obciążane, a nieudana rezerwacja zostaje zapisana. W sprawie konkretnego zamówienia napisz do zespołu deweloperskiego i podaj numer rezerwacji.

Czego potrzebuję na start i jakie narzędzia pomagają?

Potrzebujesz klucza sandbox i klienta HTTP. Dokumentacja dodaje plik OpenAPI 3.1, kolekcję Postman, przykłady kodu w 9 językach oraz eksporty w zwykłym tekście dla asystentów AI. Trzymaj klucze na swoim serwerze, nigdy w przeglądarce ani aplikacji. Dłużej zajmie Ci własny proces zakupowy, przekazanie kodu QR podróżnemu i obsługa błędów.

Inne API FX-Port

eSIM zwykle idzie w parze z podróżą. Loty i hotele używają tych samych kluczy, tej samej treści błędów i tych samych konwencji co eSIM, a ich rezerwacje trafiają do tej samej historii konta.

  • API lotów

    Wyszukuj, wyceniaj i rezerwuj loty, opłacaj wstrzymane zamówienia, anuluj i odczytuj bilety.

  • API hoteli

    Znajdź hotele, sprawdzaj stawki, dokonuj wstępnej rezerwacji i rezerwacji, odczytuj vouchery i anuluj.

  • API transferówPodgląd

    Wyceniaj, rezerwuj, śledź i anuluj transfery lotniskowe.

Wolisz nie pisać kodu? Agencje mogą też sprzedawać eSIM z panelu FX-Port. Sprzedaż eSIM z panelu

Złóż pierwsze zamówienie eSIM w sandboxie

Załóż konto, utwórz klucz sandbox, wyświetl pakiety, złóż zamówienie i odczytaj zużycie już dziś. Klucze Live otrzymasz po zatwierdzeniu Twojej agencji.

Załóż kontoNapisz do zespołu deweloperskiego

Zapytaj asystenta AI o to API

Otwórz tę stronę w asystencie i poproś o plan integracji krok po kroku.

FX-PORT

Twoja zaufana platforma dystrybucji podróży B2B. Uzyskaj dostęp do globalnego inwentarza i rozwijaj swój biznes z lepszymi stawkami i łatwymi narzędziami.

  • Regulamin
  • Prywatność
  • Skontaktuj się z nami
  • Korporacyjny
  • Blog
  • API Loty B2B
  • API Transfery B2B
  • API Promy B2B
  • API Hotele B2B
  • B2B eSIM API
  • Bed Bank B2B
  • Konsolidator Lotów B2B
  • Linie Lotnicze
  • Lotniska
  • Kraje
  • eSIM

Usługi lotnicze

FX-Port to kompleksowa platforma dystrybucji lotów B2B, która pozwala agencjom podróży uzyskiwać dostęp i sprzedawać bilety lotnicze na całym świecie. Dzięki połączeniom z ponad 500 liniami lotniczymi agencje mogą oferować konkurencyjne stawki hurtowe z natychmiastowymi potwierdzeniami i automatyczną emisją biletów.

Nasza platforma zapewnia dostępność w trybie rzeczywistym, narzędzia do porównywania cen i automatyczne zarządzanie rezerwacjami. Agencje podróży mają dostęp do ekskluzywnych stawek B2B, mogą zarządzać prowizjami i optymalizować swoje operacje lotnicze za pomocą naszego zintegrowanego systemu.

Usługi zakwaterowania

Uzyskaj dostęp do naszej rozległej sieci ponad 1,5 miliona nieruchomości na całym świecie za pośrednictwem naszej platformy rezerwacji hoteli B2B. Agencje podróży mogą oferować konkurencyjne stawki z gwarantowanymi marżami i natychmiastowymi potwierdzeniami rezerwacji we wszystkich kategoriach zakwaterowania.

Od luksusowych resortów po opcje przyjazne budżetowi, nasza platforma zapewnia kompleksowe informacje o nieruchomościach, dynamiczne cenowanie i automatyczne zarządzanie rezerwacjami dla płynnej dystrybucji hotelowej.

Rozwiązania podróżne

Kompleksowe usługi transferowe z globalną siecią zweryfikowanych dostawców, oferujące transfery lotniskowe, wycieczki po mieście i profesjonalne usługi szofera. Nasz system rezerwacji promów łączy główne szlaki morskie z natychmiastową możliwością rezerwacji i konkurencyjnymi stawkami B2B. Specjalistyczne pakiety Umrah z kompleksową obsługą, w tym obsługą wizową, zakwaterowaniem i transportem.

Wyselekcjonowane pakiety podróży z dynamicznym cenowaniem i automatycznym zarządzaniem inwentarzem dla agencji podróży.

FX-Port rewolucjonizuje dystrybucję podróży B2B za pomocą zaawansowanej technologii i kompleksowych rozwiązań. Nasza platforma pozwala agencjom podróży uzyskiwać dostęp do globalnego inwentarza, efektywnie zarządzać rezerwacjami i rozwijać swój biznes z konkurencyjnymi stawkami i automatycznymi narzędziami.

Z obsługą wielu walut, lokalną obsługą płatności i wsparciem klientów 24/7 zapewniamy płynne działanie agencjom podróży na całym świecie. Nasza platforma oferuje dostępność w trybie rzeczywistym, natychmiastowe potwierdzenia i kompleksowe narzędzia zarządzania rezerwacjami.

Agencje podróży mogą wykorzystać naszą platformę do oferowania kompleksowej gamy usług podróżnych, w tym rezerwacji lotów, rezerwacji hotelowych, usług transferowych, biletów promowych, pakietów Umrah i wyselekcjonowanych doświadczeń podróżnych. Nasz rynek B2B łączy agencje z zweryfikowanymi dostawcami na całym świecie.

FX-Port zapewnia bezpieczeństwo na poziomie korporacji, automatyczne zarządzanie prowizjami i szczegółowe analizy dla wzrostu biznesowego. Dołącz do setek udanych agencji korzystających z naszej platformy do optymalizacji swoich operacji i rozszerzania zasięgu rynkowego.

© 2026 FX-PORT. Wszelkie prawa zastrzeżone.

Przejdź do treści
FX-Port dla dostawcówLoty—Linie lotnicze·Konsolidatorzy·OTA·Agencje GDSHotele—Bed banki·PMS/CMS·HoteleWszyscy dostawcy podróży
KorporacyjnyAPI
Zaloguj się
Uzyskaj dostęp teraz
Panel