NouveauAPI REST avec un fichier OpenAPI 3.1
API eSIM pour agences de voyages, OTA et revendeurs
Vendez des eSIM de voyage via une seule API REST. Listez les forfaits data par pays avec des prix dans la devise de votre agence, commandez-en un pour un voyageur, remettez-lui le QR code, suivez la consommation et rechargez. Une seule URL de base sert la Sandbox et le Live. Commencez avec une clé Sandbox gratuite ; les clés Live fonctionnent une fois votre agence approuvée.
La documentation est rédigée en anglais.
- URL de base
https://api.fx-port.com/api/v1- Authentification
Authorization: Bearer fxp_test_...- Préfixes de clés
fxp_test_ / fxp_live_- Endpoints
- 12
- Pays avec forfaits
- 190+
- Langages d’exemples de code
- 9
L’API eSIM, appel par appel
Suivez la vente d’une eSIM pas à pas, au fil de la construction, de l’envoi et de la réponse de chaque requête. Les sessions couvrent la vente d’une eSIM, le maintien de la connexion du voyageur, la vérification des appareils et des réservations, et les échecs qu’il vaut la peine de gérer. Les requêtes et les réponses sont des exemples tirés de la documentation, et cette page n’appelle jamais l’API.
3 requêtes : Lister les forfaits, Commander l’eSIM, Lire les données d’installation.
Session illustrative : les corps de requête et de réponse sont des exemples tirés de la documentation, les dates sont décalées pour rester postérieures à aujourd’hui et les durées sont indicatives. Cette page n’envoie aucune requête.
Télécharger la collection Postman
Trouver un forfait, le commander, lire les données d’installation
Commencez par les forfaits d’un pays, commandez-en un pour un voyageur, puis lisez les données d’installation de la commande. La Sandbox crée une eSIM de test avec un code d’activation factice et ne débite rien ; la console montre une copie abrégée de la réponse du catalogue.
Lister les forfaits
L’appel du catalogue prend
countryettypeet renvoie les forfaits correspondants, avec des prix dans la devise de votre agence. Conservez lepackage_idde celui que choisit le voyageur.Requête GET /esims/packages curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 } }Exemple abrégé pour l’affichage
- PASS Le code de statut est 200
- PASS $.success est égal à true
- PASS $.data[0].package_id existe
- PASS $.data[0].balance_debit_amount existe
Commander l’eSIM
Créer une commande demande le
package_idavec l’adresse e-mail et le numéro de téléphone du voyageur. Conservezbooking_idetdata.iccidde la réponse. En Sandbox,balanceDebited,transactionCreatedetpayoutCreatedvalent tousfalse.Requête 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" }'Réponse 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 }Exemple abrégé pour l’affichage
- PASS Le code de statut est 200
- PASS $.environment est égal à sandbox
- PASS $.balance_debited est égal à false
- PASS $.data.iccid existe
Lire les données d’installation
L’appel des données d’installation prend le
booking_idet renvoie le QR code, les données d’activation, les liens d’installation et les étapes d’installation de la commande. Ne les montrez qu’au voyageur qui possède l’eSIM.Requête 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"Réponse 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" } }Exemple abrégé pour l’affichage
- PASS Le code de statut est 200
- PASS $.data.package_id est égal à france-in-7days-1gb
- PASS $.data.sims[0].iccid existe
Référence de GET /esims/bookings/{booking_id}/setup-instructions dans la documentation
Lire la consommation, puis recharger
Une fois que le voyageur a une eSIM, lisez la quantité de données restantes, demandez quels forfaits peuvent être ajoutés à cette eSIM précise, puis créez la recharge. La consommation est mise en cache : un chiffre peut dater de quelques minutes. L’historique des recharges se trouve dans la barre latérale et dans la transcription.
Lire la consommation
L’appel de consommation prend l’ICCID de la commande et renvoie
remainingettotalen mégaoctets, lestatuset l’expiration. La réponse vient d’un cache, etforce=trueinterroge de nouveau le fournisseur.Requête GET /esims/usage/{iccid} curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 Le code de statut est 200
- PASS $.data.data.status est égal à ACTIVE
- PASS $.data.data.remaining existe
Lister les forfaits de recharge
Cet appel liste les forfaits qui peuvent être ajoutés aujourd’hui à cette eSIM précise. Une liste vide signifie que l’eSIM ne peut pas être rechargée pour le moment. Prenez le
package_idde la recharge dans cette liste, jamais dans la commande d’origine.Requête GET /esims/topup-packages/{iccid} curl https://api.fx-port.com/api/v1/esims/topup-packages/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 } ] } }Exemple abrégé pour l’affichage
- PASS Le code de statut est 200
- PASS $.data.data contient 2 éléments
- PASS $.data.data[0].type est égal à topup
Référence de GET /esims/topup-packages/{iccid} dans la documentation
Créer la recharge
Créer une recharge demande le
package_idde cette liste et l’ICCID. En Live, votre solde n’est débité qu’une fois la recharge acceptée par le fournisseur. En Sandbox, lebalancede la réponse est à zéro et rien n’est débité.Requête 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" }'Réponse 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 Le code de statut est 200
- PASS $.environment est égal à sandbox
- PASS $.balance_debited est égal à false
- PASS $.data.balance.current est égal à 0
Lire l’historique des recharges
L’historique des recharges liste les recharges d’une eSIM, de la plus récente à la plus ancienne. Les recharges ne figurent pas dans la liste des réservations : c’est donc ici que vous les trouvez.
Requête 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"Réponse 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 Le code de statut est 200
- PASS $.data[0].type est égal à topup
Référence de GET /esims/bookings/{iccid}/topup-history dans la documentation
Vérifier un appareil, puis lire vos réservations
Avant la vente, vérifiez que le téléphone du voyageur prend en charge l’eSIM. Après la vente, lisez vos réservations et vérifiez qu’une référence de réservation est bien la vôtre. La consommation en lot figure dans la barre latérale.
Consulter la liste des appareils
L’appel des appareils compatibles renvoie les appareils connus pour prendre en charge l’eSIM, avec
brand,modeletos. Cherchez le téléphone du voyageur avant de vendre.Requête GET /esims/compatible-devices curl https://api.fx-port.com/api/v1/esims/compatible-devices \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 Le code de statut est 200
- PASS $.success est égal à true
- PASS $.data[0].model existe
Référence de GET /esims/compatible-devices dans la documentation
Lister vos réservations
La liste des réservations renvoie les commandes eSIM de votre agence, de la plus récente à la plus ancienne. Cette requête demande une réservation avec
limit, etpaginationindique combien de commandes correspondent et si une autre page suit.Requête GET /esims/bookings curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 Le code de statut est 200
- PASS $.data contient 1 élément
- PASS $.pagination.has_more est égal à true
Vérifier l’appartenance
La vérification d’appartenance répond
is_ownerà true quand la réservation appartient à votre agence. Une réservation d’une autre agence et une réservation inexistante reçoivent la même réponse : l’appel ne permet donc pas de découvrir des références.Requête 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"Réponse 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 Le code de statut est 200
- PASS $.is_owner est égal à true
Référence de GET /esims/bookings/{booking_id}/verify dans la documentation
Lire la consommation en lot
Un appel lit la consommation de plusieurs eSIM listées dans
iccidset renvoie une entrée par ICCID, chacune avec son proprestatus. Envoyez toujoursiccids.Requête GET /esims/usage/bulk curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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 Le code de statut est 200
- PASS $.data[0].status est égal à success
Les échecs et comment réagir à chacun
Tous les échecs partagent un même corps, et la première entrée de errors a un code stable. Ces appels de commande échouent volontairement, chacun pour une raison différente et avec une réaction différente.
Clé Lecture sur une commande
Une clé Lecture sur l’appel de commande est refusée avec
403etread_write_permission_required, avant la lecture du corps. Passez à une clé Lecture + écriture.Requête 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" }'Réponse 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 Le code de statut est 403
- PASS Le code d’erreur est read_write_permission_required
- PASS $.errors[0].type est égal à permission_error
Adresse e-mail invalide
Une valeur qui n’est pas une adresse e-mail est refusée avec
400etinvalid_email, etfielddésigneemail. Corrigez la valeur avant de renvoyer la commande : la même requête échoue de la même façon.Requête 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" }'Réponse 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 Le code de statut est 400
- PASS Le code d’erreur est invalid_email
- PASS $.errors[0].field est égal à email
Commande en double
Une commande pour un forfait déjà en cours de traitement est refusée avec
409etduplicate_request. Ne la renvoyez pas tout de suite : cherchez d’abord la réservation, et ne passez une nouvelle commande que si aucune n’a été créée.Requête 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" }'Réponse 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 Le code de statut est 409
- PASS Le code d’erreur est duplicate_request
- PASS $.errors[0].type est égal à conflict
Trop de requêtes
Au-delà de la limite par minute, l’appel est refusé avec
429etrate_limit_exceeded, et l’en-têteRetry-Afterindique combien de secondes attendre. Réessayez ensuite avec un backoff.Requête 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" }'Réponse 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 Le code de statut est 429
- PASS Le code d’erreur est rate_limit_exceeded
- PASS L’en-tête Retry-After est présent
- PASS $.errors[0].details.retry_after est égal à 12
Du catalogue au voyageur connecté en cinq étapes
Une intégration tient en un court parcours : lire le catalogue, créer la commande, remettre l’eSIM au voyageur, suivre la consommation et recharger quand les données sont épuisées. Seules la commande et la recharge modifient quelque chose. Tous les autres appels se contentent de lire.
Lire le catalogue d’une destination
Listez les forfaits d’un pays, avec des prix déjà dans la devise de votre agence, et conservez le package_id de celui que choisit le voyageur. Envoyez toujours country : le catalogue entier est une très grosse réponse sans pagination. Lisez les identifiants de forfaits dans la réponse au lieu de les coder en dur, car le catalogue évolue.
Requête
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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
}
}Créer la commande
Envoyez le package_id avec l’adresse e-mail et le numéro de téléphone du voyageur. Une commande crée exactement une eSIM et, en Live, débite le solde de votre agence. Conservez le booking_id et l’ICCID de la réponse, car chaque appel suivant en demande un.
Requête
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"
}'Réponse 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
}| Champ | Ce qu’il contient |
|---|---|
booking_id | La référence FX-Port de la commande. Conservez-la pour les données d’installation, la vérification d’appartenance et vos propres dossiers. |
data.iccid | L’identifiant de l’eSIM. La consommation, les recharges et les instructions d’installation sont toutes demandées à partir de l’ICCID. |
data.sim.qrcode data.sim.qrcode_url | La chaîne d’activation encodée par le QR code, et un lien vers l’image du QR code. |
data.sim.direct_apple_installation_url data.sim.sharing | Un lien qui lance l’installation sur un iPhone, et une page de partage où le voyageur peut ouvrir l’eSIM avec son code d’accès. L’appel des données d’installation ajoute le lien pour Android. |
PENDING-, et les données sont disponibles via l’appel des données d’installation dès que le fournisseur les a.Remettre l’eSIM au voyageur
La réponse contient le QR code et sa chaîne d’activation, que vous pouvez afficher dans vos propres écrans. FX-Port demande aussi au fournisseur d’envoyer par e-mail le QR code et un lien de partage à l’adresse du voyageur, sans que vous ayez à le relayer. L’appel des données d’installation renvoie plus tard les mêmes données, avec les étapes d’installation.
Requête
curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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
}
}Suivre la consommation
Lisez les données restantes et l’expiration d’une eSIM à partir de son ICCID. La réponse est mise en cache jusqu’à 15 minutes : servez-vous-en pour un écran ou un rappel, pas comme compteur.
Requête
curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Réponse 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"
}
}
}Recharger quand les données sont épuisées
Listez les forfaits qui peuvent être ajoutés à cette eSIM précise, puis créez la recharge avec l’un d’eux. Si la liste est vide, l’eSIM ne peut pas être rechargée pour le moment et le voyageur a besoin d’une nouvelle eSIM.
Requête
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"
}'Réponse 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
}Prix, commission et solde
Chaque forfait porte ses champs monétaires, calculés côté serveur dans la devise de votre agence. Un prix placé dans le corps d’une requête est ignoré : une commande est donc toujours créée au prix calculé par le serveur.
| Champ | Ce qu’il contient |
|---|---|
base_price price | Le prix du forfait avant votre commission. Ce n’est pas le montant débité de votre solde. |
total_price retail_price | Le prix à facturer au voyageur, commission comprise. |
balance_debit_amount b2b_price | Ce qui sort du solde de votre agence quand vous commandez le forfait en Live. Lisez-le, ne le calculez pas. |
agency_commission commission_rate | Votre taux de commission, en texte et en nombre. Les réservations renvoient plutôt votre commission sous forme de montant. |
Dans l’exemple du catalogue, le voyageur paie 468.84 DZD. Une commande en Live débite votre solde de 418.60 DZD, et la différence, 50.24 DZD, est votre commission.
Le taux est propre à votre agence
Le taux de commission revient avec chaque forfait, et il n’est pas le même pour toutes les agences. Une agence d’entreprise sous contrat peut avoir un taux nul ; le prix total est alors égal au débit.
Lisez les champs, ne les reconstruisez pas
Le débit peut être supérieur au prix de base, car des montants propres à votre agence en font partie. Lisez donc balance_debit_amount et ne le calculez jamais à partir de base_price. Le mot price désigne le prix de base dans le catalogue, mais le prix de vente dans les commandes, les forfaits de recharge et les données d’installation : utilisez base_price et total_price partout et l’ambiguïté disparaît.
Tarifé dans la devise de votre agence
Chaque montant est déjà converti dans la devise de votre agence, quelle que soit la devise du fournisseur. La réponse indique aussi la devise du fournisseur et le taux de change : vous pouvez vérifier le taux vous-même et n’avez jamais besoin de reconvertir.
Après la vente : consommation, recharges et données d’installation
Une vente ne s’arrête pas à la commande. Ces appels maintiennent le voyageur connecté, et ils ne fonctionnent que sur les eSIM que votre agence a commandées dans le même environnement que votre clé.
Lire la consommation et sa fraîcheur
La consommation renvoie les données restantes, la dotation, le statut et l’expiration d’une eSIM, ou de 50 eSIM au maximum en un seul appel. FX-Port conserve la dernière réponse jusqu’à 15 minutes pour protéger les limites de débit du fournisseur : un chiffre peut donc avoir cet âge. Passez force=true pour interroger de nouveau le fournisseur, par exemple juste après une recharge. Ne le faites pas à chaque requête, car le fournisseur limite la fréquence de lecture de la consommation. Si le fournisseur ne peut pas répondre, vous recevez le dernier chiffre connu, signalé comme périmé.
Recharges : demander d’abord, créer ensuite
Une recharge se fait en deux appels. Listez d’abord les forfaits qui peuvent être ajoutés à cette eSIM précise, puis créez la recharge avec l’un des identifiants de forfait renvoyés. Ne réutilisez jamais l’identifiant du forfait de la commande d’origine, et ne gardez pas un forfait de recharge pour plus tard : redemandez quand le voyageur veut recharger. Une recharge ajoute des données à l’eSIM et ne remplace pas ce qui reste ; lisez donc le résultat dans la consommation avec force=true.
Quand une recharge n’est pas possible
Les fournisseurs choisissent quels opérateurs mobiles desservent un pays et, dans de rares cas, ils en changent. L’eSIM peut alors continuer à fonctionner jusqu’à son expiration, alors que son forfait ne peut plus être rechargé. La liste des forfaits de recharge revient vide. Si un fournisseur rejette une recharge, votre solde n’est pas touché et la tentative est enregistrée comme réservation échouée. La réponse est un supplier_error auquel vous pouvez réagir.
Données d’installation et étapes d’installation
L’appel des données d’installation renvoie, à la demande, le QR code, les données d’activation, les liens d’installation et les étapes d’installation d’une commande. L’appel des instructions renvoie les étapes par système d’exploitation, dans la langue demandée. Ces étapes sont un texte générique du fournisseur : affichez-les à côté du QR code de la commande. Ne montrez les deux qu’au voyageur qui possède l’eSIM.
Réservations, historique des recharges et appartenance
La liste des réservations renvoie les commandes eSIM de votre agence dans l’environnement de votre clé, de la plus récente à la plus ancienne. Vous pouvez y chercher par identifiant de réservation, nom du voyageur, adresse e-mail, nom du forfait ou ICCID. Les recharges ne figurent pas dans cette liste : lisez-les avec l’historique des recharges d’une eSIM. Avant de construire un lien ou un écran autour d’un identifiant de réservation, la vérification d’appartenance indique s’il est bien le vôtre. Une réservation d’une autre agence et une réservation inexistante reçoivent la même réponse.
Tous les endpoints eSIM, avec OpenAPI, Postman et exemples de code
L’API eSIM compte 12 endpoints sous une même URL de base. Chaque ligne ouvre la page de référence de cet appel, avec ses champs de requête, ses réponses, ses erreurs et ses exemples en 9 langages.
| Endpoint | Fonction | Clé |
|---|---|---|
GET /api/v1/esims/packages | Liste les forfaits d’un pays ou d’une région, avec des prix déjà dans la devise de votre agence. Envoyez toujours un pays : le catalogue entier est très volumineux et n’a pas de pagination. | Lecture |
GET /api/v1/esims/compatible-devices | Les appareils connus pour prendre en charge l’eSIM, pour une vérification avant l’achat du voyageur. | Lecture |
POST /api/v1/esims/orders | Crée une eSIM à partir d’un forfait pour un voyageur et la provisionne chez le fournisseur. En Live, elle débite le solde de votre agence. | Lecture + écriture |
GET /api/v1/esims/topup-packages/{iccid} | Les forfaits qui peuvent être ajoutés aujourd’hui à une eSIM précise. Une liste vide signifie qu’elle ne peut pas être rechargée pour le moment. | Lecture |
POST /api/v1/esims/topups | Ajoute un forfait de recharge à une eSIM existante. En Live, votre solde n’est débité qu’une fois la recharge acceptée par le fournisseur. | Lecture + écriture |
GET /api/v1/esims/usage/{iccid} | Les données restantes, la dotation, le statut et l’expiration d’une eSIM. La réponse peut dater de 15 minutes au plus. | Lecture |
GET /api/v1/esims/usage/bulk | La consommation de 50 eSIM au maximum en un seul appel, une entrée par ICCID, chacune avec son propre statut. | Lecture |
GET /api/v1/esims/bookings | Les commandes eSIM de votre agence, de la plus récente à la plus ancienne, avec recherche et pagination. Les recharges ne figurent pas dans cette liste. | Lecture |
GET /api/v1/esims/bookings/{iccid}/topup-history | Les recharges d’une eSIM, de la plus récente à la plus ancienne. La liste est vide si l’eSIM n’en a aucune. | Lecture |
GET /api/v1/esims/bookings/{booking_id}/verify | Vérifie qu’une référence de réservation appartient à votre agence, avant de construire un lien ou un écran autour d’elle. | Lecture |
GET /api/v1/esims/bookings/{booking_id}/setup-instructions | Le QR code, les données d’activation, les liens d’installation et les étapes d’installation d’une commande, en JSON. | Lecture |
GET /api/v1/esims/instructions/{iccid} | Les instructions d’installation pas à pas pour un ICCID, par système d’exploitation, dans la langue demandée. | Lecture |
OpenAPI 3.1
Un fichier décrit chaque endpoint et chaque champ. Générez-en un client, importez-le dans un outil d’API ou donnez-le à un assistant de code.
Collection Postman
La collection eSIM couvre les 12 endpoints dans des dossiers qui suivent les étapes d’une vente. Elle ne contient aucune clé : ajoutez les vôtres.
Exemples de code en 9 langages
Chaque page de référence affiche sa requête en cURL, Node.js, Python, PHP, Go, Java, C#, Swift et Kotlin, générée à partir de la description OpenAPI. Chaque requête eSIM est disponible dans tous ces langages.
Documentation pour les assistants IA
llms.txt et llms-full.txt fournissent la documentation en texte brut aux assistants IA, et chaque page de la documentation peut être lue en Markdown en ajoutant .md à son adresse.
Prête pour la production : clés, erreurs, nouvelles tentatives et cache
Une intégration eSIM se juge en production sur l’authentification, les échecs, les nouvelles tentatives, le cache et les limites de débit. Voici ce qu’il faut savoir sur chacun.
Une URL de base, deux types de clés
Chaque requête porte une clé comme jeton bearer dans l’en-tête Authorization. Le préfixe indique où la clé fonctionne : fxp_test_ pour la Sandbox et fxp_live_ pour le Live. Les deux utilisent la même URL de base, et chaque réponse JSON indique l’environnement dont elle provient dans environment. Les clés doivent rester sur votre serveur, jamais dans un navigateur ou une application. FX-Port ne conserve qu’un hachage de chaque clé : une clé perdue ne peut donc pas être affichée à nouveau. Une modification de clé peut mettre quelques minutes à s’appliquer.
Quelle clé pour quel appel
Une clé Lecture peut lister les forfaits, vérifier les appareils, lire la consommation et lire les réservations. Créer une commande ou une recharge exige une clé Lecture + écriture ; une clé Lecture qui l’essaie reçoit read_write_permission_required. Toute clé peut être verrouillée sur une liste d’adresses IP, et un appel depuis une autre adresse reçoit ip_not_allowed. Utilisez une clé Lecture partout où le code se contente d’afficher des résultats.
Un seul format d’erreur pour tous les échecs
Un appel en échec renvoie un tableau errors. Sa première entrée contient un code stable, un type qui indique comment réagir et le field en cause. Testez le code, jamais le message. La liste d’erreurs commune aux vols, aux hôtels, aux eSIM et au compte comprend 180 codes. Quand le fournisseur refuse une commande ou une recharge, la réponse est un supplier_error qui porte le statut HTTP propre au fournisseur. Rien n’est débité et une réservation échouée est enregistrée. Juste après un redémarrage, le catalogue et la liste des appareils peuvent répondre 202 avec success à false : attendez quelques secondes et redemandez.
Réessayer sans commander deux fois
FX-Port n’a pas de clé d’idempotence : il n’existe donc pas d’en-tête Idempotency-Key à envoyer. Les lectures peuvent être répétées sans risque ; créer une commande ou une recharge, non. FX-Port refuse un doublon évident avec 409 et duplicate_request : une commande pour un forfait encore en cours de traitement. En Live, il refuse aussi le même forfait commandé de nouveau dans les 60 secondes qui suivent la dernière commande confirmée de votre agence, quel que soit le voyageur. Les commandes répondent généralement en quelques secondes, mais un fournisseur lent peut mettre beaucoup plus longtemps. Si un appel expire ou si la connexion tombe, ne renvoyez pas la commande tout de suite, car l’eSIM peut exister. Cherchez-la avec le paramètre search de la liste des réservations, à partir de l’adresse e-mail du voyageur, et ne passez une nouvelle commande que si rien n’a été créé.
Pas de webhooks : interrogez quand vous en avez besoin
FX-Port n’appelle aucune URL de votre côté, ni en Sandbox ni en Live. Une commande répond avec l’eSIM, ou avec un espace réservé PENDING- tant que le fournisseur ne l’a pas renvoyée. Pour tout le reste, vous interrogez au moment voulu : les données d’installation, la consommation ou la liste des réservations.
Cache et rapidité
La consommation est conservée jusqu’à 15 minutes et la liste des forfaits de recharge quelques minutes ; force=true contourne le cache. Le catalogue sans filtre est une très grosse réponse sans pagination : envoyez donc country et acceptez la compression avec Accept-Encoding: gzip. Les titres des forfaits reviennent dans la langue du paramètre locale ; la première requête dans une langue autre que l’anglais est plus lente, car le texte est alors récupéré puis mis en cache.
Limites de débit
Les limites sont comptées par clé et par minute, en deux groupes, et chaque réponse porte ratelimit-limit et ratelimit-remaining : vous pouvez donc ralentir avant d’être refusé. Après un 429, attendez le nombre de secondes indiqué dans Retry-After et réessayez avec un backoff exponentiel et du jitter. Trop de commandes ou de recharges d’une même clé ou d’une même agence en simultané peuvent entraîner la réponse concurrency_limit_exceeded.
| Type d’appel | Par minute |
|---|---|
| Création de commandes et de recharges | 1,200 |
| Tous les autres endpoints eSIM | 6,000 |
Pour l’instant, le plafond de commandes et de recharges simultanées est en mode observation : il est compté mais pas appliqué, donc rien n’est encore refusé à cause de lui, et le changelog annoncera le jour de son application. Lisez ces chiffres comme la politique actuelle, et non comme une promesse. Les clés Sandbox ont les mêmes compteurs par minute que les clés Live : planifiez vos tests de charge au lieu de les lancer en boucle.
Noms et versions
Les champs de requête sont en snake_case, comme first_name et agent_id. Les anciennes graphies fonctionnent encore : user_id est lu comme agent_id et ajoute une entrée warnings, tandis que customer_email est accepté comme email sans en ajouter. De nombreuses réponses gardent une ancienne clé à côté de son jumeau en snake_case avec la même valeur, comme order_id à côté de code, et ?naming=snake ne renvoie que des clés en snake_case. La version se trouve dans le chemin, /api/v1 : un changement incompatible recevrait un nouveau préfixe, tandis que les nouveaux champs et les nouvelles graphies s’ajoutent sans rien casser.
Commencez dans la Sandbox gratuite, puis passez en Live
Tout ce que montre cette page fonctionne dès aujourd’hui dans la Sandbox. Une clé Sandbox s’obtient en libre-service, gratuitement, et ne touche jamais votre solde réel.
Créez un compte
Inscrivez-vous sur FX-Port. Les clés sandbox sont gratuites et les réservations sandbox n’entraînent aucun frais réel.
Créez une clé sandbox
Sur la page API de votre tableau de bord, créez une clé commençant par
fxp_test_. Une clé Lecture peut rechercher et lire ; une clé Lecture + écriture peut aussi créer des réservations de test.Envoyez votre première requête
Il n’y a qu’une seule URL de base, et la clé se place dans l’en-tête
Authorizationsous forme de jeton Bearer. Le guide de démarrage rapide détaille un premier appel.Passez en Live quand vous êtes prêt
Remplacez la clé par une clé
fxp_live_. Le mode Live fonctionne une fois votre agence approuvée ; d’ici là, l’API répond403 agency_not_active. Les réservations réelles sont réglées depuis un solde approvisionné.
Une première requête de catalogue en cURL. La documentation affiche la même requête dans chaque langage pris en charge.
Requête
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Démarrage rapide : premier appel Sandbox
Ce que fait la Sandbox
Une commande en Sandbox crée une vraie eSIM de test chez le fournisseur, avec un code d’activation factice : elle ne peut donc pas être installée sur un téléphone. Rien n’est débité, et les réponses le disent : balanceDebited, transactionCreated et payoutCreated valent tous false. Une recharge répond avec un solde de zéro. La consommation est statique : une nouvelle eSIM affiche toute sa dotation et le statut ACTIVE. Les réservations Sandbox ne sont visibles que par les clés Sandbox.
Ce que seul le Live peut tester
La vérification du solde, la détection des doublons et le verrou de solde ne s’exécutent qu’en Live. Les réponses 402 avec insufficient_balance, 409 pour le même forfait commandé de nouveau dans les 60 secondes, et 503 avec balance_lock_timeout n’apparaissent donc jamais en Sandbox. Écrivez leur gestion d’après la liste des codes d’erreur.
Passer en Live
Les clés Live sont liées à l’approbation de l’agence : tant que votre agence n’est pas approuvée, une clé Live répond agency_not_active et votre clé Sandbox continue de fonctionner. Les commandes Live sont payées depuis un solde d’agence approvisionné. Passer en Live change la clé, pas le code, car la Sandbox et le Live partagent une même URL de base.
Qui construit sur l’API eSIM
Chaque public s’appuie sur une partie différente des mêmes appels.
Les agences qui vendent des voyages
Les agences vendent une eSIM à côté du vol et de l’hôtel. Elles commandent avec l’adresse e-mail du voyageur lui-même, afin que le fournisseur envoie le QR code et un lien de partage, et elles lisent la consommation quand un voyageur le demande. Le taux de commission revient avec chaque forfait, et agent_id enregistre quel utilisateur de votre agence a passé une commande.
OTA et places de marché
Les places de marché construisent d’abord la page de navigation : un pays à la fois, des forfaits locaux ou régionaux, les réseaux et la dotation de données de chaque forfait, et une vérification de l’appareil avant l’achat du voyageur. Un écran qui liste les eSIM d’un voyageur peut lire la consommation de 50 d’entre elles au maximum en un seul appel.
Équipes de technologie du voyage et d’entreprise
Les équipes de technologie du voyage et les services voyages d’entreprise construisent leurs propres outils de réservation. Tout ce qu’il faut pour démarrer est public : le fichier OpenAPI, la collection Postman et une documentation en texte brut qu’un assistant de code IA peut lire, de sorte que le premier prototype part du vrai contrat.
API eSIM : questions fréquentes
Qu’est-ce que l’API eSIM de FX-Port, et à qui s’adresse-t-elle ?
C’est une API REST qui permet à une agence de voyages, une OTA ou un revendeur de vendre des eSIM data de voyage depuis une seule intégration. Vous listez les forfaits d’une destination avec des prix dans la devise de votre agence et en commandez un pour un voyageur. Vous lui remettez le QR code, suivez la consommation et rechargez. Tout est en JSON sur HTTPS, et un fichier OpenAPI décrit chaque endpoint.
Existe-t-il une Sandbox gratuite, et comment obtenir une clé ?
Oui. Créez un compte FX-Port, ouvrez la page API de votre tableau de bord et créez une clé Sandbox ; vous pouvez le faire vous-même, sans frais. Une commande en Sandbox crée une eSIM de test avec un code d’activation factice : elle ne peut donc pas être installée sur un téléphone. Rien n’est débité de votre solde. La Sandbox et le Live partagent une même URL de base : le code que vous testez est celui que vous livrez.
Que faut-il pour passer en Live ?
Votre agence doit être approuvée pour qu’une clé Live fonctionne. D’ici là, une clé Live est refusée et votre clé Sandbox continue de fonctionner. Les commandes Live sont payées depuis un solde d’agence approvisionné, que la Sandbox ne touche jamais, et toute clé peut être verrouillée sur une liste d’adresses IP. Pour basculer, il suffit de changer la clé ; chaque réponse indique l’environnement dont elle provient.
Quels pays et quels forfaits puis-je vendre ?
Des forfaits sont disponibles pour plus de 190 pays, et les forfaits régionaux apparaissent sous leur région. Les forfaits diffèrent par la dotation de données, la validité, les réseaux et la possibilité de les recharger. Lisez ces champs et l’identifiant du forfait dans la réponse du catalogue au lieu de les coder en dur. Demandez un pays à la fois, car le catalogue entier est une très grosse réponse. Une liste d’appareils distincte permet de vérifier le téléphone d’un voyageur avant la vente.
Comment le voyageur reçoit-il l’eSIM ?
La réponse de la commande contient le QR code, sa chaîne d’activation, un lien d’installation pour iPhone et une page de partage. Vous pouvez les afficher dans vos propres écrans. FX-Port demande aussi au fournisseur d’envoyer par e-mail le QR code et un lien de partage à l’adresse du voyageur dès que l’eSIM est créée. Si le fournisseur n’a pas encore renvoyé l’eSIM, la commande existe quand même et les données sont disponibles plus tard via l’appel des données d’installation.
Comment s’articulent les prix, la commission et mon solde ?
Chaque forfait porte ces champs monétaires dans la devise de votre agence : le prix de base avant votre commission, le prix total à facturer au voyageur, le montant débité de votre solde et votre taux de commission. Votre commission est le prix total moins le débit. Lisez ces champs au lieu de les reconstruire, car le débit est propre à votre agence. En Sandbox, rien n’est débité ; en Live, le débit sort du solde de votre agence.
Puis-je recharger une eSIM, et comment voir ce qu’il reste ?
Oui, en deux appels : listez les forfaits qui peuvent être ajoutés à l’eSIM précise, puis créez la recharge avec l’un d’eux. Une recharge n’est pas toujours possible, car un fournisseur peut changer l’opérateur d’un pays. Une liste vide signifie alors que le voyageur a besoin d’une nouvelle eSIM. La consommation est mise en cache jusqu’à 15 minutes : considérez-la comme un chiffre récent. Un seul appel lit jusqu’à 50 eSIM.
Comment les échecs sont-ils signalés, et y a-t-il des webhooks ?
Un échec revient dans un format unique, avec un code d’erreur stable ; c’est ce code que votre programme doit tester, pas le texte du message. Les lectures peuvent être répétées sans risque avec un backoff. Créer une commande ou une recharge est différent : il n’y a pas de clé d’idempotence, donc après un délai dépassé, cherchez la réservation avant de réessayer. FX-Port refuse un doublon évident, comme le même forfait commandé deux fois en moins de 60 secondes en Live. Il n’y a pas de webhooks.
Puis-je annuler ou rembourser une commande eSIM via l’API ?
Non. L’API n’a aucun endpoint pour annuler ou rembourser une commande eSIM. Chaque commande crée exactement une eSIM : vérifiez donc le forfait et les informations du voyageur avant de l’envoyer. Si le fournisseur refuse une commande, rien n’est débité et une réservation échouée est enregistrée. Pour un problème sur une commande précise, écrivez à l’équipe développeurs en indiquant son identifiant de réservation.
De quoi ai-je besoin pour démarrer, et quels outils aident ?
Il vous faut une clé Sandbox et un client HTTP. La documentation ajoute un fichier OpenAPI 3.1, une collection Postman, des exemples de code dans 9 langages et des exports en texte brut pour les assistants IA. Gardez vos clés sur votre serveur, jamais dans un navigateur ou une application. Ce qui prend plus de temps, c’est votre propre parcours d’achat, la remise du QR code au voyageur et la gestion des erreurs.
Les autres API FX-Port
Une eSIM accompagne généralement un voyage. Les vols et les hôtels utilisent les mêmes clés, le même corps d’erreur et les mêmes conventions que les eSIM, et leurs réservations figurent dans le même historique de compte.
Recherchez, tarifez et réservez des vols, réglez les commandes mises en attente, annulez et consultez les billets.
Trouvez des hôtels, vérifiez les tarifs, préréservez et réservez, consultez les vouchers et annulez.
- API TransfertsPréversion
Obtenez un devis, réservez, suivez et annulez des transferts aéroport.
Vous préférez ne pas écrire de code ? Les agences peuvent aussi vendre des eSIM depuis le tableau de bord FX-Port. Vendre des eSIM depuis le tableau de bord
Passez votre première commande eSIM dans la Sandbox
Créez un compte, générez une clé Sandbox, listez les forfaits, créez une commande et lisez la consommation dès aujourd’hui. Les clés Live suivent une fois votre agence approuvée.