新規OpenAPI 3.1ファイルを提供するREST API
旅行会社・OTA・リセラー向けのeSIM API
1つのREST APIで旅行用eSIMを販売できます。国別のデータパッケージを旅行会社の通貨建ての価格で取得し、旅行者向けに注文して、QRコードを渡し、利用量を確認してチャージします。ベースURLはSandboxとLiveで共通です。まずは無料のSandboxキーから。Liveキーは旅行会社の承認後に使えます。
ドキュメントは英語で提供されています。
- ベースURL
https://api.fx-port.com/api/v1- 認証
Authorization: Bearer fxp_test_...- キーのプレフィックス
fxp_test_ / fxp_live_- エンドポイント
- 12
- パッケージがある国
- 190+
- コードサンプルの言語
- 9
eSIM APIを1リクエストずつ確認
eSIMの販売を、リクエストの作成、送信、レスポンスまで順を追って確認できます。セッションは、eSIMの販売、旅行者の接続維持、デバイスと予約の確認、対処すべき失敗を扱います。リクエストとレスポンスはドキュメントの例であり、このページがAPIを呼び出すことはありません。
3件のリクエスト:パッケージを一覧取得, eSIMを注文, セットアップデータを読む。
イメージ用セッションです。ボディはドキュメントの例で、日付は今日より先になるよう進めてあり、所要時間はイメージです。このページはリクエストを送信しません。
パッケージを探し、注文して、セットアップデータを読む
1つの国のパッケージから始め、旅行者向けに1つ注文して、その注文のセットアップデータを読み取ります。Sandboxではダミーのアクティベーションコードを持つテスト用eSIMが作成され、引き落としは行われません。コンソールには、カタログのレスポンスを抜粋したものが表示されます。
パッケージを一覧取得
カタログの呼び出しは
countryとtypeを受け取り、条件に合うパッケージを、旅行会社の通貨建ての価格で返します。旅行者が選んだパッケージのpackage_idを保存してください。リクエスト GET /esims/packages curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 180 ms · 3.6 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 6000 ratelimit-policy: 6000;w=60 { "environment": "sandbox", "success": true, "endpoint": "/packages", "data": [ { "id": "france-in-7days-1gb", "package_id": "france-in-7days-1gb", "type": "sim", "price": 402.5, "base_price": 402.5, "amount": 1024, "day": 7, "is_unlimited": false, "title": "1 GB - 7 days", "is_fair_usage_policy": false, "fair_usage_policy": null, "data": "1 GB", "voice": null, "text": null, "country_name": "France", "country_code": "FR", "country_slug": "france", // ... "operator_name": "KPN France Data only", "operator_id": 1704, // ... "operator_type": "local", "operator_is_prepaid": false, "operator_esim_type": "Prepaid", "operator_warning": null, "operator_apn_type": "automatic", "operator_is_roaming": true, // ... "operator_plan_type": "data", "operator_activation_policy": "first-usage", "operator_is_kyc_verify": false, "operator_rechargeability": true, // ... // ... 1 more // ... "is_regional": false, // ... 10 more }, // ... ], "meta": { "total_packages": 12, "filters_applied": { // ... 2 more }, "locale": "en", "agency_currency": "DZD", "currency": "DZD", "supplier_currency": "USD", "exchange_rate": 250, "commission_percentage": "12 %", "commission_rate": 12 } }表示用に例を省略しています
- PASS ステータスコードが 200
- PASS $.success が true と等しい
- PASS $.data[0].package_id が存在する
- PASS $.data[0].balance_debit_amount が存在する
eSIMを注文
注文の作成には、
package_idに旅行者のメールアドレスと電話番号を添えます。レスポンスのbooking_idとdata.iccidを保存してください。Sandboxでは、balanceDebited、transactionCreated、payoutCreatedはすべてfalseです。リクエスト POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'レスポンス 200 OK · 900 ms · 1.5 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 1200 ratelimit-policy: 1200;w=60 x-fx-limit-class: booking { "environment": "sandbox", "success": true, "data": { "order": { "code": "20261101-106852", "order_id": "20261101-106852", "package_id": "france-in-7days-1gb", "type": "sim", "description": "Order for John Smith", "esim_type": "local", "created_at": "2026-11-09 15:23:22", "package": "KPN France Data only-1 GB - 7 days", "data": "1 GB", "validity": 7, "price": 468.84, "currency": "DZD", "total_price": 468.84, "retail_price": 468.84, "agency_currency": "DZD", "supplier_currency": "USD", "exchange_rate": 250, "voice": null, "text": null, "coverage": "" }, "sim": { "iccid": "8900000540463077957", "created_at": "2026-11-09 15:23:22", "lpa": "lpa.airalo.com", "imsis": null, "qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", // ... "direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "apn_type": "automatic", "apn_value": "N/A", "apn": { // ... 2 more }, "is_roaming": true, "confirmation_code": null, "msisdn": null, "sharing": { "access_code": 8803, "link": "https://esims.cloud/v8hy7-usgkq6wg" } }, "iccid": "8900000540463077957" }, "booking_id": "FX-1793546602916", "message": "eSIM order placed successfully", "balanceDebited": false, "balance_debited": false, "transactionCreated": false, "transaction_created": false, "payoutCreated": false, "payout_created": false }表示用に例を省略しています
- PASS ステータスコードが 200
- PASS $.environment が sandbox と等しい
- PASS $.balance_debited が false と等しい
- PASS $.data.iccid が存在する
セットアップデータを読む
セットアップデータの取得は
booking_idを受け取り、注文のQRコード、アクティベーションデータ、インストールリンク、インストール手順を返します。eSIMを所有する旅行者にのみ表示してください。リクエスト GET /esims/bookings/{booking_id}/setup-instructions curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 210 ms · 1.8 KB 200 OK Content-Type: application/json Cache-Control: private, no-store X-Environment: sandbox ratelimit-limit: 6000 ratelimit-policy: 6000;w=60 { "environment": "sandbox", "success": true, "data": { "code": "20261101-106852", "order_id": "20261101-106852", "currency": "DZD", "package_id": "france-in-7days-1gb", "quantity": 1, "type": "sim", "description": "Order for John Smith", "esim_type": "local", "validity": 7, "package": "KPN France Data only-1 GB - 7 days", "data": "1 GB", "price": 468.84, "created_at": "2026-11-09 15:23:22", // ... "installation_guides": { "en": "https://www.airalo.com/help/getting-started-with-airalo" }, "text": null, "voice": null, "sims": [ { "created_at": "2026-11-09 15:23:22", "iccid": "8900000540463077957", "lpa": "lpa.airalo.com", "imsis": null, "qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", // ... "apn_type": "automatic", "apn_value": "N/A", "is_roaming": true, "confirmation_code": null, "apn": { "ios": { "apn_type": "automatic", "apn_value": "N/A" }, "android": { "apn_type": "automatic", "apn_value": "N/A" } }, "msisdn": null, "direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "direct_android_installation_url": "https://esimsetup.android.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741", "sharing": { "access_code": 8803, "link": "https://esims.cloud/v8hy7-usgkq6wg" } } ], "total_price": 468.84, "retail_price": 468.84, "agency_currency": "DZD" } }表示用に例を省略しています
- PASS ステータスコードが 200
- PASS $.data.package_id が france-in-7days-1gb と等しい
- PASS $.data.sims[0].iccid が存在する
ドキュメントの GET /esims/bookings/{booking_id}/setup-instructions リファレンス
利用量を読み取り、チャージする
旅行者がeSIMを持った後は、残りのデータ量を読み取り、そのeSIMに追加できるパッケージを確認して、チャージを作成します。利用量はキャッシュされるため、値が数分前のものであることがあります。チャージ履歴は、サイドバーとトランスクリプトにあります。
利用量を読む
利用量の呼び出しは注文のICCIDを受け取り、メガバイト単位の
remainingとtotal、status、有効期限を返します。レスポンスはキャッシュから返され、force=trueでサプライヤーに再確認できます。リクエスト GET /esims/usage/{iccid} curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 160 ms · 261 B 200 OK { "environment": "sandbox", "success": true, "data": { "data": { "remaining": 1024, "total": 1024, "expired_at": "2026-11-16 15:23:29", "is_unlimited": false, "status": "ACTIVE", "remaining_voice": 0, "remaining_text": 0, "total_voice": 0, "total_text": 0 }, "meta": { "message": "success" } } }- PASS ステータスコードが 200
- PASS $.data.data.status が ACTIVE と等しい
- PASS $.data.data.remaining が存在する
チャージ用パッケージを一覧取得
この呼び出しは、現時点でこのeSIMに追加できるパッケージを一覧で返します。一覧が空の場合、そのeSIMは現在チャージできません。チャージ用の
package_idは、元の注文ではなく、必ずこの一覧から取得してください。リクエスト GET /esims/topup-packages/{iccid} curl https://api.fx-port.com/api/v1/esims/topup-packages/8900000540463077957 \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 240 ms · 1.1 KB 200 OK { "environment": "sandbox", "success": true, "data": { "data": [ { "id": "france-in-7days-1gb-topup", "package_id": "france-in-7days-1gb-topup", "type": "topup", "price": 468.84, "amount": 1024, "day": 7, "is_unlimited": false, "title": "1 GB - 7 days", "data": "1 GB", "short_info": null, // ... 12 more }, { // ... 22 more } ] } }表示用に例を省略しています
- PASS ステータスコードが 200
- PASS $.data.data の要素数が 2件
- PASS $.data.data[0].type が topup と等しい
チャージを作成
チャージの作成には、この一覧の
package_idとICCIDを指定します。Liveでは、サプライヤーが受け付けた後にのみ残高から引き落とされます。Sandboxではレスポンスのbalanceがゼロで、引き落としは行われません。リクエスト POST /esims/topups curl https://api.fx-port.com/api/v1/esims/topups \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb-topup", "iccid": "8900000540463077957", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123" }'レスポンス 200 OK · 900 ms · 682 B 200 OK { "environment": "sandbox", "success": true, "data": { "topup": { "code": "20261101-106853", "order_id": "20261101-106853", "package_id": "france-in-7days-1gb-topup", // ... 10 more }, "iccid": "8900000540463077957", "balance": { // ... 3 more } }, "booking_id": "FX-1793546625391", "message": "eSIM topup completed successfully", "balanceDebited": false, "balance_debited": false, "transactionCreated": false, "transaction_created": false, "payoutCreated": false, "payout_created": false }- PASS ステータスコードが 200
- PASS $.environment が sandbox と等しい
- PASS $.balance_debited が false と等しい
- PASS $.data.balance.current が 0 と等しい
チャージ履歴を読む
チャージ履歴は、1つのeSIMのチャージを新しい順に返します。チャージは予約一覧に含まれないため、ここで確認します。
リクエスト GET /esims/bookings/{iccid}/topup-history curl https://api.fx-port.com/api/v1/esims/bookings/8900000540463077957/topup-history \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 130 ms · 615 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "id": "bd6ff7d7-392f-4d56-8dea-4f0f3dff0af9", "booking_id": "FX-1793546625391", "order_id": "20261101-106853", "status": "confirmed", "currency": "DZD", "total_price": 468.84, "agency_commission": 50.24, "type": "topup", "package_name": "1 GB - 7 days", "iccid": "8900000540463077957", "customer_email": "[email protected]", "customer_first_name": "John", "customer_last_name": "Smith", "customer_phone": "+15555550123", "provider_name": "Airalo", // ... 4 more } ] }- PASS ステータスコードが 200
- PASS $.data[0].type が topup と等しい
デバイスを確認し、予約を読む
販売の前に、旅行者のスマートフォンがeSIMに対応しているかを確認します。販売の後は、予約を読み取り、予約の参照番号が自社のものかを確認します。一括の利用量は、サイドバーに表示されます。
デバイス一覧を確認
対応デバイスの呼び出しは、eSIMに対応していることが確認されているデバイスを、
brand、model、osとともに返します。販売の前に、旅行者のスマートフォンを検索してください。リクエスト GET /esims/compatible-devices curl https://api.fx-port.com/api/v1/esims/compatible-devices \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 120 ms · 283 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "model": "T803D", "os": "android", "brand": "Alcatel", "name": "V3 Ultra" }, { "model": "iPhone15,2", "os": "ios", "brand": "Apple", "name": "iPhone 14 Pro" } ], "meta": { "total_devices": 631, "cached_at": "2026-11-09T15:07:43.957236", "cache_age_days": 0.01 } }- PASS ステータスコードが 200
- PASS $.success が true と等しい
- PASS $.data[0].model が存在する
予約を一覧取得
予約一覧は、旅行会社のeSIM注文を新しい順に返します。このリクエストは
limitで1件の予約を指定し、paginationには、条件に合う注文の件数と、次のページがあるかどうかが示されます。リクエスト GET /esims/bookings curl 'https://api.fx-port.com/api/v1/esims/bookings?limit=1' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 150 ms · 714 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "id": "639417b4-b103-4ece-bd5d-850315322278", "booking_id": "FX-1793546602916", "order_id": "20261101-106852", "status": "confirmed", "currency": "DZD", // ... 4 more "iccid": "8900000540463077957", // ... 9 more } ], "pagination": { "total": 61, "page": 1, "limit": 1, "pages": 61, "total_pages": 61, "has_more": true } }- PASS ステータスコードが 200
- PASS $.data の要素数が 1件
- PASS $.pagination.has_more が true と等しい
所有を確認
所有確認は、予約が自社のものであれば、
is_ownerをtrueで返します。他の旅行会社の予約と存在しない予約には同じレスポンスが返るため、この呼び出しで参照番号を探り出すことはできません。リクエスト GET /esims/bookings/{booking_id}/verify curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/verify \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 90 ms · 167 B 200 OK { "environment": "sandbox", "isOwner": true, "is_owner": true, "userAgencyId": "0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d", "bookingAgencyId": "0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d" }- PASS ステータスコードが 200
- PASS $.is_owner が true と等しい
利用量を一括で読む
1回の呼び出しで、
iccidsに指定した複数のeSIMの利用量を読み取り、ICCIDごとに1件ずつ、それぞれのstatusとともに返します。iccidsは必ず指定してください。リクエスト GET /esims/usage/bulk curl 'https://api.fx-port.com/api/v1/esims/usage/bulk?iccids=8900000540463077957' \ -H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK · 220 ms · 321 B 200 OK { "environment": "sandbox", "success": true, "data": [ { "iccid": "8900000540463077957", "data": { "data": { "remaining": 1024, "total": 1024, "expired_at": "2026-11-16 15:23:29", "is_unlimited": false, "status": "ACTIVE", "remaining_voice": 0, // ... 3 more }, "meta": { "message": "success" } }, "status": "success" } ] }- PASS ステータスコードが 200
- PASS $.data[0].status が success と等しい
失敗と、それぞれの対処
すべての失敗は同じボディ形式で返り、errorsの先頭の要素に、変わることのないcodeがあります。ここでは、注文の呼び出しをあえて失敗させます。理由はそれぞれ異なり、対処も異なります。
注文に読み取りキーを使用
注文の呼び出しに読み取りキーを使うと、ボディが読み込まれる前に
403とread_write_permission_requiredで拒否されます。読み取り + 書き込みキーに切り替えてください。リクエスト POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'レスポンス 403 Forbidden · 90 ms · 456 B 403 Forbidden { "environment": "sandbox", "success": false, "errors": [ { "code": "read_write_permission_required", "type": "permission_error", "title": "Read write permission required", "message": "This endpoint requires an API key with read_write permission.", "field": null, "details": {}, "documentation_url": "https://fx-port.com/docs/errors#read_write_permission_required" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 403 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS ステータスコードが 403
- PASS エラーコードが read_write_permission_required
- PASS $.errors[0].type が permission_error と等しい
無効なメールアドレス
メールアドレスではない値は、
400とinvalid_emailで拒否され、fieldにはemailが示されます。注文を再送する前に値を修正してください。同じリクエストは、同じように失敗します。リクエスト POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "traveler-at-example.com", "phone": "+15555550123", "description": "Order for John Smith" }'レスポンス 400 Bad Request · 100 ms · 381 B 400 Bad Request { "environment": "sandbox", "success": false, "errors": [ { "code": "invalid_email", "type": "validation_error", "title": "Invalid email", "message": "email is not a valid email address", "field": "email", "details": {}, "documentation_url": "https://fx-port.com/docs/errors#invalid_email" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 400 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS ステータスコードが 400
- PASS エラーコードが invalid_email
- PASS $.errors[0].field が email と等しい
重複した注文
すでに処理中のパッケージへの注文は、
409とduplicate_requestで拒否されます。すぐに再送せず、まず予約を検索して、作成されていない場合にのみ、再度注文してください。リクエスト POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'レスポンス 409 Conflict · 110 ms · 423 B 409 Conflict { "environment": "sandbox", "success": false, "errors": [ { "code": "duplicate_request", "type": "conflict", "title": "Duplicate request", "message": "An identical order is already being processed. Please wait before retrying.", "field": null, "details": {}, "documentation_url": "https://fx-port.com/docs/errors#duplicate_request" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 409 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS ステータスコードが 409
- PASS エラーコードが duplicate_request
- PASS $.errors[0].type が conflict と等しい
リクエストが多すぎる場合
1分あたりの制限を超えると、呼び出しは
429とrate_limit_exceededで拒否され、Retry-Afterヘッダーに待つべき秒数が示されます。その後、バックオフを使ってリトライしてください。リクエスト POST /esims/orders curl https://api.fx-port.com/api/v1/esims/orders \ -H "Authorization: Bearer fxp_test_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "package_id": "france-in-7days-1gb", "first_name": "John", "last_name": "Smith", "email": "[email protected]", "phone": "+15555550123", "description": "Order for John Smith" }'レスポンス 429 Too Many Requests · 80 ms · 504 B 429 Too Many Requests Retry-After: 12 { "environment": "sandbox", "success": false, "errors": [ { "code": "rate_limit_exceeded", "type": "rate_limit_error", "title": "Rate limit exceeded", "message": "Too many requests hit the API too quickly. Please retry your request after the time specified in the `ratelimit-reset` header.", "field": null, "details": { "retry_after": 12 }, "documentation_url": "https://fx-port.com/docs/errors#rate_limit_exceeded" } ], "meta": { "request_id": "req_7f0c2e9a41b84d6e8a35c1d2", "status": 429 }, "request_id": "req_7f0c2e9a41b84d6e8a35c1d2" }- PASS ステータスコードが 429
- PASS エラーコードが rate_limit_exceeded
- PASS ヘッダー Retry-After がある
- PASS $.errors[0].details.retry_after が 12 と等しい
カタログの取得から旅行者の接続まで、5つのステップ
連携は短い流れです。カタログを読み、注文を作成し、旅行者にeSIMを渡し、利用量を確認して、データがなくなったらチャージします。内容を変更するのは注文とチャージだけで、それ以外の呼び出しはすべて読み取りのみです。
1つの渡航先のカタログを取得
1つの国のパッケージを、旅行会社の通貨建ての価格で取得し、旅行者が選んだパッケージのpackage_idを保存します。countryは必ず指定してください。カタログ全体はページ分割のない非常に大きなレスポンスになります。カタログは変わるため、パッケージIDは固定値にせず、レスポンスから読み取ってください。
リクエスト
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK
{
"environment": "sandbox",
"success": true,
"endpoint": "/packages",
"data": [
{
"id": "france-in-7days-1gb",
"package_id": "france-in-7days-1gb",
"type": "sim",
"price": 402.5,
"base_price": 402.5,
// ... 28 more
"total_price": 468.84,
"balance_debit_amount": 418.6,
"b2b_price": 418.6,
"agency_commission": "12 %",
"commission_rate": 12,
"currency": "DZD",
// ... 2 more
},
// ...
],
"meta": {
"total_packages": 12,
"filters_applied": {
// ... 2 more
},
"locale": "en",
"agency_currency": "DZD",
"currency": "DZD",
"supplier_currency": "USD",
"exchange_rate": 250,
"commission_percentage": "12 %",
"commission_rate": 12
}
}注文を作成
package_idに、旅行者のメールアドレスと電話番号を添えて送信します。1回の注文で作成されるeSIMはちょうど1つで、Liveでは旅行会社の残高から引き落とされます。以降の呼び出しにはどちらかが必要なので、レスポンスのbooking_idとICCIDを保存してください。
リクエスト
curl https://api.fx-port.com/api/v1/esims/orders \
-H "Authorization: Bearer fxp_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"package_id": "france-in-7days-1gb",
"first_name": "John",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+15555550123",
"description": "Order for John Smith"
}'レスポンス 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"order": {
"code": "20261101-106852",
"order_id": "20261101-106852",
"package_id": "france-in-7days-1gb",
// ... 17 more
},
"sim": {
// ... 4 more
"qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 7 more
"sharing": {
"access_code": 8803,
"link": "https://esims.cloud/v8hy7-usgkq6wg"
}
},
"iccid": "8900000540463077957"
},
"booking_id": "FX-1793546602916",
"message": "eSIM order placed successfully",
"balanceDebited": false,
"balance_debited": false,
"transactionCreated": false,
"transaction_created": false,
"payoutCreated": false,
"payout_created": false
}| フィールド | 内容 |
|---|---|
booking_id | 注文を識別するFX-Portの参照番号です。セットアップデータの取得、所有確認、自社の記録のために保存してください。 |
data.iccid | eSIMの識別子です。利用量、チャージ、インストール手順は、いずれもICCIDを指定して取得します。 |
data.sim.qrcode data.sim.qrcode_url | QRコードに含まれるアクティベーション文字列と、QRコード画像へのリンクです。 |
data.sim.direct_apple_installation_url data.sim.sharing | iPhoneでインストールを開始するリンクと、旅行者がアクセスコードでeSIMを開ける共有ページです。Android用のリンクはセットアップデータの取得で追加されます。 |
PENDING-で始まり、サプライヤーから届いた後にセットアップデータの取得でデータを入手できます。旅行者にeSIMを渡す
レスポンスにはQRコードとそのアクティベーション文字列が含まれるため、自社の画面に表示できます。FX-Portはサプライヤーにも、旅行者のアドレスへQRコードと共有リンクをメールで送るよう依頼するので、自分で転送する必要はありません。セットアップデータの取得では、同じデータをインストール手順とともに後から再取得できます。
リクエスト
curl https://api.fx-port.com/api/v1/esims/bookings/FX-1793546602916/setup-instructions \
-H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"code": "20261101-106852",
"order_id": "20261101-106852",
"currency": "DZD",
"package_id": "france-in-7days-1gb",
"quantity": 1,
"type": "sim",
"description": "Order for John Smith",
"esim_type": "local",
"validity": 7,
"package": "KPN France Data only-1 GB - 7 days",
"data": "1 GB",
// ... 5 more
"sims": [
{
"created_at": "2026-11-09 15:23:22",
"iccid": "8900000540463077957",
// ... 2 more
"qrcode": "LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 6 more
"direct_apple_installation_url": "https://esimsetup.apple.com/esim_qrcode_provisioning?carddata=LPA:1$lpa.airalo.com$DUMMY-2610301358-iKFxr-44741",
// ... 2 more
}
],
// ... 3 more
}
}利用量を確認
ICCIDを指定して、eSIMの残量と有効期限を読み取ります。レスポンスは最大15分間キャッシュされるため、メーターではなく、画面表示やリマインダーに使ってください。
リクエスト
curl https://api.fx-port.com/api/v1/esims/usage/8900000540463077957 \
-H "Authorization: Bearer fxp_test_YOUR_KEY"レスポンス 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"data": {
"remaining": 1024,
"total": 1024,
"expired_at": "2026-11-16 15:23:29",
"is_unlimited": false,
"status": "ACTIVE",
"remaining_voice": 0,
"remaining_text": 0,
"total_voice": 0,
"total_text": 0
},
"meta": {
"message": "success"
}
}
}データがなくなったらチャージ
そのeSIMに追加できるパッケージを一覧で取得し、その中の1つでチャージを作成します。一覧が空の場合、そのeSIMは現在チャージできないため、旅行者には新しいeSIMが必要です。
リクエスト
curl https://api.fx-port.com/api/v1/esims/topups \
-H "Authorization: Bearer fxp_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"package_id": "france-in-7days-1gb-topup",
"iccid": "8900000540463077957",
"first_name": "John",
"last_name": "Smith",
"email": "[email protected]",
"phone": "+15555550123"
}'レスポンス 200 OK
{
"environment": "sandbox",
"success": true,
"data": {
"topup": {
"code": "20261101-106853",
"order_id": "20261101-106853",
"package_id": "france-in-7days-1gb-topup",
"package": "KPN France Data only-1 GB - 7 days",
"data": "1 GB",
"validity": 7,
"price": 468.84,
// ... 6 more
},
"iccid": "8900000540463077957",
"balance": {
"previous": 0,
"current": 0,
"currency": "DZD"
}
},
"booking_id": "FX-1793546625391",
"message": "eSIM topup completed successfully",
"balanceDebited": false,
"balance_debited": false,
"transactionCreated": false,
"transaction_created": false,
"payoutCreated": false,
"payout_created": false
}価格、手数料、残高
すべてのパッケージに金額項目があり、旅行会社の通貨建てでサーバー側で計算されます。リクエストボディに含めた価格は無視されるため、注文は常にサーバーが計算した価格で作成されます。
| フィールド | 内容 |
|---|---|
base_price price | 手数料を加える前のパッケージ価格です。残高から引き落とされる金額ではありません。 |
total_price retail_price | 手数料を含む、旅行者に請求する価格です。 |
balance_debit_amount b2b_price | Liveでパッケージを注文したときに旅行会社の残高から引き落とされる金額です。計算せず、この値を読み取ってください。 |
agency_commission commission_rate | テキストと数値で示される手数料率です。予約では、手数料は金額で返されます。 |
カタログの例では、旅行者は468.84 DZDを支払います。Liveでの注文では残高から418.60 DZDが引き落とされ、その差額の50.24 DZDが手数料です。
手数料率は旅行会社ごとに決まります
手数料率はパッケージごとに返され、すべての旅行会社で同じではありません。契約済みの法人向け旅行会社では手数料率がゼロになることがあり、その場合は合計価格と引き落とし額が一致します。
項目は読み取るもので、再計算しないでください
引き落とし額は、旅行会社固有の金額が含まれるため、基本価格より高くなることがあります。balance_debit_amountを読み取り、base_priceから計算しないでください。priceという語は、カタログでは基本価格ですが、注文、チャージ用パッケージ、セットアップデータでは販売価格を指します。どこでもbase_priceとtotal_priceを使えば、この曖昧さはなくなります。
旅行会社の通貨建ての価格
サプライヤーの通貨にかかわらず、すべての金額は旅行会社の通貨に換算済みです。レスポンスにはサプライヤーの通貨と為替レートも示されるため、レートを自分で検証でき、再度換算する必要はありません。
販売後の対応:利用量、チャージ、セットアップデータ
販売は注文で終わりではありません。次の呼び出しで旅行者の接続を維持できます。対象は、キーと同じ環境で旅行会社が注文したeSIMに限られます。
利用量の読み取りとデータの鮮度
利用量では、1つのeSIM、または1回の呼び出しで最大50個のeSIMについて、残量、容量、ステータス、有効期限を取得できます。FX-Portはサプライヤーのレート制限を守るため、直前のレスポンスを最大15分間保持するので、値がそれだけ古いことがあります。たとえばチャージの直後など、サプライヤーに再確認したい場合はforce=trueを渡してください。サプライヤーが利用量の取得頻度を制限しているため、毎回のリクエストで使わないでください。サプライヤーが応答できない場合は、最後に取得した値が古いデータとして示されます。
チャージ:まず確認し、次に作成
チャージは2回の呼び出しで行います。まずそのeSIMに追加できるパッケージを一覧で取得し、返されたパッケージIDの1つでチャージを作成します。元の注文のパッケージIDは再利用せず、チャージ用のパッケージを後のために保存しないでください。旅行者がチャージしたいときに、改めて確認します。チャージはeSIMにデータを追加するもので、残りのデータを置き換えません。結果はforce=trueを付けた利用量で確認してください。
チャージできない場合
ある国で使う携帯電話事業者はサプライヤーが選び、まれに変更されることがあります。その場合、eSIMは有効期限まで使えても、そのパッケージにはチャージできなくなります。チャージ用パッケージの一覧は空で返ります。サプライヤーがチャージを拒否した場合、残高には影響せず、その試行は失敗した予約として保存されます。レスポンスはsupplier_errorとなるので、これに応じた処理を実装できます。
セットアップデータとインストール手順
セットアップデータの取得は、注文のQRコード、アクティベーションデータ、インストールリンク、インストール手順をいつでも返します。手順の取得は、OSごとの手順を指定した言語で返します。手順はサプライヤーによる汎用的な文章なので、注文のQRコードと並べて表示してください。どちらも、eSIMを所有する旅行者にのみ表示してください。
予約、チャージ履歴、所有確認
予約一覧は、キーの環境における旅行会社のeSIM注文を新しい順に返します。予約ID、旅行者名、メールアドレス、パッケージ名、ICCIDで検索できます。チャージはこの一覧に含まれないため、eSIMのチャージ履歴で取得してください。予約IDを使ったリンクや画面を作る前に、所有確認でその予約が自社のものかどうかを確認できます。他の旅行会社の予約と存在しない予約には、同じレスポンスが返ります。
eSIMの全エンドポイントとOpenAPI、Postman、コードサンプル
eSIM APIには、1つのベースURLの下に12個のエンドポイントがあります。各行から、その呼び出しのリファレンスページを開けます。リクエストのフィールド、レスポンス、エラー、9言語の例を掲載しています。
| エンドポイント | 機能 | キー |
|---|---|---|
GET /api/v1/esims/packages | 1つの国または地域のパッケージを、旅行会社の通貨建ての価格で取得します。必ず国を指定してください。カタログ全体は非常に大きく、ページ分割もありません。 | 読み取り |
GET /api/v1/esims/compatible-devices | eSIMに対応していることが確認されているデバイスです。旅行者が購入する前の確認に使います。 | 読み取り |
POST /api/v1/esims/orders | 旅行者向けに、パッケージから1つのeSIMを作成し、サプライヤーで有効化します。Liveでは旅行会社の残高から引き落とされます。 | 読み取り + 書き込み |
GET /api/v1/esims/topup-packages/{iccid} | 現時点で1つのeSIMに追加できるパッケージです。一覧が空の場合、そのeSIMは現在チャージできません。 | 読み取り |
POST /api/v1/esims/topups | 既存のeSIMにチャージ用パッケージを追加します。Liveでは、サプライヤーが受け付けた後にのみ残高から引き落とされます。 | 読み取り + 書き込み |
GET /api/v1/esims/usage/{iccid} | 1つのeSIMの残量、容量、ステータス、有効期限です。レスポンスは最大15分前のものである場合があります。 | 読み取り |
GET /api/v1/esims/usage/bulk | 1回の呼び出しで最大50個のeSIMの利用量を取得します。ICCIDごとに1件ずつ、それぞれ独自のステータスが付きます。 | 読み取り |
GET /api/v1/esims/bookings | 旅行会社のeSIM注文を新しい順に返します。検索とページ分割に対応しています。チャージはこの一覧に含まれません。 | 読み取り |
GET /api/v1/esims/bookings/{iccid}/topup-history | 1つのeSIMのチャージを新しい順に返します。チャージがない場合、一覧は空です。 | 読み取り |
GET /api/v1/esims/bookings/{booking_id}/verify | 予約の参照番号が自社のものかを確認します。その番号を使ったリンクや画面を作る前に使います。 | 読み取り |
GET /api/v1/esims/bookings/{booking_id}/setup-instructions | 注文のQRコード、アクティベーションデータ、インストールリンク、インストール手順をJSONで返します。 | 読み取り |
GET /api/v1/esims/instructions/{iccid} | 1つのICCIDについて、OSごとのインストール手順を、指定した言語で段階的に返します。 | 読み取り |
OpenAPI 3.1
1つのファイルで、すべてのエンドポイントとフィールドを記述しています。クライアントの生成、APIツールへのインポート、コーディングアシスタントへの入力に使えます。
Postmanコレクション
eSIMのコレクションは、12個のエンドポイントすべてを、販売の段階に沿ったフォルダーにまとめています。キーは含まれていないため、ご自身のキーを追加してください。
9言語のコードサンプル
各リファレンスページには、OpenAPIの記述から生成した、cURL、Node.js、Python、PHP、Go、Java、C#、Swift、Kotlinのリクエスト例が掲載されています。eSIMのどのリクエストも、これらすべてで利用できます。
AIアシスタント向けドキュメント
llms.txtとllms-full.txtは、ドキュメントをプレーンテキストでAIアシスタントに渡します。ドキュメントの各ページは、アドレスに.mdを付けるとMarkdownとして読めます。
本番運用を前提に設計:キー、エラー、リトライ、キャッシュ
eSIM連携の品質は、本番環境での認証、障害、リトライ、キャッシュ、レート制限で問われます。それぞれについて知っておくべき点を説明します。
ベースURLは1つ、キーは2種類
すべてのリクエストは、AuthorizationヘッダーでBearerトークンとしてキーを送ります。キーが使える環境はプレフィックスで分かります。Sandboxはfxp_test_、Liveはfxp_live_です。どちらも同じベースURLにアクセスし、JSONレスポンスには取得元の環境がenvironmentに示されます。キーはサーバーに置き、ブラウザやアプリには置かないでください。FX-Portは各キーのハッシュだけを保存するため、紛失したキーを再表示することはできません。キーの変更が反映されるまでに数分かかることがあります。
キーごとに使える呼び出し
読み取りキーでは、パッケージの一覧、デバイスの確認、利用量と予約の読み取りができます。注文やチャージの作成には読み取り + 書き込みキーが必要で、読み取りキーで試みるとread_write_permission_requiredが返ります。どのキーも、IPアドレスの一覧に制限でき、それ以外のアドレスからの呼び出しにはip_not_allowedが返ります。コードが結果を表示するだけの場面では、読み取りキーを使ってください。
すべての失敗に共通のエラー形式
失敗した呼び出しはerrors配列を返します。先頭の要素には、変わることのないcode、対処方法を示すtype、原因となったfieldが含まれます。メッセージではなく、コードを判定に使ってください。航空券、ホテル、eSIM、アカウントで共通のエラー一覧には、180個のコードがあります。サプライヤーが注文やチャージを拒否した場合、レスポンスはサプライヤー自身のHTTPステータスを伴うsupplier_errorになります。引き落としは行われず、失敗した予約が保存されます。再起動の直後は、カタログとデバイス一覧がsuccessをfalseにして202を返すことがあります。数秒待ってから、もう一度リクエストしてください。
二重注文を避けるリトライ
FX-Portには冪等性キーがないため、送信すべきIdempotency-Keyヘッダーもありません。読み取りは繰り返しても安全ですが、注文やチャージの作成は安全ではありません。明らかな重複は、409とduplicate_requestで拒否されます。処理中のパッケージへの注文がこれに当たります。Liveでは、旅行者が誰であっても、旅行会社が最後に確定した注文から60秒以内に同じパッケージを再度注文した場合も拒否されます。注文は通常数秒で応答しますが、サプライヤーの処理が遅いと、はるかに長くかかることがあります。呼び出しがタイムアウトした場合や接続が切れた場合は、eSIMが作成されている可能性があるため、すぐに注文を再送しないでください。予約一覧のsearchパラメーターに旅行者のメールアドレスを指定して検索し、何も作成されていない場合にのみ、再度注文してください。
Webhookはありません:必要なときに取得
FX-Portは、SandboxでもLiveでも、お客様のURLを呼び出しません。注文のレスポンスには、eSIM、またはサプライヤーがまだ返していない間はPENDING-のプレースホルダーが入っています。それ以外の情報は、セットアップデータ、利用量、予約一覧など、必要なときに取得します。
キャッシュと速度
利用量は最大15分間、チャージ用パッケージの一覧は数分間保持され、force=trueでキャッシュを使わずに取得できます。絞り込まないカタログはページ分割のない非常に大きなレスポンスになるため、countryを指定し、Accept-Encoding: gzipで圧縮を受け付けてください。パッケージ名はlocaleパラメーターの言語で返されます。英語以外の言語での最初のリクエストは、そのときに文言を取得し、以降はキャッシュされるため、遅くなります。
レート制限
制限はキーごと、1分ごとに、2つのグループに分けて数えられます。すべてのレスポンスにratelimit-limitとratelimit-remainingが含まれるため、拒否される前に速度を落とせます。429が返ったら、Retry-Afterの秒数だけ待ち、指数バックオフとジッターでリトライしてください。同じキーまたは同じ旅行会社で注文やチャージが同時に多すぎると、concurrency_limit_exceededが返ることがあります。
| 呼び出しの種類 | 1分あたり |
|---|---|
| 注文とチャージの作成 | 1,200 |
| それ以外のeSIMエンドポイント | 6,000 |
現時点では、注文とチャージの同時実行数の上限は観測モードです。数えられるだけで強制はされないため、これを理由に拒否されることはまだありません。強制を開始する日は変更履歴でお知らせします。これらの数値は約束ではなく、現在の方針として読んでください。Sandboxキーの1分あたりのカウンターはLiveキーと同じなので、負荷テストはループで回さず、計画して実施してください。
名前とバージョン
リクエストのフィールドはfirst_nameやagent_idのようなsnake_caseです。以前の表記も引き続き使えます。user_idはagent_idとして読み取られ、warningsの項目が追加されます。customer_emailは警告なしでemailとして受け付けられます。多くのレスポンスでは、以前のキーが同じ値のsnake_caseのキーと並んで残っています。たとえばcodeと並ぶorder_idです。?naming=snakeを付けると、snake_caseのキーだけが返ります。バージョンはパスの/api/v1に含まれます。互換性のない変更には新しいプレフィックスが付き、新しいフィールドや表記の追加は後方互換です。
無料のSandboxで始めて、Liveへ
このページで説明する内容は、すべて今日からSandboxで試せます。Sandboxキーはセルフサービスで無料で、実際の残高には一切影響しません。
アカウントを作成
FX-Portのアカウントに登録します。Sandboxキーは無料で、Sandboxでの予約に実際の料金はかかりません。
Sandboxキーを作成
ダッシュボードのAPIページで、
fxp_test_で始まるキーを作成します。読み取りキーは検索と参照ができ、読み取り + 書き込みキーはテスト予約の作成もできます。最初のリクエストを送信
ベースURLは1つで、キーはBearerトークンとして
Authorizationヘッダーに指定します。最初の呼び出しはクイックスタートで手順を確認できます。準備ができたらLiveへ
fxp_live_キーに切り替えます。Liveは代理店の承認後に利用でき、それまでAPIは403 agency_not_activeを返します。実際の予約は、入金済みの残高から支払われます。
cURLによる最初のカタログリクエストです。ドキュメントには、対応するすべての言語で同じリクエストを掲載しています。
リクエスト
curl 'https://api.fx-port.com/api/v1/esims/packages?country=france&type=local' \
-H "Authorization: Bearer fxp_test_YOUR_KEY"Sandboxでできること
Sandboxでの注文では、サプライヤー側に実際のテスト用eSIMが作成されます。アクティベーションコードはダミーのため、スマートフォンにはインストールできません。引き落としは行われず、レスポンスにもそれが示されます。balanceDebited、transactionCreated、payoutCreatedはすべてfalseです。チャージのレスポンスでは残高がゼロになります。利用量は固定で、新しいeSIMには全容量とステータスACTIVEが表示されます。Sandboxの予約は、Sandboxキーからのみ参照できます。
Liveでしか試せないこと
残高の確認、重複の確認、残高のロックは、Liveでのみ実行されます。そのため、402とinsufficient_balance、60秒以内に同じパッケージを再度注文したときの409、503とbalance_lock_timeoutのレスポンスは、Sandboxには現れません。これらの処理は、エラーコードの一覧を見て実装してください。
Liveへの切り替え
Liveキーは旅行会社の承認と結び付いています。旅行会社が承認されるまで、Liveキーはagency_not_activeを返し、Sandboxキーはそのまま使えます。Liveの注文は、入金済みの旅行会社の残高から支払われます。SandboxとLiveはベースURLが共通なので、Liveへの切り替えで変わるのはキーだけで、コードは変わりません。
eSIM APIを使って開発する方
同じ呼び出しでも、利用者によって重視する部分が異なります。
旅行を販売する旅行会社
旅行会社は、航空券やホテルと並べてeSIMを販売します。旅行者本人のメールアドレスで注文するため、サプライヤーがQRコードと共有リンクを送信します。旅行者から問い合わせがあれば、利用量を確認します。手数料率はパッケージごとに返され、agent_idには、旅行会社のどのユーザーが注文したかが記録されます。
OTAとマーケットプレイス
マーケットプレイスでは、まず閲覧ページを作ります。国ごとの表示、ローカルまたは地域向けのパッケージ、各パッケージのネットワークとデータ容量、購入前のデバイス確認です。旅行者のeSIMを一覧表示する画面では、1回の呼び出しで最大50個のeSIMの利用量を読み取れます。
トラベルテック企業と法人の出張担当部門
トラベルテック企業や法人の出張担当部門は、独自の予約ツールを構築します。開始に必要なものは、OpenAPIファイル、Postmanコレクション、AIコーディングアシスタントが読めるプレーンテキストのドキュメントとして、すべて公開されています。最初のプロトタイプから、実際の仕様に沿って作れます。
eSIM APIのよくある質問
FX-Port eSIM APIとは何ですか。誰のためのものですか。
旅行会社、OTA、リセラーが、1つの連携で旅行用のデータeSIMを販売できるREST APIです。渡航先のパッケージを旅行会社の通貨建ての価格で取得し、旅行者向けに注文します。旅行者にQRコードを渡し、利用量を確認して、チャージもできます。すべてHTTPS上のJSONで、OpenAPIファイルがすべてのエンドポイントを記述しています。
無料のSandboxはありますか。キーはどう取得しますか。
はい。FX-Portのアカウントを作成し、ダッシュボードのAPIページを開いてSandboxキーを作成します。ご自身で、無料で行えます。Sandboxでの注文では、ダミーのアクティベーションコードを持つテスト用eSIMが作成されるため、スマートフォンにはインストールできません。残高から引き落とされることもありません。SandboxとLiveはベースURLが共通なので、テストしたコードがそのまま本番のコードになります。
Liveに切り替えるには何が必要ですか。
Liveキーが使えるようになるには、旅行会社の承認が必要です。それまでLiveキーは拒否され、Sandboxキーはそのまま使えます。Liveの注文は、入金済みの旅行会社の残高から支払われます。Sandboxは残高に一切影響しません。どのキーも、IPアドレスの一覧に制限できます。切り替えで変わるのはキーだけで、すべてのレスポンスに取得元の環境が示されます。
どの国とパッケージを販売できますか。
パッケージは190か国以上で利用でき、地域向けのバンドルはその地域の下に表示されます。パッケージは、データ容量、有効期間、ネットワーク、チャージの可否が異なります。これらの項目とパッケージIDは、固定値にせず、カタログのレスポンスから読み取ってください。カタログ全体は非常に大きなレスポンスになるため、一度に1つの国を指定してください。別のデバイス一覧を使えば、販売前に旅行者のスマートフォンを確認できます。
旅行者はどのようにeSIMを受け取りますか。
注文のレスポンスには、QRコード、そのアクティベーション文字列、iPhone用のインストールリンク、共有ページが含まれ、自社の画面に表示できます。FX-Portは、eSIMが作成された時点で、サプライヤーにも旅行者のアドレスへQRコードと共有リンクをメールで送るよう依頼します。サプライヤーがまだeSIMを返していない場合でも注文は存在し、データは後からセットアップデータの取得で入手できます。
価格、手数料、残高はどう関係しますか。
すべてのパッケージには、旅行会社の通貨建ての次の金額項目があります。手数料を加える前の基本価格、旅行者に請求する合計価格、残高から引き落とされる金額、手数料率です。手数料は、合計価格から引き落とし額を引いた金額です。引き落とし額は旅行会社ごとに異なるため、これらの項目は再計算せず、読み取ってください。Sandboxでは引き落としはなく、Liveでは引き落とし額が旅行会社の残高から差し引かれます。
eSIMにチャージできますか。残りのデータはどう確認しますか。
はい。2回の呼び出しで行います。そのeSIMに追加できるパッケージを一覧で取得し、その中の1つでチャージを作成します。サプライヤーがある国の事業者を変更することがあるため、チャージが常に可能とは限りません。その場合、一覧が空になり、旅行者には新しいeSIMが必要です。利用量は最大15分間キャッシュされるため、最近の値として扱ってください。1回の呼び出しで最大50個のeSIMを読み取れます。
失敗はどのように通知されますか。Webhookはありますか。
失敗は、変わることのないエラーコードを持つ共通の形式で返ります。プログラムが判定に使うのはメッセージの文面ではなく、このコードです。読み取りは、バックオフを使えば繰り返しても安全です。注文やチャージの作成は異なります。冪等性キーはないため、タイムアウトした後は、再試行する前に予約を検索してください。Liveでは、同じパッケージを60秒以内に2回注文するといった明らかな重複を、FX-Portが拒否します。Webhookはありません。
APIでeSIMの注文をキャンセルまたは返金できますか。
いいえ。このAPIには、eSIMの注文をキャンセルまたは返金するエンドポイントがありません。1回の注文で作成されるeSIMはちょうど1つなので、送信する前にパッケージと旅行者の情報を確認してください。サプライヤーが注文を拒否した場合、引き落としは行われず、失敗した予約が保存されます。特定の注文に問題がある場合は、予約IDを添えて開発チームにご連絡ください。
開始に必要なものと、役立つツールは何ですか。
必要なのは、Sandboxキーと、HTTPクライアントです。ドキュメントには、OpenAPI 3.1ファイル、Postmanコレクション、9言語のコードサンプル、AIアシスタント向けのプレーンテキスト形式の出力が用意されています。キーはサーバーに置き、ブラウザやアプリには置かないでください。時間がかかるのは、自社のチェックアウト、旅行者へのQRコードの提供、エラー処理の部分です。
FX-Portのその他のAPI
eSIMは、多くの場合、旅行とセットで使われます。航空券とホテルのAPIは、eSIMと同じキー、同じエラーボディ、同じ規則を使い、その予約は同じアカウント履歴に残ります。
航空券の検索・価格確認・予約、保留中の注文の支払い、キャンセル、航空券の参照ができます。
ホテルの検索、料金の確認、事前予約と予約、バウチャーの参照、キャンセルができます。
- 送迎APIプレビュー
空港送迎の見積もり、予約、状況確認、キャンセルができます。
コードを書かずに済ませたい場合も、旅行会社はFX-PortのダッシュボードからeSIMを販売できます。 ダッシュボードからeSIMを販売
Sandboxで最初のeSIM注文を試す
アカウントを作成し、Sandboxキーを発行して、パッケージの取得、注文の作成、利用量の確認を今日から試せます。Liveキーは、旅行会社の承認後にご利用いただけます。