1. Home
  2. eSIM API

NovitàAPI REST con file OpenAPI 3.1

API eSIM per agenzie di viaggio, OTA e rivenditori

Vendi eSIM da viaggio con una sola API REST. Elenca i pacchetti dati per paese con i prezzi nella valuta della tua agenzia, ordinane uno per il viaggiatore, consegnagli il codice QR, segui i consumi e ricarica. Un solo URL di base serve sandbox e live. Inizia con una chiave sandbox gratuita; le chiavi live funzionano dopo l’approvazione della tua agenzia.

Ottieni chiavi sandbox gratisLeggi la guida eSIM

La documentazione è scritta in inglese.

URL di base
https://api.fx-port.com/api/v1
Autenticazione
Authorization: Bearer fxp_test_...
Prefissi delle chiavi
fxp_test_ / fxp_live_
Endpoint
12
Paesi con pacchetti
190+
Linguaggi degli esempi
9

In questa pagina

  • Console
  • Cinque passaggi
  • Prezzi
  • Dopo la vendita
  • Endpoint
  • Produzione
  • Sandbox
  • Chi la usa
  • FAQ
  • API correlate
  • Inizia

L’API eSIM, chiamata per chiamata

Segui la vendita di una eSIM passo dopo passo, mentre ogni richiesta viene costruita, inviata e riceve risposta. Le sessioni coprono la vendita di una eSIM, la connessione del viaggiatore, la verifica di dispositivi e prenotazioni e gli errori da gestire. Richieste e risposte sono esempi tratti dalla documentazione e questa pagina non chiama mai l’API.

3 richieste: Elenca i pacchetti, Ordina la eSIM, Leggi i dati di configurazione.

Sessione illustrativa: i body sono esempi tratti dalla documentazione, le date sono spostate in avanti per restare successive a oggi e i tempi sono indicativi. Questa pagina non invia alcuna richiesta.

Scarica la collection Postman

Trova un pacchetto, ordinalo, leggi i dati di configurazione

Parti dai pacchetti di un paese, ordinane uno per un viaggiatore, poi leggi i dati di configurazione dell’ordine. La sandbox crea una eSIM di prova con un codice di attivazione fittizio e non addebita nulla, e la console mostra una copia ridotta della risposta del catalogo.

  1. Elenca i pacchetti

    La chiamata del catalogo accetta country e type e restituisce i pacchetti corrispondenti, con prezzi nella valuta della tua agenzia. Conserva il package_id di quello scelto dal viaggiatore.

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

    Esempio abbreviato per la visualizzazione

    • PASS Il codice di stato è 200
    • PASS $.success è uguale a true
    • PASS $.data[0].package_id esiste
    • PASS $.data[0].balance_debit_amount esiste

    Riferimento di GET /esims/packages nella documentazione

  2. Ordina la eSIM

    Per creare un ordine servono il package_id, l’indirizzo email e il numero di telefono del viaggiatore. Conserva booking_id e data.iccid della risposta. Nella sandbox, balanceDebited, transactionCreated e payoutCreated sono tutti false.

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

    Esempio abbreviato per la visualizzazione

    • PASS Il codice di stato è 200
    • PASS $.environment è uguale a sandbox
    • PASS $.balance_debited è uguale a false
    • PASS $.data.iccid esiste

    Riferimento di POST /esims/orders nella documentazione

  3. Leggi i dati di configurazione

    La chiamata dei dati di configurazione accetta il booking_id e restituisce il codice QR, i dati di attivazione, i link di installazione e i passaggi di installazione dell’ordine. Mostrali solo al viaggiatore proprietario della eSIM.

    Richiesta 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"
    Risposta 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"
      }
    }

    Esempio abbreviato per la visualizzazione

    • PASS Il codice di stato è 200
    • PASS $.data.package_id è uguale a france-in-7days-1gb
    • PASS $.data.sims[0].iccid esiste

    Riferimento di GET /esims/bookings/{booking_id}/setup-instructions nella documentazione

Leggi i consumi, poi ricarica

Quando un viaggiatore ha una eSIM, leggi quanti dati restano, chiedi quali pacchetti si possono aggiungere proprio a quella eSIM, poi crea la ricarica. I consumi sono in cache, quindi un valore può essere vecchio di alcuni minuti. Lo storico delle ricariche si trova nella barra laterale e nella trascrizione.

  1. Leggi i consumi

    La chiamata dei consumi accetta l’ICCID dell’ordine e restituisce remaining e total in megabyte, lo status e la scadenza. La risposta viene da una cache e force=true interroga di nuovo il fornitore.

    Richiesta GET /esims/usage/{iccid}
    curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Risposta 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 Il codice di stato è 200
    • PASS $.data.data.status è uguale a ACTIVE
    • PASS $.data.data.remaining esiste

    Riferimento di GET /esims/usage/{iccid} nella documentazione

  2. Elenca i pacchetti di ricarica

    Questa chiamata elenca i pacchetti che oggi si possono aggiungere proprio a questa eSIM. Un elenco vuoto significa che la eSIM ora non può essere ricaricata. Prendi il package_id della ricarica da questo elenco, mai dall’ordine originale.

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

    Esempio abbreviato per la visualizzazione

    • PASS Il codice di stato è 200
    • PASS $.data.data contiene 2 elementi
    • PASS $.data.data[0].type è uguale a topup

    Riferimento di GET /esims/topup-packages/{iccid} nella documentazione

  3. Crea la ricarica

    Per creare una ricarica servono il package_id di quell’elenco e l’ICCID. Su live il saldo viene addebitato solo dopo che il fornitore l’ha accettata. Nella sandbox il balance della risposta è zero e non viene addebitato nulla.

    Richiesta 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"
    }'
    Risposta 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 Il codice di stato è 200
    • PASS $.environment è uguale a sandbox
    • PASS $.balance_debited è uguale a false
    • PASS $.data.balance.current è uguale a 0

    Riferimento di POST /esims/topups nella documentazione

  4. Leggi lo storico delle ricariche

    Lo storico delle ricariche elenca le ricariche di una eSIM, dalla più recente. Le ricariche non sono nell’elenco delle prenotazioni, quindi è qui che le trovi.

    Richiesta 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"
    Risposta 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 Il codice di stato è 200
    • PASS $.data[0].type è uguale a topup

    Riferimento di GET /esims/bookings/{iccid}/topup-history nella documentazione

Controlla un dispositivo, poi leggi le prenotazioni

Prima della vendita, verifica che il telefono del viaggiatore supporti la eSIM. Dopo la vendita, leggi le tue prenotazioni e verifica che un riferimento di prenotazione sia tuo. I consumi in blocco sono elencati nella barra laterale.

  1. Controlla l’elenco dei dispositivi

    La chiamata dei dispositivi compatibili restituisce i dispositivi noti per supportare la eSIM, con brand, model e os. Cerca il telefono del viaggiatore prima di vendere.

    Richiesta GET /esims/compatible-devices
    curl https://api.fx-port.com/api/v1/esims/compatible-devices \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Risposta 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 Il codice di stato è 200
    • PASS $.success è uguale a true
    • PASS $.data[0].model esiste

    Riferimento di GET /esims/compatible-devices nella documentazione

  2. Elenca le prenotazioni

    L’elenco delle prenotazioni restituisce gli ordini eSIM della tua agenzia, dal più recente. Questa richiesta chiede una prenotazione con limit, e pagination indica quanti ordini corrispondono e se segue un’altra pagina.

    Richiesta GET /esims/bookings
    curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Risposta 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 Il codice di stato è 200
    • PASS $.data contiene 1 elemento
    • PASS $.pagination.has_more è uguale a true

    Riferimento di GET /esims/bookings nella documentazione

  3. Verifica la proprietà

    La verifica di proprietà risponde is_owner true quando la prenotazione appartiene alla tua agenzia. Una prenotazione di un’altra agenzia e una inesistente ricevono la stessa risposta, quindi la chiamata non serve a scoprire riferimenti.

    Richiesta 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"
    Risposta 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 Il codice di stato è 200
    • PASS $.is_owner è uguale a true

    Riferimento di GET /esims/bookings/{booking_id}/verify nella documentazione

  4. Leggi i consumi in blocco

    Una chiamata legge i consumi di più eSIM elencate in iccids e restituisce una voce per ICCID, ciascuna con il proprio status. Invia sempre iccids.

    Richiesta GET /esims/usage/bulk
    curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \
      -H "Authorization: Bearer fxp_test_YOUR_KEY"
    Risposta 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 Il codice di stato è 200
    • PASS $.data[0].status è uguale a success

    Riferimento di GET /esims/usage/bulk nella documentazione

Gli errori e come reagire a ciascuno

Tutti gli errori condividono un unico corpo e la prima voce di errors ha un code stabile. Queste chiamate d’ordine falliscono di proposito, ciascuna per un motivo diverso e con una reazione diversa.

  1. Chiave Lettura su un ordine

    Una chiave Lettura sulla chiamata dell’ordine viene rifiutata con 403 e read_write_permission_required, prima che il corpo venga letto. Passa a una chiave Lettura + scrittura.

    Richiesta 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"
    }'
    Risposta 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 Il codice di stato è 403
    • PASS Il codice di errore è read_write_permission_required
    • PASS $.errors[0].type è uguale a permission_error

    Riferimento di POST /esims/orders nella documentazione

  2. Indirizzo email non valido

    Un valore che non è un indirizzo email viene rifiutato con 400 e invalid_email, e field indica email. Correggi il valore prima di inviare di nuovo l’ordine: la stessa richiesta fallisce allo stesso modo.

    Richiesta 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"
    }'
    Risposta 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 Il codice di stato è 400
    • PASS Il codice di errore è invalid_email
    • PASS $.errors[0].field è uguale a email

    Riferimento di POST /esims/orders nella documentazione

  3. Ordine duplicato

    Un ordine per un pacchetto già in elaborazione viene rifiutato con 409 e duplicate_request. Non inviarlo subito di nuovo: cerca prima la prenotazione e ordina di nuovo solo se non ne è stata creata nessuna.

    Richiesta 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"
    }'
    Risposta 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 Il codice di stato è 409
    • PASS Il codice di errore è duplicate_request
    • PASS $.errors[0].type è uguale a conflict

    Riferimento di POST /esims/orders nella documentazione

  4. Troppe richieste

    Oltre il limite al minuto, la chiamata viene rifiutata con 429 e rate_limit_exceeded, e l’header Retry-After indica quanti secondi attendere. Poi riprova con backoff.

    Richiesta 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"
    }'
    Risposta 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 Il codice di stato è 429
    • PASS Il codice di errore è rate_limit_exceeded
    • PASS L’header Retry-After è presente
    • PASS $.errors[0].details.retry_after è uguale a 12

    Riferimento di POST /esims/orders nella documentazione

Dal catalogo al viaggiatore connesso in cinque passaggi

Un’integrazione è un percorso breve: leggi il catalogo, crea l’ordine, consegna la eSIM al viaggiatore, segui i consumi e ricarica quando i dati finiscono. Solo l’ordine e la ricarica modificano qualcosa. Ogni altra chiamata si limita a leggere.

Leggi il catalogo di una destinazione

Elenca i pacchetti di un paese, con i prezzi già nella valuta della tua agenzia, e conserva il package_id di quello scelto dal viaggiatore. Invia sempre country: l’intero catalogo è una risposta molto grande e senza paginazione. Leggi gli id dei pacchetti dalla risposta invece di scriverli nel codice, perché il catalogo cambia.

  • GET /api/v1/esims/packages

Richiesta

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

Risposta 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
  }
}

Catalogo dei pacchetti per paese

Crea l’ordine

Invia il package_id con l’indirizzo email e il numero di telefono del viaggiatore. Un ordine crea esattamente una eSIM e, su live, addebita il saldo della tua agenzia. Conserva il booking_id e l’ICCID della risposta, perché ogni chiamata successiva ne richiede uno.

  • POST /api/v1/esims/orders

Richiesta

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

Risposta 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
}
Che cosa contiene la risposta dell’ordine
CampoChe cosa contiene
booking_id Il riferimento FX-Port dell’ordine. Conservalo per i dati di configurazione, la verifica di proprietà e i tuoi registri.
data.iccid L’identificativo della eSIM. Consumi, ricariche e istruzioni di installazione si richiedono tutti tramite ICCID.
data.sim.qrcode data.sim.qrcode_url La stringa di attivazione codificata nel codice QR e un link all’immagine del codice QR.
data.sim.direct_apple_installation_url data.sim.sharing Un link che avvia l’installazione su iPhone e una pagina di condivisione in cui il viaggiatore può aprire la eSIM con il suo codice di accesso. La chiamata dei dati di configurazione aggiunge il link per Android.
I dati di attivazione sono sensibili: mostrali solo al viaggiatore proprietario della eSIM.
Se il fornitore non ha ancora restituito la eSIM, l’ordine esiste comunque: l’ICCID inizia con PENDING- e i dati sono disponibili dalla chiamata dei dati di configurazione appena il fornitore li ha.

Creare un ordine eSIM

Consegna la eSIM al viaggiatore

La risposta contiene il codice QR e la sua stringa di attivazione, così puoi mostrarli nelle tue schermate. FX-Port chiede inoltre al fornitore di inviare per email il codice QR e un link di condivisione all’indirizzo del viaggiatore, quindi non devi inoltrarlo tu. La chiamata dei dati di configurazione restituisce gli stessi dati anche in seguito, con i passaggi di installazione.

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

Richiesta

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

Risposta 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
  }
}

Dati di configurazione per prenotazione o ICCID

Segui i consumi

Leggi i dati residui e la scadenza di una eSIM tramite il suo ICCID. La risposta è in cache fino a 15 minuti: usala per una schermata o un promemoria, non come contatore.

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

Richiesta

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

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

Consumi eSIM singoli e in blocco

Ricarica quando i dati finiscono

Elenca i pacchetti che si possono aggiungere proprio a questa eSIM, poi crea la ricarica con uno di essi. Se l’elenco è vuoto, la eSIM non può essere ricaricata ora e il viaggiatore ha bisogno di una nuova.

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

Richiesta

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

Risposta 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
}

Verificare e creare ricariche

Prezzi, commissione e saldo

Ogni pacchetto riporta i propri campi monetari, calcolati sul server nella valuta della tua agenzia. Un prezzo nel corpo della richiesta viene ignorato, quindi un ordine viene sempre creato al prezzo calcolato dal server.

Campi monetari di un pacchetto eSIM
CampoChe cosa contiene
base_price price Il prezzo del pacchetto prima della tua commissione. Non è l’importo addebitato sul tuo saldo.
total_price retail_price Il prezzo da far pagare al viaggiatore, con la tua commissione inclusa.
balance_debit_amount b2b_price Ciò che esce dal saldo della tua agenzia quando ordini il pacchetto su live. Leggilo, non calcolarlo.
agency_commission commission_rate La tua percentuale di commissione, come testo e come numero. Le prenotazioni restituiscono invece la tua commissione come importo.

Nell’esempio del catalogo il viaggiatore paga 468.84 DZD. Un ordine su live addebita 418.60 DZD sul tuo saldo e la differenza, 50.24 DZD, è la tua commissione.

La percentuale appartiene alla tua agenzia

La percentuale di commissione torna con ogni pacchetto e non è uguale per tutte le agenzie. Un’agenzia corporate con contratto può avere una percentuale pari a zero e allora il prezzo totale coincide con l’addebito.

Leggi i campi, non ricostruirli

L’addebito può essere superiore al prezzo base, perché ne fanno parte importi specifici della tua agenzia. Leggi quindi balance_debit_amount e non calcolarlo mai da base_price. La parola price è il prezzo base nel catalogo, ma il prezzo al pubblico negli ordini, nei pacchetti di ricarica e nei dati di configurazione: usa base_price e total_price ovunque e l’ambiguità sparisce.

Prezzi nella valuta della tua agenzia

Ogni importo è già convertito nella valuta della tua agenzia, qualunque sia la valuta del fornitore. La risposta mostra anche la valuta del fornitore e il tasso di cambio, così puoi verificare il tasso da solo e non devi più convertire nulla.

Come si formano i prezzi eSIM

Dopo la vendita: consumi, ricariche e dati di configurazione

Una vendita non finisce con l’ordine. Queste chiamate mantengono il viaggiatore connesso e funzionano solo sulle eSIM ordinate dalla tua agenzia nello stesso ambiente della tua chiave.

Leggere i consumi e quanto sono aggiornati

I consumi restituiscono i dati residui, il totale incluso, lo stato e la scadenza di una eSIM, oppure di un massimo di 50 eSIM in una sola chiamata. FX-Port conserva l’ultima risposta fino a 15 minuti per proteggere i rate limit del fornitore, quindi un valore può avere quell’età. Passa force=true per interrogare di nuovo il fornitore, per esempio subito dopo una ricarica. Non farlo a ogni richiesta, perché il fornitore limita la frequenza di lettura dei consumi. Se il fornitore non risponde, ricevi l’ultimo valore noto contrassegnato come non aggiornato.

Consumi eSIM singoli e in blocco

Ricariche: prima chiedi, poi crea

Una ricarica richiede due chiamate. Prima elenca i pacchetti che si possono aggiungere proprio a questa eSIM, poi crea la ricarica con uno degli id restituiti. Non riutilizzare mai l’id del pacchetto dell’ordine originale e non conservare un pacchetto di ricarica per dopo: chiedi di nuovo quando il viaggiatore vuole ricaricare. Una ricarica aggiunge dati alla eSIM e non sostituisce quelli rimasti, quindi leggi il risultato dai consumi con force=true.

Verificare e creare ricariche

Quando una ricarica non è possibile

I fornitori scelgono quali operatori mobili servono un paese e, in rari casi, ne cambiano uno. La eSIM può allora continuare a funzionare fino alla scadenza, mentre il suo pacchetto non può più essere ricaricato. L’elenco dei pacchetti di ricarica torna vuoto. Se un fornitore rifiuta una ricarica, il tuo saldo non viene toccato e il tentativo viene salvato come prenotazione non riuscita. La risposta è un supplier_error a cui puoi reagire.

Perché una ricarica può non essere disponibile

Dati di configurazione e passaggi di installazione

La chiamata dei dati di configurazione restituisce, quando ti servono, il codice QR, i dati di attivazione, i link di installazione e i passaggi di installazione di un ordine. La chiamata delle istruzioni restituisce i passaggi per sistema operativo, nella lingua richiesta. I passaggi sono un testo generico del fornitore, quindi mostrali accanto al codice QR dell’ordine. Mostra entrambi solo al viaggiatore proprietario della eSIM.

Dati di configurazione per prenotazione o ICCID

Prenotazioni, storico delle ricariche e proprietà

L’elenco delle prenotazioni restituisce gli ordini eSIM della tua agenzia nell’ambiente della tua chiave, dal più recente. Puoi cercare per id prenotazione, nome del viaggiatore, indirizzo email, nome del pacchetto o ICCID. Le ricariche non sono in quell’elenco: leggile con lo storico delle ricariche di una eSIM. Prima di costruire un link o una schermata attorno a un id prenotazione, la verifica di proprietà ti dice se è tuo. Una prenotazione di un’altra agenzia e una inesistente ricevono la stessa risposta.

Elencare e verificare prenotazioni eSIM

Tutti gli endpoint eSIM, con OpenAPI, Postman ed esempi di codice

L’API eSIM ha 12 endpoint sotto un solo URL di base. Ogni riga apre la pagina di riferimento di quella chiamata, con campi della richiesta, risposte, errori ed esempi in 9 linguaggi.

Endpoint dell’API eSIM con metodo, percorso, permesso della chiave e scopo
EndpointCosa faChiave
GET /api/v1/esims/packagesElenca i pacchetti di un paese o di una regione, con prezzi già nella valuta della tua agenzia. Invia sempre un paese: l’intero catalogo è molto grande e senza paginazione.Lettura
GET /api/v1/esims/compatible-devicesI dispositivi noti per supportare la eSIM, per un controllo prima dell’acquisto del viaggiatore.Lettura
POST /api/v1/esims/ordersCrea una eSIM da un pacchetto per un viaggiatore e la attiva presso il fornitore. Su live addebita il saldo della tua agenzia.Lettura+Scrittura
GET /api/v1/esims/topup-packages/{iccid}I pacchetti che oggi si possono aggiungere a una eSIM precisa. Un elenco vuoto significa che ora non può essere ricaricata.Lettura
POST /api/v1/esims/topupsAggiunge un pacchetto di ricarica a una eSIM esistente. Su live il saldo viene addebitato solo dopo che il fornitore l’ha accettato.Lettura+Scrittura
GET /api/v1/esims/usage/{iccid}I dati residui, il totale incluso, lo stato e la scadenza di una eSIM. La risposta può essere vecchia fino a 15 minuti.Lettura
GET /api/v1/esims/usage/bulkI consumi di un massimo di 50 eSIM in una sola chiamata, una voce per ICCID, ciascuna con il proprio stato.Lettura
GET /api/v1/esims/bookingsGli ordini eSIM della tua agenzia, dal più recente, con ricerca e paginazione. Le ricariche non sono in questo elenco.Lettura
GET /api/v1/esims/bookings/{iccid}/topup-historyLe ricariche di una eSIM, dalla più recente. L’elenco è vuoto se la eSIM non ne ha.Lettura
GET /api/v1/esims/bookings/{booking_id}/verifyVerifica che un riferimento di prenotazione appartenga alla tua agenzia, prima di costruire un link o una schermata attorno ad esso.Lettura
GET /api/v1/esims/bookings/{booking_id}/setup-instructionsIl codice QR, i dati di attivazione, i link di installazione e i passaggi di installazione di un ordine, in JSON.Lettura
GET /api/v1/esims/instructions/{iccid}Istruzioni di installazione passo dopo passo per un ICCID, per sistema operativo, nella lingua richiesta.Lettura

OpenAPI 3.1

Un solo file descrive ogni endpoint e ogni campo. Generaci un client, importalo in uno strumento per API o consegnalo a un assistente di programmazione.

File OpenAPI 3.1

Collection Postman

La collection eSIM copre tutti i 12 endpoint in cartelle che seguono le fasi di una vendita. Non contiene chiavi, quindi aggiungi le tue.

Collection Postman per eSIM

Esempi di codice in 9 linguaggi

Ogni pagina di riferimento riporta la propria richiesta in cURL, Node.js, Python, PHP, Go, Java, C#, Swift e Kotlin, generata dalla descrizione OpenAPI. Ogni richiesta eSIM è disponibile in tutti.

Riferimento completo dell’API

Documentazione per assistenti IA

llms.txt e llms-full.txt offrono agli assistenti IA la documentazione come testo semplice, e ogni pagina della documentazione si legge in Markdown aggiungendo .md al suo indirizzo.

Indice llms.txt per strumenti IA

Documentazione dell’API eSIM

Pronta per la produzione: chiavi, errori, nuovi tentativi e cache

Un’integrazione eSIM si valuta in produzione su autenticazione, errori, nuovi tentativi, cache e rate limit. Ecco che cosa sapere su ciascuno.

Un solo URL di base, due tipi di chiave

Ogni richiesta porta una chiave come bearer token nell’header Authorization. Il prefisso indica dove funziona la chiave: fxp_test_ per la sandbox e fxp_live_ per live. Entrambe usano lo stesso URL di base e ogni risposta JSON indica in environment l’ambiente da cui proviene. Le chiavi vanno tenute sul tuo server, mai in un browser o in un’app. FX-Port conserva solo un hash di ogni chiave, quindi una chiave persa non può essere mostrata di nuovo. Una modifica a una chiave può richiedere alcuni minuti per essere applicata.

Ambienti e collection Postman

Quale chiave fa quale chiamata

Una chiave Lettura può elencare i pacchetti, controllare i dispositivi, leggere i consumi e leggere le prenotazioni. Creare un ordine o una ricarica richiede una chiave Lettura + scrittura, e una chiave Lettura che ci prova riceve read_write_permission_required. Qualsiasi chiave può essere vincolata a un elenco di indirizzi IP e una chiamata da un altro indirizzo riceve ip_not_allowed. Usa una chiave Lettura ovunque il codice si limiti a mostrare risultati.

Chiavi e livelli di permesso

Un unico formato per tutti gli errori

Una chiamata fallita restituisce un array errors. La prima voce ha un code stabile, un type che indica come reagire e il field in errore. Verifica il codice, mai il messaggio. L’elenco di errori condiviso da voli, hotel, eSIM e account contiene 180 codici. Quando il fornitore rifiuta un ordine o una ricarica, la risposta è un supplier_error con lo stato HTTP del fornitore stesso. Nulla viene addebitato e viene salvata una prenotazione non riuscita. Subito dopo un riavvio, il catalogo e l’elenco dei dispositivi possono rispondere 202 con success impostato a false: attendi qualche secondo e riprova.

L’elenco completo dei codici di errore

Riprovare senza ordinare due volte

FX-Port non ha una chiave di idempotenza, quindi non esiste un header Idempotency-Key da inviare. Le letture si possono ripetere senza rischi; creare un ordine o una ricarica no. FX-Port rifiuta un duplicato evidente con 409 e duplicate_request: un ordine per un pacchetto ancora in elaborazione. Su live rifiuta anche lo stesso pacchetto ordinato di nuovo entro 60 secondi dall’ultimo ordine confermato della tua agenzia, chiunque sia il viaggiatore. Gli ordini di solito rispondono in pochi secondi, ma un fornitore lento può impiegare molto di più. Se una chiamata va in timeout o la connessione cade, non inviare subito di nuovo l’ordine, perché la eSIM potrebbe esistere. Cercala con il parametro search dell’elenco delle prenotazioni, usando l’indirizzo email del viaggiatore, e ordina di nuovo solo se non è stato creato nulla.

Riprovare in sicurezza dopo un timeout

Nessun webhook: chiedi quando ti serve

FX-Port non chiama alcun URL tuo, né in sandbox né su live. Un ordine risponde con la eSIM, oppure con un segnaposto PENDING- finché il fornitore non l’ha restituita. Tutto il resto lo chiedi tu quando ti serve: i dati di configurazione, i consumi o l’elenco delle prenotazioni.

Cache e velocità

I consumi vengono conservati fino a 15 minuti e l’elenco dei pacchetti di ricarica per alcuni minuti, mentre force=true salta la cache. Il catalogo senza filtri è una risposta molto grande e senza paginazione, quindi invia country e accetta la compressione con Accept-Encoding: gzip. I titoli dei pacchetti tornano nella lingua del parametro locale; la prima richiesta in una lingua diversa dall’inglese è più lenta, perché il testo viene recuperato in quel momento e poi messo in cache.

Rate limit

I limiti sono conteggiati per chiave e al minuto in due gruppi, e ogni risposta contiene ratelimit-limit e ratelimit-remaining, così puoi rallentare prima di essere rifiutato. Dopo un 429, attendi i secondi indicati in Retry-After e riprova con backoff esponenziale e jitter. Troppi ordini o ricariche della stessa chiave o della stessa agenzia in esecuzione contemporaneamente possono ricevere come risposta concurrency_limit_exceeded.

Rate limit eSIM per chiave
Tipo di chiamataAl minuto
Creazione di ordini e ricariche1,200
Ogni altro endpoint eSIM6,000

Per ora il limite agli ordini e alle ricariche in esecuzione contemporaneamente è in modalità di osservazione: viene conteggiato ma non applicato, quindi per ora nulla viene rifiutato a causa sua, e il changelog annuncia il giorno in cui verrà applicato. Considera questi numeri come la politica attuale e non come una promessa. Le chiavi sandbox hanno gli stessi contatori al minuto delle chiavi live, quindi pianifica i test di carico invece di eseguirli in un ciclo.

Rate limit per chiave

Nomi e versioni

I campi della richiesta sono in snake_case, come first_name e agent_id. Le grafie precedenti funzionano ancora: user_id viene letto come agent_id e aggiunge una voce in warnings, mentre customer_email viene accettato come email senza alcun avviso. Molte risposte mantengono una chiave più vecchia accanto al suo gemello in snake_case con lo stesso valore, come order_id accanto a code, e ?naming=snake restituisce solo chiavi in snake_case. La versione sta nel percorso, /api/v1: una modifica non retrocompatibile avrebbe un nuovo prefisso, mentre nuovi campi e grafie sono aggiunte compatibili.

Inizia nella sandbox gratuita, poi passa a live

Tutto ciò che c’è in questa pagina oggi funziona nella sandbox. Una chiave sandbox è gratuita e si crea in autonomia, e non tocca mai il tuo saldo reale.

  1. 1

    Crea un account

    Registra un account FX-Port. Le chiavi sandbox sono gratuite e le prenotazioni sandbox non comportano addebiti reali.

    Crea il tuo account FX-Port

  2. 2

    Crea una chiave sandbox

    Nella pagina API della tua dashboard crea una chiave che inizia con fxp_test_. Una chiave di lettura può cercare e leggere; una chiave di lettura e scrittura può anche creare prenotazioni di prova.

    Apri la pagina API della dashboard

  3. 3

    Invia la prima richiesta

    Esiste un solo URL di base e la chiave va nell’header Authorization come bearer token. La guida rapida illustra una prima chiamata.

    Leggi la guida rapida alle API

  4. 4

    Passa a Live quando sei pronto

    Sostituisci la chiave con una fxp_live_. Live funziona quando la tua agenzia è stata approvata; fino ad allora l’API risponde 403 agency_not_active. Le prenotazioni reali si pagano da un saldo ricaricato.

    Leggi come funziona il passaggio a Live

Una prima richiesta al catalogo in cURL. La documentazione riporta la stessa richiesta in tutti i linguaggi supportati.

Richiesta

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

Guida rapida: prima chiamata sandbox

Che cosa fa la sandbox

Un ordine nella sandbox crea una vera eSIM di prova presso il fornitore, con un codice di attivazione fittizio, quindi non si può installare su un telefono. Nulla viene addebitato e le risposte lo dicono: balanceDebited, transactionCreated e payoutCreated sono tutti false. Una ricarica risponde con un saldo pari a zero. I consumi sono statici: una nuova eSIM mostra tutto il totale incluso e lo stato ACTIVE. Le prenotazioni sandbox sono visibili solo alle chiavi sandbox.

Le eSIM nella sandbox

Che cosa si può provare solo su live

Il controllo del saldo, il controllo dei duplicati e il blocco del saldo funzionano solo su live. Quindi le risposte 402 con insufficient_balance, 409 per lo stesso pacchetto ordinato di nuovo entro 60 secondi e 503 con balance_lock_timeout non compaiono mai nella sandbox. Scrivi la loro gestione partendo dall’elenco dei codici di errore.

L’elenco completo dei codici di errore

Passare a live

Le chiavi live sono legate all’approvazione dell’agenzia: finché la tua agenzia non è approvata, una chiave live risponde agency_not_active e la tua chiave sandbox continua a funzionare. Gli ordini live si pagano da un saldo agenzia con fondi disponibili. Passare a live cambia la chiave, non il codice, perché sandbox e live condividono lo stesso URL di base.

Approvazione richiesta per le chiavi live

Chi costruisce sull’API eSIM

Ogni tipo di cliente si appoggia a una parte diversa delle stesse chiamate.

Agenzie che vendono viaggi

Le agenzie vendono una eSIM insieme al volo e all’hotel. Ordinano con l’indirizzo email del viaggiatore, così il fornitore invia il codice QR e un link di condivisione, e leggono i consumi quando un viaggiatore lo chiede. La percentuale di commissione torna con ogni pacchetto e agent_id registra quale utente della tua agenzia ha effettuato un ordine.

OTA e marketplace

I marketplace costruiscono prima la pagina di consultazione: un paese alla volta, pacchetti locali o regionali, le reti e i dati inclusi di ogni pacchetto, e un controllo del dispositivo prima dell’acquisto del viaggiatore. Una schermata che elenca le eSIM di un viaggiatore può leggere in una sola chiamata i consumi di un massimo di 50 eSIM.

Team travel-tech e aziendali

I team travel-tech e i reparti viaggi aziendali costruiscono i propri strumenti di prenotazione. Tutto ciò che serve per iniziare è pubblico: il file OpenAPI, la collection Postman e una documentazione in testo semplice che un assistente IA di programmazione può leggere, così il primo prototipo parte dal contratto reale.

API eSIM: domande frequenti

Che cos’è l’API eSIM di FX-Port e a chi è rivolta?

È un’API REST che permette a un’agenzia di viaggio, a una OTA o a un rivenditore di vendere eSIM dati da viaggio con una sola integrazione. Elenchi i pacchetti di una destinazione con prezzi nella valuta della tua agenzia e ne ordini uno per un viaggiatore. Consegni al viaggiatore il codice QR, segui i consumi e ricarichi. Tutto è JSON su HTTPS e un file OpenAPI descrive ogni endpoint.

Esiste una sandbox gratuita e come si ottiene una chiave?

Sì. Crea un account FX-Port, apri la pagina API della tua dashboard e crea una chiave sandbox: puoi farlo in autonomia e senza costi. Un ordine nella sandbox crea una eSIM di prova con un codice di attivazione fittizio, quindi non si può installare su un telefono. Dal tuo saldo non viene addebitato nulla. Sandbox e live condividono lo stesso URL di base, quindi il codice che provi è il codice che pubblichi.

Che cosa serve per passare a live?

La tua agenzia deve essere approvata prima che una chiave live funzioni. Fino ad allora una chiave live viene rifiutata e la tua chiave sandbox continua a funzionare. Gli ordini live si pagano da un saldo agenzia con fondi disponibili, che la sandbox non tocca mai, e ogni chiave può essere vincolata a un elenco di indirizzi IP. Il passaggio consiste solo nel cambiare la chiave; ogni risposta indica l’ambiente da cui proviene.

In quali paesi e con quali pacchetti posso vendere?

I pacchetti sono disponibili in almeno 190 paesi e i bundle regionali compaiono sotto la loro regione. I pacchetti differiscono per dati inclusi, validità, reti e possibilità di ricarica. Leggi questi campi e l’id del pacchetto dalla risposta del catalogo invece di scriverli nel codice. Chiedi un paese alla volta, perché l’intero catalogo è una risposta molto grande. Un elenco separato dei dispositivi permette di controllare il telefono del viaggiatore prima della vendita.

Come riceve la eSIM il viaggiatore?

La risposta dell’ordine contiene il codice QR, la sua stringa di attivazione, un link di installazione per iPhone e una pagina di condivisione. Puoi mostrarli nelle tue schermate. FX-Port chiede inoltre al fornitore di inviare per email il codice QR e un link di condivisione all’indirizzo del viaggiatore appena la eSIM viene creata. Se il fornitore non ha ancora restituito la eSIM, l’ordine esiste comunque e i dati sono disponibili in seguito dalla chiamata dei dati di configurazione.

Come si combinano prezzi, commissione e saldo?

Ogni pacchetto riporta questi campi monetari nella valuta della tua agenzia: il prezzo base prima della commissione, il prezzo totale da far pagare al viaggiatore, l’importo addebitato sul tuo saldo e la tua percentuale di commissione. La tua commissione è il prezzo totale meno l’addebito. Leggi questi campi invece di ricostruirli, perché l’addebito è specifico della tua agenzia. Nella sandbox non viene addebitato nulla; su live l’addebito esce dal saldo della tua agenzia.

Posso ricaricare una eSIM e come vedo quanto resta?

Sì, in due chiamate: elenca i pacchetti che si possono aggiungere a quella eSIM, poi crea la ricarica con uno di essi. Una ricarica non è sempre possibile, perché un fornitore può cambiare l’operatore di un paese. Un elenco vuoto significa allora che il viaggiatore ha bisogno di una nuova eSIM. I consumi sono in cache fino a 15 minuti, quindi considerali un valore recente, e una chiamata legge fino a 50 eSIM.

Come vengono segnalati gli errori e ci sono webhook?

Un errore torna in un unico formato con un codice di errore stabile, ed è quel codice che il tuo programma deve verificare, non il testo del messaggio. Le letture si possono ripetere in sicurezza con backoff. Creare un ordine o una ricarica è diverso: non c’è una chiave di idempotenza, quindi dopo un timeout cerca la prenotazione prima di riprovare. FX-Port rifiuta un duplicato evidente, come lo stesso pacchetto ordinato due volte entro 60 secondi su live. Non ci sono webhook.

Posso annullare o rimborsare un ordine eSIM tramite l’API?

No. L’API non ha un endpoint per annullare o rimborsare un ordine eSIM. Ogni ordine crea esattamente una eSIM, quindi controlla il pacchetto e i dati del viaggiatore prima di inviarlo. Se il fornitore rifiuta un ordine, non viene addebitato nulla e viene salvata una prenotazione non riuscita. Per un problema su un ordine specifico, scrivi al team sviluppatori indicando il suo id prenotazione.

Che cosa serve per iniziare e quali strumenti aiutano?

Servono una chiave sandbox e un client HTTP. La documentazione aggiunge un file OpenAPI 3.1, una collection Postman, esempi di codice in 9 linguaggi ed esportazioni in testo semplice per gli assistenti IA. Tieni le chiavi sul tuo server, mai in un browser o in un’app. La parte che richiede più tempo è il tuo checkout, la consegna del codice QR al viaggiatore e la gestione degli errori.

Altre API di FX-Port

Una eSIM di solito accompagna un viaggio. Voli e hotel usano le stesse chiavi, lo stesso corpo di errore e le stesse convenzioni delle eSIM, e le loro prenotazioni si trovano nello stesso storico dell’account.

  • API Voli

    Cerca, calcola il prezzo e prenota voli, paga gli ordini in attesa, annulla e leggi i biglietti.

  • API Hotel

    Trova hotel, verifica le tariffe, effettua la pre-prenotazione e la prenotazione, leggi i voucher e annulla.

  • API TransferAnteprima

    Richiedi preventivi, prenota, segui e annulla i transfer aeroportuali.

Preferisci non scrivere codice? Le agenzie possono vendere eSIM anche dalla dashboard di FX-Port. Vendi eSIM dalla dashboard

Esegui il tuo primo ordine eSIM nella sandbox

Crea un account, genera una chiave sandbox, elenca i pacchetti, crea un ordine e leggi i consumi oggi stesso. Le chiavi live seguono quando la tua agenzia è approvata.

Crea il tuo accountScrivi al team sviluppatori

Chiedi a un assistente IA di questa API

Apri questa pagina in un assistente e chiedi un piano di integrazione passo per passo.

FX-PORT

La tua piattaforma di distribuzione viaggi B2B affidabile. Accedi all'inventario globale e fai crescere la tua attività con tariffe migliori e strumenti facili da usare.

  • Termini
  • Privacy
  • Contattaci
  • Aziendale
  • Blog
  • API Voli B2B
  • API Transfer B2B
  • API Traghetti B2B
  • API Hotel B2B
  • B2B eSIM API
  • Bed Bank B2B
  • Consolidatore Voli B2B
  • Compagnie Aeree
  • Aeroporti
  • Paesi
  • eSIM

Servizi di Volo

FX-Port è una piattaforma di distribuzione voli B2B completa che consente alle agenzie di viaggi di accedere e vendere biglietti aerei in tutto il mondo. Con connessioni a oltre 500 compagnie aeree, le agenzie possono offrire tariffe all'ingrosso competitive con conferme istantanee e ticketing automatizzato.

La nostra piattaforma offre disponibilità in tempo reale, strumenti di confronto prezzi e gestione automatizzata delle prenotazioni. Le agenzie di viaggi possono accedere a tariffe aeree B2B esclusive, gestire commissioni e ottimizzare le operazioni di volo attraverso il nostro sistema integrato.

Servizi di Alloggio

Accedi alla nostra vasta rete di oltre 1,5 milioni di proprietà in tutto il mondo attraverso la nostra piattaforma di prenotazione alberghiera B2B. Le agenzie di viaggi possono offrire tariffe competitive con margini garantiti e conferme istantanee delle camere in tutte le categorie di alloggio.

Dai resort di lusso alle opzioni economiche, la nostra piattaforma fornisce informazioni complete sulle proprietà, prezzi dinamici e gestione automatizzata delle prenotazioni per una distribuzione alberghiera senza interruzioni.

Soluzioni di Viaggio

Servizi di trasferimento completi con una rete globale di fornitori verificati, offrendo trasferimenti aeroportuali, tour cittadini e servizi di autista professionale. Il nostro sistema di prenotazione traghetti collega le principali rotte marittime con capacità di prenotazione istantanea e tariffe B2B competitive.

Pacchetti Umrah specializzati con servizi completi, inclusi visti, alloggio e trasporto. Pacchetti di viaggio personalizzati con prezzi dinamici e gestione automatizzata dell'inventario per le agenzie di viaggi.

FX-Port rivoluziona la distribuzione di viaggi B2B con tecnologia all'avanguardia e soluzioni complete. La nostra piattaforma consente alle agenzie di viaggi di accedere all'inventario globale, gestire le prenotazioni in modo efficiente e far crescere la propria attività con tariffe competitive e strumenti automatizzati.

Con il supporto per più valute, l'elaborazione dei pagamenti locali e il servizio clienti 24/7, garantiamo operazioni senza interruzioni per le agenzie di viaggi in tutto il mondo. La nostra piattaforma offre disponibilità in tempo reale, conferme istantanee e strumenti completi di gestione delle prenotazioni.

Le agenzie di viaggi possono sfruttare la nostra piattaforma per offrire una gamma completa di servizi di viaggio, tra cui prenotazioni di voli, prenotazioni alberghiere, servizi di trasferimento, biglietti per traghetti, pacchetti Umrah e esperienze di viaggio personalizzate. Il nostro marketplace B2B collega le agenzie con fornitori verificati in tutto il mondo.

FX-Port offre sicurezza a livello aziendale, gestione automatizzata delle commissioni e analisi dettagliate per la crescita aziendale. Unisciti a centinaia di agenzie di successo che utilizzano la nostra piattaforma per ottimizzare le operazioni e ampliare la propria presenza sul mercato.

© 2026 FX-PORT. Tutti i diritti riservati.

Vai al contenuto
FX-Port per i fornitoriVoli—Compagnie aeree·Consolidatori·OTA·Agenzie GDSHotel—Bed bank·PMS/CMS·HotelTutti i fornitori di viaggi
AziendaleAPI
Accedi
Ottieni accesso ora
Pannello di controllo