NuevoAPI REST con archivo OpenAPI 3.1
API de eSIM para agencias de viajes, OTA y revendedores
Vende eSIM de viaje con una sola API REST. Lista paquetes de datos por país con precios en la moneda de tu agencia, pide uno para un viajero, entrégale el código QR, consulta el consumo y recarga. Una única URL base sirve para sandbox y Live. Empieza con una clave sandbox gratis; las claves Live funcionan cuando tu agencia está aprobada.
La documentación está escrita en inglés.
- URL base
https://api.fx-port.com/api/v1- Autenticación
Authorization: Bearer fxp_test_...- Prefijos de clave
fxp_test_ / fxp_live_- Endpoints
- 12
- Países con paquetes
- 190+
- Lenguajes de ejemplo
- 9
La API de eSIM, llamada a llamada
Sigue la venta de una eSIM paso a paso, mientras cada solicitud se construye, se envía y recibe respuesta. Las sesiones cubren la venta de una eSIM, cómo mantener conectado al viajero, la comprobación de dispositivos y reservas, y los fallos que conviene gestionar. Las solicitudes y respuestas son ejemplos de la documentación, y esta página nunca llama a la API.
3 solicitudes: Listar los paquetes, Pedir la eSIM, Leer datos de instalación.
Sesión ilustrativa: los cuerpos son ejemplos de la documentación, las fechas se adelantan para que siempre sean posteriores a hoy y los tiempos son ilustrativos. Esta página no envía ninguna solicitud.
Descargar la colección de Postman
Encuentra un paquete, pídelo y lee los datos de instalación
Empieza con los paquetes de un país, pide uno para un viajero y lee después los datos de instalación del pedido. El sandbox crea una eSIM de prueba con un código de activación ficticio y no descuenta nada, y la consola muestra una copia reducida de la respuesta del catálogo.
Listar los paquetes
La llamada del catálogo recibe
countryytypey devuelve los paquetes que coinciden, con precios en la moneda de tu agencia. Guarda elpackage_iddel que elija el viajero.Solicitud GET /esims/packages curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 } }Ejemplo recortado para mostrarlo
- PASS El código de estado es 200
- PASS $.success es igual a true
- PASS $.data[0].package_id existe
- PASS $.data[0].balance_debit_amount existe
Pedir la eSIM
Crear un pedido requiere el
package_idcon el correo electrónico y el teléfono del viajero. Guardabooking_idydata.iccidde la respuesta. En el sandbox,balanceDebited,transactionCreatedypayoutCreatedson todosfalse.Solicitud 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" }'Respuesta 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 }Ejemplo recortado para mostrarlo
- PASS El código de estado es 200
- PASS $.environment es igual a sandbox
- PASS $.balance_debited es igual a false
- PASS $.data.iccid existe
Leer datos de instalación
La llamada de datos de instalación recibe el
booking_idy devuelve el código QR, los datos de activación, los enlaces de instalación y los pasos de instalación del pedido. Muéstralos solo al viajero titular de la eSIM.Solicitud 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"Respuesta 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" } }Ejemplo recortado para mostrarlo
- PASS El código de estado es 200
- PASS $.data.package_id es igual a france-in-7days-1gb
- PASS $.data.sims[0].iccid existe
Referencia de GET /esims/bookings/{booking_id}/setup-instructions en la documentación
Lee el consumo y recarga
Cuando un viajero ya tiene una eSIM, lee cuántos datos le quedan, pregunta qué paquetes se pueden añadir a esa eSIM concreta y crea la recarga. El consumo se guarda en caché, así que una cifra puede tener minutos de antigüedad. El historial de recargas está en la barra lateral y en la transcripción.
Leer el consumo
La llamada de consumo recibe el ICCID del pedido y devuelve
remainingytotalen megabytes, elstatusy la caducidad. La respuesta sale de una caché, yforce=truevuelve a preguntar al proveedor.Solicitud GET /esims/usage/{iccid} curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 El código de estado es 200
- PASS $.data.data.status es igual a ACTIVE
- PASS $.data.data.remaining existe
Listar paquetes de recarga
Esta llamada lista los paquetes que hoy se pueden añadir a esa eSIM concreta. Una lista vacía significa que la eSIM no se puede recargar ahora. Toma el
package_idde la recarga de esta lista, nunca del pedido original.Solicitud GET /esims/topup-packages/{iccid} curl https://api.fx-port.com/api/v1/esims/topup-packages/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 } ] } }Ejemplo recortado para mostrarlo
- PASS El código de estado es 200
- PASS $.data.data tiene 2 elementos
- PASS $.data.data[0].type es igual a topup
Referencia de GET /esims/topup-packages/{iccid} en la documentación
Crear la recarga
Crear una recarga requiere el
package_idde esa lista y el ICCID. En Live, tu saldo se descuenta solo después de que el proveedor la acepte. En el sandbox elbalancede la respuesta es cero y no se descuenta nada.Solicitud 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" }'Respuesta 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 El código de estado es 200
- PASS $.environment es igual a sandbox
- PASS $.balance_debited es igual a false
- PASS $.data.balance.current es igual a 0
Leer historial de recargas
El historial de recargas lista las recargas de una eSIM, de la más reciente a la más antigua. Las recargas no están en la lista de reservas, así que aquí es donde las encuentras.
Solicitud 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"Respuesta 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 El código de estado es 200
- PASS $.data[0].type es igual a topup
Referencia de GET /esims/bookings/{iccid}/topup-history en la documentación
Comprueba un dispositivo y lee tus reservas
Antes de la venta, comprueba que el teléfono del viajero admite eSIM. Después de la venta, lee tus reservas y comprueba que una referencia de reserva es tuya. El consumo masivo aparece en la barra lateral.
Consultar dispositivos
La llamada de dispositivos compatibles devuelve los dispositivos que admiten eSIM, con
brand,modelyos. Busca el teléfono del viajero antes de vender.Solicitud GET /esims/compatible-devices curl https://api.fx-port.com/api/v1/esims/compatible-devices \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 El código de estado es 200
- PASS $.success es igual a true
- PASS $.data[0].model existe
Referencia de GET /esims/compatible-devices en la documentación
Listar tus reservas
La lista de reservas devuelve los pedidos de eSIM de tu agencia, del más reciente al más antiguo. Esta solicitud pide una reserva con
limit, ypaginationindica cuántos pedidos coinciden y si hay otra página.Solicitud GET /esims/bookings curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 El código de estado es 200
- PASS $.data tiene 1 elemento
- PASS $.pagination.has_more es igual a true
Comprobar la titularidad
La comprobación de titularidad responde
is_ownerverdadero cuando la reserva pertenece a tu agencia. Una reserva de otra agencia y una que no existe reciben la misma respuesta, así que la llamada no sirve para descubrir referencias.Solicitud 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"Respuesta 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 El código de estado es 200
- PASS $.is_owner es igual a true
Referencia de GET /esims/bookings/{booking_id}/verify en la documentación
Consumo masivo
Una sola llamada lee el consumo de varias eSIM indicadas en
iccidsy devuelve una entrada por ICCID, cada una con su propiostatus. Envía siempreiccids.Solicitud GET /esims/usage/bulk curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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 El código de estado es 200
- PASS $.data[0].status es igual a success
Fallos y cómo reaccionar a cada uno
Todos los fallos comparten un mismo cuerpo, y la primera entrada de errors tiene un code estable. Estas llamadas de pedido fallan a propósito, cada una por un motivo distinto y con una reacción distinta.
Clave de lectura en un pedido
Una clave de lectura en la llamada de pedido se rechaza con
403yread_write_permission_required, antes de leer el cuerpo. Cambia a una clave de lectura y escritura.Solicitud 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" }'Respuesta 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 El código de estado es 403
- PASS El código de error es read_write_permission_required
- PASS $.errors[0].type es igual a permission_error
Correo no válido
Un valor que no es una dirección de correo se rechaza con
400yinvalid_email, yfieldindicaemail. Corrige el valor antes de volver a enviar el pedido: la misma solicitud falla del mismo modo.Solicitud 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" }'Respuesta 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 El código de estado es 400
- PASS El código de error es invalid_email
- PASS $.errors[0].field es igual a email
Pedido duplicado
Un pedido de un paquete que ya se está procesando se rechaza con
409yduplicate_request. No lo vuelvas a enviar enseguida: busca primero la reserva y vuelve a pedir solo si no se creó ninguna.Solicitud 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" }'Respuesta 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 El código de estado es 409
- PASS El código de error es duplicate_request
- PASS $.errors[0].type es igual a conflict
Demasiadas solicitudes
Al superar el límite por minuto, la llamada se rechaza con
429yrate_limit_exceeded, y la cabeceraRetry-Afterindica cuántos segundos esperar. Después reintenta con retroceso.Solicitud 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" }'Respuesta 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 El código de estado es 429
- PASS El código de error es rate_limit_exceeded
- PASS La cabecera Retry-After está presente
- PASS $.errors[0].details.retry_after es igual a 12
Del catálogo al viajero conectado en cinco pasos
Una integración es un camino corto: leer el catálogo, crear el pedido, entregar la eSIM al viajero, seguir el consumo y recargar cuando se acaben los datos. Solo el pedido y la recarga cambian algo. Todas las demás llamadas solo leen.
Lee el catálogo de un destino
Lista los paquetes de un país, con precios ya en la moneda de tu agencia, y guarda el package_id del que elija el viajero. Envía siempre country: el catálogo completo es una respuesta enorme y sin paginación. Lee los identificadores de paquete de la respuesta en lugar de fijarlos en el código, porque el catálogo cambia.
Solicitud
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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
}
}Crea el pedido
Envía el package_id con el correo electrónico y el teléfono del viajero. Un pedido crea exactamente una eSIM y, en Live, se descuenta de tu saldo de agencia. Guarda el booking_id y el ICCID de la respuesta, porque todas las llamadas posteriores necesitan uno de los dos.
Solicitud
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"
}'Respuesta 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
}| Campo | Qué contiene |
|---|---|
booking_id | La referencia de FX-Port del pedido. Guárdala para los datos de instalación, la comprobación de titularidad y tus propios registros. |
data.iccid | El identificador de la eSIM. El consumo, las recargas y las instrucciones de instalación se consultan por ICCID. |
data.sim.qrcode data.sim.qrcode_url | La cadena de activación que codifica el código QR y un enlace a la imagen del código QR. |
data.sim.direct_apple_installation_url data.sim.sharing | Un enlace que inicia la instalación en un iPhone y una página para compartir donde el viajero puede abrir la eSIM con su código de acceso. La llamada de datos de instalación añade el enlace para Android. |
PENDING- y los datos estarán disponibles en la llamada de datos de instalación cuando el proveedor los tenga.Entrega la eSIM al viajero
La respuesta incluye el código QR y su cadena de activación, así que puedes mostrarlos en tus propias pantallas. FX-Port también pide al proveedor que envíe por correo el código QR y un enlace para compartir a la dirección del viajero, de modo que no tienes que reenviarlo tú. La llamada de datos de instalación devuelve más tarde los mismos datos, con los pasos de instalación.
Solicitud
curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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
}
}Sigue el consumo
Lee los datos restantes y la caducidad de una eSIM por su ICCID. La respuesta se guarda en caché hasta 15 minutos, así que úsala para una pantalla o un aviso, no como contador.
Solicitud
curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Respuesta 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"
}
}
}Recarga cuando se acaben los datos
Lista los paquetes que se pueden añadir a esa eSIM concreta y crea la recarga con uno de ellos. Si la lista está vacía, la eSIM no se puede recargar ahora y el viajero necesita una nueva.
Solicitud
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"
}'Respuesta 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
}Precios, comisión y tu saldo
Cada paquete incluye sus campos de importe, calculados en el servidor en la moneda de tu agencia. Un precio enviado en el cuerpo de la solicitud se ignora, de modo que un pedido siempre se crea al precio que calcula el servidor.
| Campo | Qué contiene |
|---|---|
base_price price | El precio del paquete antes de tu comisión. No es el importe que se descuenta de tu saldo. |
total_price retail_price | El precio que cobrar al viajero, con tu comisión incluida. |
balance_debit_amount b2b_price | Lo que sale de tu saldo de agencia cuando pides el paquete en Live. Léelo, no lo calcules. |
agency_commission commission_rate | Tu tasa de comisión, como texto y como número. Las reservas devuelven tu comisión como importe. |
En el ejemplo del catálogo, el viajero paga 468.84 DZD. Un pedido en Live descuenta de tu saldo 418.60 DZD, y la diferencia, 50.24 DZD, es tu comisión.
La tasa depende de tu agencia
La tasa de comisión llega con cada paquete y no es la misma para todas las agencias. Una agencia corporativa con contrato puede tener una tasa de cero, y entonces el precio total es igual al débito.
Lee los campos, no los reconstruyas
El débito puede ser superior al precio base, porque incluye importes propios de tu agencia. Por eso, lee balance_debit_amount y nunca lo calcules a partir de base_price. La palabra price es el precio base en el catálogo, pero el precio de venta en los pedidos, los paquetes de recarga y los datos de instalación: usa base_price y total_price en todas partes y la ambigüedad desaparece.
Precios en la moneda de tu agencia
Todos los importes ya están convertidos a la moneda de tu agencia, sea cual sea la moneda del proveedor. La respuesta también muestra la moneda del proveedor y el tipo de cambio, así que puedes verificar la conversión por tu cuenta y no necesitas volver a convertir.
Después de la venta: consumo, recargas y datos de instalación
Una venta no termina con el pedido. Estas llamadas mantienen conectado al viajero y solo funcionan con eSIM que tu agencia pidió en el mismo entorno que tu clave.
Leer el consumo y qué tan reciente es
El consumo devuelve los datos restantes, la asignación, el estado y la caducidad de una eSIM, o de hasta 50 eSIM en una sola llamada. FX-Port guarda la última respuesta hasta 15 minutos para proteger los límites de uso del proveedor, así que una cifra puede tener esa antigüedad. Pasa force=true para volver a preguntar al proveedor, por ejemplo justo después de una recarga. No lo hagas en cada solicitud, porque el proveedor limita la frecuencia con la que se puede leer el consumo. Si el proveedor no puede responder, recibes la última cifra conocida marcada como desactualizada.
Recargas: pregunta primero, crea después
Una recarga son dos llamadas. Primero lista los paquetes que se pueden añadir a esa eSIM concreta y después crea la recarga con uno de los identificadores devueltos. No reutilices nunca el identificador de paquete del pedido original ni guardes un paquete de recarga para más tarde: pregunta de nuevo cuando el viajero quiera recargar. Una recarga añade datos a la eSIM y no sustituye lo que queda, así que lee el resultado en el consumo con force=true.
Cuando una recarga no es posible
Los proveedores eligen qué operadores móviles dan servicio a un país y, en casos poco frecuentes, cambian alguno. La eSIM puede seguir funcionando hasta que caduque, aunque su paquete ya no se pueda recargar. La lista de paquetes de recarga llega vacía. Si un proveedor rechaza una recarga, tu saldo no se toca y el intento se guarda como una reserva fallida. La respuesta es un supplier_error al que puedes reaccionar.
Datos de instalación y pasos de instalación
La llamada de datos de instalación devuelve, cuando la necesites, el código QR, los datos de activación, los enlaces de instalación y los pasos de instalación de un pedido. La llamada de instrucciones devuelve los pasos por sistema operativo, en el idioma que pidas. Los pasos son un texto genérico del proveedor, así que muéstralos junto al código QR del pedido. Muestra ambos solo al viajero titular de la eSIM.
Reservas, historial de recargas y titularidad
La lista de reservas devuelve los pedidos de eSIM de tu agencia en el entorno de tu clave, del más reciente al más antiguo. Puedes buscar por identificador de reserva, nombre del viajero, correo electrónico, nombre del paquete o ICCID. Las recargas no están en esa lista: léelas con el historial de recargas de una eSIM. Antes de construir un enlace o una pantalla en torno a un identificador de reserva, la comprobación de titularidad te dice si es tuyo. Una reserva de otra agencia y una que no existe reciben la misma respuesta.
Todos los endpoints de eSIM, con OpenAPI, Postman y ejemplos de código
La API de eSIM tiene 12 endpoints bajo una sola URL base. Cada fila abre la página de referencia de esa llamada, con sus campos de solicitud, respuestas, errores y ejemplos en 9 lenguajes.
| Endpoint | Qué hace | Clave |
|---|---|---|
GET /api/v1/esims/packages | Lista los paquetes de un país o región, con precios ya en la moneda de tu agencia. Envía siempre un país: el catálogo completo es enorme y no tiene paginación. | Lectura |
GET /api/v1/esims/compatible-devices | Los dispositivos que admiten eSIM, para comprobarlo antes de que el viajero compre. | Lectura |
POST /api/v1/esims/orders | Crea una eSIM a partir de un paquete para un viajero y la aprovisiona en el proveedor. En Live se descuenta de tu saldo de agencia. | Lectura+Escritura |
GET /api/v1/esims/topup-packages/{iccid} | Los paquetes que hoy se pueden añadir a una eSIM concreta. Una lista vacía significa que ahora no se puede recargar. | Lectura |
POST /api/v1/esims/topups | Añade un paquete de recarga a una eSIM existente. En Live, tu saldo se descuenta solo después de que el proveedor lo acepte. | Lectura+Escritura |
GET /api/v1/esims/usage/{iccid} | Los datos restantes, la asignación, el estado y la caducidad de una eSIM. La respuesta puede tener hasta 15 minutos de antigüedad. | Lectura |
GET /api/v1/esims/usage/bulk | El consumo de hasta 50 eSIM en una sola llamada, una entrada por ICCID, cada una con su propio estado. | Lectura |
GET /api/v1/esims/bookings | Los pedidos de eSIM de tu agencia, del más reciente al más antiguo, con búsqueda y paginación. Las recargas no están en esta lista. | Lectura |
GET /api/v1/esims/bookings/{iccid}/topup-history | Las recargas de una eSIM, de la más reciente a la más antigua. La lista está vacía si la eSIM no tiene ninguna. | Lectura |
GET /api/v1/esims/bookings/{booking_id}/verify | Comprueba que una referencia de reserva pertenece a tu agencia, antes de construir un enlace o una pantalla en torno a ella. | Lectura |
GET /api/v1/esims/bookings/{booking_id}/setup-instructions | El código QR, los datos de activación, los enlaces de instalación y los pasos de instalación de un pedido, en JSON. | Lectura |
GET /api/v1/esims/instructions/{iccid} | Instrucciones de instalación paso a paso para un ICCID, por sistema operativo, en el idioma que pidas. | Lectura |
OpenAPI 3.1
Un solo archivo describe cada endpoint y cada campo. Genera un cliente a partir de él, impórtalo en una herramienta de API o dáselo a un asistente de programación.
Colección Postman
La colección de eSIM cubre los 12 endpoints en carpetas que siguen las fases de una venta. No incluye claves, así que añade las tuyas.
Ejemplos de código en 9 lenguajes
Cada página de referencia muestra su solicitud en cURL, Node.js, Python, PHP, Go, Java, C#, Swift y Kotlin, generada a partir de la descripción OpenAPI. Cada solicitud de eSIM está disponible en todos ellos.
Documentación para asistentes de IA
llms.txt y llms-full.txt entregan a los asistentes de IA la documentación como texto plano, y cada página de la documentación se puede leer como Markdown añadiendo .md a su dirección.
Pensada para producción: claves, errores, reintentos y caché
Una integración de eSIM se evalúa en producción por la autenticación, los fallos, los reintentos, la caché y los límites de uso. Esto es lo que debes saber de cada uno.
Una URL base, dos tipos de clave
Cada solicitud lleva una clave como token Bearer en la cabecera Authorization. El prefijo indica dónde funciona la clave: fxp_test_ para el sandbox y fxp_live_ para Live. Ambas usan la misma URL base, y cada respuesta JSON indica en environment el entorno del que procede. Las claves pertenecen a tu servidor, nunca a un navegador ni a una aplicación. FX-Port solo guarda un hash de cada clave, así que una clave perdida no se puede volver a mostrar. Un cambio en una clave puede tardar unos minutos en aplicarse.
Qué clave hace qué llamada
Una clave de lectura puede listar paquetes, comprobar dispositivos, leer el consumo y leer reservas. Crear un pedido o una recarga requiere una clave de lectura y escritura, y una clave de lectura que lo intente recibe read_write_permission_required. Cualquier clave se puede restringir a una lista de direcciones IP, y una llamada desde otra dirección recibe ip_not_allowed. Usa una clave de lectura siempre que el código solo muestre resultados.
Un único formato de error para cualquier fallo
Una llamada fallida devuelve un array errors. Su primera entrada tiene un code estable, un type que indica cómo reaccionar y el field que falla. Comprueba el código, nunca el mensaje. La lista de errores compartida por vuelos, hoteles, eSIM y la cuenta contiene 180 códigos. Cuando el proveedor rechaza un pedido o una recarga, la respuesta es un supplier_error con el estado HTTP del propio proveedor. No se descuenta nada y se guarda una reserva fallida. Justo después de un reinicio, el catálogo y la lista de dispositivos pueden responder 202 con success en false: espera unos segundos y vuelve a preguntar.
Reintentar sin pedir dos veces
FX-Port no tiene clave de idempotencia, así que no hay cabecera Idempotency-Key que enviar. Las lecturas se pueden repetir sin riesgo; crear un pedido o una recarga, no. FX-Port rechaza un duplicado evidente con 409 y duplicate_request: un pedido de un paquete que aún se está procesando. En Live también rechaza el mismo paquete pedido de nuevo en los 60 segundos siguientes al último pedido confirmado de tu agencia, sea cual sea el viajero. Los pedidos suelen responder en unos segundos, pero un proveedor lento puede tardar mucho más. Si una llamada agota el tiempo de espera o se corta la conexión, no vuelvas a enviar el pedido enseguida, porque la eSIM puede existir. Búscala con el parámetro search de la lista de reservas, usando el correo electrónico del viajero, y vuelve a pedir solo si no se creó nada.
Sin webhooks: consulta cuando lo necesites
FX-Port no llama a ninguna URL tuya, ni en el sandbox ni en Live. Un pedido responde con la eSIM, o con un marcador PENDING- mientras el proveedor no la ha devuelto aún. Cualquier otra cosa la pides tú cuando la necesites: los datos de instalación, el consumo o la lista de reservas.
Caché y velocidad
El consumo se guarda hasta 15 minutos y la lista de paquetes de recarga unos pocos minutos, y force=true omite la caché. El catálogo sin filtrar es una respuesta enorme y sin paginación, así que envía country y acepta compresión con Accept-Encoding: gzip. Los títulos de los paquetes llegan en el idioma del parámetro locale; la primera solicitud en un idioma distinto del inglés es más lenta, porque el texto se obtiene entonces y después se guarda en caché.
Límites de uso
Los límites se cuentan por clave y por minuto en dos grupos, y cada respuesta incluye ratelimit-limit y ratelimit-remaining, así que puedes ir más despacio antes de que te rechacen. Tras un 429, espera los segundos indicados en Retry-After y reintenta con retroceso exponencial y jitter. Si una misma clave o agencia ejecuta demasiados pedidos o recargas a la vez, la respuesta puede ser concurrency_limit_exceeded.
| Tipo de llamada | Por minuto |
|---|---|
| Crear pedidos y recargas | 1,200 |
| Cualquier otro endpoint de eSIM | 6,000 |
Por ahora, el tope de pedidos y recargas simultáneos está en modo de observación: se cuenta pero no se aplica, así que todavía no se rechaza nada por su causa, y el registro de cambios anunciará el día en que se aplique. Lee estas cifras como la política actual y no como una promesa. Las claves sandbox tienen los mismos contadores por minuto que las claves Live, así que programa las pruebas de carga en lugar de ejecutarlas en bucle.
Nombres y versiones
Los campos de solicitud son snake_case, como first_name y agent_id. Las grafías anteriores siguen funcionando: user_id se lee como agent_id y añade una entrada en warnings, mientras que customer_email se acepta como email sin ninguna. Muchas respuestas conservan una clave antigua junto a su gemela en snake_case con el mismo valor, como order_id junto a code, y ?naming=snake devuelve solo claves snake_case. La versión va en la ruta, /api/v1: un cambio incompatible recibiría un prefijo nuevo, mientras que los campos y grafías nuevos son aditivos.
Empieza en el sandbox gratuito y pasa a Live
Todo lo que ves en esta página funciona hoy en el sandbox. Una clave sandbox se obtiene por cuenta propia, es gratis y nunca toca tu saldo real.
Crea una cuenta
Regístrate en FX-Port. Las claves de sandbox son gratuitas y las reservas de sandbox no tienen cargos reales.
Crea una clave de sandbox
En la página de API de tu panel, crea una clave que empiece por
fxp_test_. Una clave de lectura puede buscar y consultar; una clave de lectura y escritura también puede crear reservas de prueba.Envía tu primera solicitud
Hay una única URL base y la clave va en la cabecera
Authorizationcomo token Bearer. La guía de inicio rápido recorre una primera llamada.Pasa a Live cuando estés listo
Usa una clave
fxp_live_. Live funciona cuando tu agencia está aprobada; hasta entonces la API responde403 agency_not_active. Las reservas reales se pagan con un saldo con fondos.
Una primera solicitud al catálogo en cURL. La documentación muestra la misma solicitud en todos los lenguajes compatibles.
Solicitud
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Inicio rápido: primera llamada sandbox
Qué hace el sandbox
Un pedido en el sandbox crea una eSIM de prueba real en el proveedor, con un código de activación ficticio, por lo que no se puede instalar en un teléfono. No se descuenta nada, y las respuestas lo indican: balanceDebited, transactionCreated y payoutCreated son todos false. Una recarga responde con un saldo de cero. El consumo es estático: una eSIM nueva muestra toda su asignación y el estado ACTIVE. Las reservas del sandbox solo son visibles para las claves sandbox.
Qué solo se puede probar en Live
La comprobación de saldo, la de duplicados y el bloqueo de saldo se ejecutan solo en Live. Por eso las respuestas 402 con insufficient_balance, 409 por el mismo paquete pedido de nuevo en menos de 60 segundos y 503 con balance_lock_timeout nunca aparecen en el sandbox. Escribe su gestión a partir de la lista de códigos de error.
Pasar a Live
Las claves Live dependen de la aprobación de la agencia: hasta que tu agencia esté aprobada, una clave Live responde agency_not_active y tu clave sandbox sigue funcionando. Los pedidos Live se pagan con un saldo de agencia con fondos. Pasar a Live cambia la clave, no el código, porque sandbox y Live comparten una misma URL base.
Quién desarrolla con la API de eSIM
Cada perfil se apoya en una parte distinta de las mismas llamadas.
Agencias que venden viajes
Las agencias venden una eSIM junto al vuelo y el hotel. Piden con el correo electrónico del propio viajero, para que el proveedor envíe el código QR y un enlace para compartir, y leen el consumo cuando un viajero lo pide. La tasa de comisión llega con cada paquete, y agent_id registra qué usuario de tu agencia hizo un pedido.
OTA y marketplaces
Los marketplaces construyen primero la página de exploración: un país cada vez, paquetes locales o regionales, las redes y la asignación de datos de cada paquete, y una comprobación del dispositivo antes de que el viajero compre. Una pantalla que lista las eSIM de un viajero puede leer el consumo de hasta 50 de ellas en una sola llamada.
Equipos de tecnología de viajes y corporativos
Los equipos de tecnología de viajes y los departamentos de viajes corporativos crean sus propias herramientas de reserva. Todo lo que necesitan para empezar es público: el archivo OpenAPI, la colección Postman y una documentación en texto plano que un asistente de programación con IA puede leer, de modo que el primer prototipo parte del contrato real.
API de eSIM: preguntas frecuentes
¿Qué es la API de eSIM de FX-Port y para quién es?
Es una API REST con la que una agencia de viajes, una OTA o un revendedor vende eSIM de datos de viaje desde una sola integración. Listas los paquetes de un destino con precios en la moneda de tu agencia y pides uno para un viajero. Entregas al viajero el código QR, consultas el consumo y recargas. Todo es JSON sobre HTTPS, y un archivo OpenAPI describe cada endpoint.
¿Hay un sandbox gratuito y cómo consigo una clave?
Sí. Crea una cuenta de FX-Port, abre la página de API de tu panel y crea una clave sandbox; puedes hacerlo por tu cuenta y sin coste. Un pedido en el sandbox crea una eSIM de prueba con un código de activación ficticio, por lo que no se puede instalar en un teléfono. No se descuenta nada de tu saldo. Sandbox y Live comparten una misma URL base, así que el código que pruebas es el que publicas.
¿Qué hace falta para pasar a Live?
Tu agencia debe estar aprobada para que una clave Live funcione. Hasta entonces se rechaza una clave Live y tu clave sandbox sigue funcionando. Los pedidos Live se pagan con un saldo de agencia con fondos, que el sandbox nunca toca, y cualquier clave se puede restringir a una lista de direcciones IP. Cambiar de entorno consiste solo en cambiar la clave; cada respuesta indica el entorno del que procede.
¿Qué países y paquetes puedo vender?
Hay paquetes para más de 190 países, y los paquetes regionales aparecen bajo su región. Los paquetes se diferencian en datos incluidos, validez, redes y si admiten recarga. Lee estos campos y el identificador del paquete de la respuesta del catálogo en lugar de fijarlos en el código. Consulta un país cada vez, porque el catálogo completo es una respuesta enorme. Una lista de dispositivos aparte permite comprobar el teléfono del viajero antes de la venta.
¿Cómo recibe el viajero la eSIM?
La respuesta del pedido incluye el código QR, su cadena de activación, un enlace de instalación para iPhone y una página para compartir. Puedes mostrarlos en tus propias pantallas. FX-Port también pide al proveedor que envíe por correo el código QR y un enlace para compartir a la dirección del viajero en cuanto se crea la eSIM. Si el proveedor aún no ha devuelto la eSIM, el pedido existe igualmente y los datos estarán disponibles más tarde en la llamada de datos de instalación.
¿Cómo se combinan precios, comisión y saldo?
Cada paquete incluye estos campos de importe en la moneda de tu agencia: el precio base antes de tu comisión, el precio total que cobrar al viajero, el importe descontado de tu saldo y tu tasa de comisión. Tu comisión es el precio total menos el débito. Lee estos campos en lugar de reconstruirlos, porque el débito es propio de tu agencia. En el sandbox no se descuenta nada; en Live, el débito sale de tu saldo de agencia.
¿Puedo recargar una eSIM y cómo veo lo que queda?
Sí, en dos llamadas: lista los paquetes que se pueden añadir a esa eSIM concreta y crea la recarga con uno de ellos. Una recarga no siempre es posible, porque un proveedor puede cambiar el operador de un país. Una lista vacía significa entonces que el viajero necesita una eSIM nueva. El consumo se guarda en caché hasta 15 minutos, así que trátalo como una cifra reciente, y una llamada lee hasta 50 eSIM.
¿Cómo se informa de los fallos y hay webhooks?
Un fallo llega en un único formato con un código de error estable, y ese código es lo que debe comprobar tu programa, no el texto del mensaje. Las lecturas se pueden repetir sin riesgo con retroceso. Crear un pedido o una recarga es distinto: no hay clave de idempotencia, así que tras un tiempo de espera agotado busca la reserva antes de volver a intentarlo. FX-Port rechaza un duplicado evidente, como el mismo paquete pedido dos veces en 60 segundos en Live. No hay webhooks.
¿Puedo cancelar o reembolsar un pedido de eSIM mediante la API?
No. La API no tiene ningún endpoint para cancelar ni reembolsar un pedido de eSIM. Cada pedido crea exactamente una eSIM, así que comprueba el paquete y los datos del viajero antes de enviarlo. Si el proveedor rechaza un pedido, no se descuenta nada y se guarda una reserva fallida. Para un problema con un pedido concreto, escribe al equipo de desarrollo e indica su identificador de reserva.
¿Qué necesito para empezar y qué herramientas ayudan?
Necesitas una clave sandbox y un cliente HTTP. La documentación añade un archivo OpenAPI 3.1, una colección Postman, ejemplos de código en 9 lenguajes y exportaciones en texto plano para asistentes de IA. Guarda tus claves en tu servidor, nunca en un navegador ni en una aplicación. Lo que lleva más tiempo es tu propio proceso de compra, la entrega del código QR al viajero y la gestión de errores.
Otras APIs de FX-Port
Una eSIM suele acompañar a un viaje. Las APIs de vuelos y de hoteles usan las mismas claves, el mismo cuerpo de error y las mismas convenciones que las de eSIM, y sus reservas están en el mismo historial de la cuenta.
Busca, tarifica y reserva vuelos, paga pedidos retenidos, cancela y consulta billetes.
Encuentra hoteles, consulta tarifas, haz prerreservas y reservas, consulta vouchers y cancela.
- API de trasladosPreliminar
Cotiza, reserva, sigue y cancela traslados de aeropuerto.
¿Prefieres no escribir código? Las agencias también pueden vender eSIM desde el panel de FX-Port. Vende eSIM desde el panel
Haz tu primer pedido de eSIM en el sandbox
Crea una cuenta, genera una clave sandbox, lista paquetes, crea un pedido y consulta el consumo hoy mismo. Las claves Live llegan cuando tu agencia esté aprobada.