انتقل إلى المحتوى الرئيسي

New: the Landed Cost API quotes duties and taxes at checkout in 40 markets. About the Landed Cost API

International OrdersInternational Orders

Changelog

What shipped, when, and what it means for your integration.

  1. APICheckoutRisk

    Network tokens for saved cards

    When a shopper saves a card, we now request a network token from the card scheme where one is available. Network tokens are updated automatically when a card is reissued or expires, so repeat payments keep working without asking the shopper for new details.

    There's nothing to change in your integration. Saved payment methods gain a network_token field that shows whether a token is active:

    {
      "id": "pm_8Cs4hD1nX6zB",
      "type": "card",
      "card": { "brand": "mastercard", "last4": "4444", "network_token": "active" }
    }
    

    Network tokens apply to new saved cards from today. Existing saved cards are being migrated over the next few weeks. See Network tokens.

  2. RiskAPI

    Smart retries for soft declines

    Some declines are temporary: an issuer timeout, a network hiccup, a fraud rule that a domestic acquirer would pass. When a card payment gets a soft decline, we can now retry it once through another acquirer in the shopper's region before reporting a failure.

    Retries happen within the same checkout session, so the shopper sees one result. Hard declines, such as stolen cards or closed accounts, are never retried.

    Smart retries are off by default. Turn them on in the dashboard under Settings → Payments. Retried payments show retried: true and the acquirer used on the payment object, so you can measure the effect on your acceptance rate.

  3. APICheckout

    Guaranteed landed-cost quotes in more countries

    When a landed-cost quote is guaranteed, we cover any difference if customs charges more than quoted. Guarantees now apply to 18 more destinations, including Norway, Switzerland, South Korea and Mexico.

    Quotes also return a new warnings array when they can't be guaranteed, explaining what's missing, such as a short HS code or an unknown origin country:

    {
      "guaranteed": false,
      "warnings": [{ "code": "hs_code_incomplete", "item": "BOOT-42" }]
    }
    

    Fix the warnings and request a new quote to get a guarantee. See Landed cost.

  4. APIRisk

    Submit dispute evidence through the API

    Disputes can now be answered entirely through the API. Attach shipping confirmation, tracking numbers, customer messages and receipts to a dispute, then submit it when you're ready. Until you submit, evidence is saved as a draft you can keep editing.

    curl https://api.international-orders.com/v1/disputes/dp_6Vn2cJ5kR8wF \
      -u sk_test_51Hx...: \
      -d "evidence[tracking_number]=1Z999AA10123456784" \
      -d "evidence[shipping_carrier]=UPS" \
      -d submit=true
    

    New dispute.won and dispute.lost events tell you the outcome. The dispute object also gains an evidence_due_by timestamp, so you can remind your team before the deadline passes.

  5. SDKs

    Python SDK 3.0 with async support

    Version 3.0 of the Python SDK adds AsyncClient for frameworks such as FastAPI, alongside the existing synchronous client. Every response is now a typed object, so your editor can complete field names and catch typos.

    import os
    from international_orders import AsyncClient
    
    io = AsyncClient(os.environ["IO_SECRET_KEY"])
    order = await io.orders.create(amount=12900, currency="EUR", shipping={"country": "DE"})
    

    The client retries 429 and 5xx responses twice by default and sends an idempotency key on each retry. Python 3.9 or later is required. The 2.x line will receive security fixes until April 2027.

    pip install --upgrade international-orders
    
  6. DashboardPayouts

    Payout tracking in the dashboard

    Open any payout in the dashboard to see a timeline of its journey: created, sent to the local network, accepted by the receiving bank. Each step shows a timestamp, and failed payouts show the reason in plain language with the fix we suggest.

    The payout page also shows the exact FX rate, the source amount debited from your balance and any network fees. You can export the same detail as CSV from the payouts list, filtered by currency, country or status.

    Nothing changes in the API. The payout.paid and payout.failed events already carry this data. See Payouts.

  7. Checkout

    Address autocomplete in Checkout Components

    The address element in Checkout Components now suggests complete addresses after the first few characters. Suggestions follow each country's format, so a Japanese address puts the postal code first and a UK address asks for a postcode rather than a ZIP code.

    Autocomplete is on by default. Turn it off per element if you already use your own address service:

    const address = checkout.create("address", { autocomplete: false });
    

    Accurate addresses also improve landed-cost quotes, since postal codes decide regional taxes in some countries. Shoppers can always skip suggestions and type an address by hand.

  8. API

    Partial capture for manual-capture orders

    When an order uses capture_method: "manual", you can now pass an amount to the capture endpoint to collect only part of what was authorised. The remainder is released to the shopper straight away, so they don't see a hold for goods you can't ship.

    curl -X POST https://api.international-orders.com/v1/orders/ord_7Hc2kQ9xL4mP/capture \
      -u sk_test_51Hx...: \
      -d amount=5200
    

    The payment object gains an amount_captured field, and the payment.captured event now includes it. Existing integrations that capture the full amount don't need any changes. See Payments and capture.