Developers

What a payment costs, before it moves.

Measure any payment against an independent mid-market reference, free and with no key. With a paid key, assess each payment against your own limits before it moves, then send back what landed, or the bank's MT103 or pacs.008, and get a signed reconciliation. Anyone can verify either record. JSON in, JSON out, and an MCP server for AI agents. SwapEazi never moves or holds money.

Know-your-agent (KYA). Before an AI agent spends, SwapEazi assesses it is allowed: its mandate, its spend profile and budget, and a named person approves every AI agent payment (prepare_payment, payment_controls, POST /api/v1/mandates). Each approval is a signed record anyone can verify.

Payment Run API · sample free · real runs with a key (get a free key)

Run the month's cross-border payments, with the proof.

Send the payables (a JSON list, a payout CSV or pain.001, or bills from Xero). For each payment: the payee assessed (changed bank details, duplicates, missing fields), the route assessed with its Rate Receipts, and an instruction prepared for your own bank, provider or wallet. Each payment is prepared, needs attention (with the reason) or has no evidence. A named person approves; each approved payment gets a release record and the instruction you release yourself in your own bank; the audit export shows the assessment, approval and release record of every payment, and "no evidence" wherever one is missing. SwapEazi never sends or moves money.

  1. Payables in: POST /api/v1/payment-runs
  2. Each payment assessed: the route assessment (below) is this step
  3. Instruction prepared for your bank, provider or wallet
  4. A named person approves: POST /api/v1/payment-runs/{id}/approve, one release record per payment
  5. You release it in your own bank: each approved payment carries release_in_own_bank (beneficiary, amount, currency, reference, which of your accounts to pay from, cut-off) to copy into your bank or rail portal. SwapEazi never sends the payment.
  6. Record what landed: POST /api/v1/payment-runs/{id}/reconcile
  7. The audit export: GET /api/v1/payment-runs/{id}/export
curl -X POST https://swapeazi.io/api/v1/payment-runs -H 'content-type: application/json' -d '{"sample":true}'
curl -X POST https://swapeazi.io/api/v1/payment-runs/pr_sample/approve -H 'content-type: application/json' \
  -d '{"approver":{"name":"Thandi Nkosi","role":"financial_manager"},"payments":"all_prepared"}'
curl -X POST https://swapeazi.io/api/v1/payment-runs -H "Authorization: Bearer $ROUTER_KEY" \
  -H 'content-type: application/json' -d '{"source_currency":"ZAR","pay_from":"Standard Bank ZAR current ...4410","payables":[ ... ]}'   # a real run
Step 2 of the Payment Run · route assessment API · free · no key

Assess a payment route before your customer pays.

One call returns the routes known for a corridor, each cost and FX figure with its source, read time, freshness and evidence type (observed, executable, indicative, published; the official rate as reference), settlement facts, the requirements on record, what changed since the last assessment, data-quality flags and unknowns, under an assessment_id you can retrieve later. Deterministic JSON; never ranked as advice; SwapEazi never moves money. The same over MCP as assess_route.

curl "https://swapeazi.io/api/v1/route-assessments?corridor=EUR-ZMW&amount=50000"
curl -X POST https://swapeazi.io/api/v1/route-assessments -H 'content-type: application/json' \
  -d '{"from":"ZAR","to":"USD","amount":250000}'
curl https://swapeazi.io/api/v1/route-assessments/ra_<id>   # the kept record
Liquidity map API · free · names with a key

Where the depth is, at your ticket size.

Give a pair and a ticket size. For exchange books, stablecoin pools, P2P adverts, ramps, OTC desks and banks: whether the evidence read shows depth at that size, the measured slippage and landing cost with a Rate Receipt, and the largest size the evidence supports, or "Being measured" with the reason. Add a prefunding need (amount held, days held) to see idle fiat prefunding and stablecoin reserves on the same evidence, as figures. Every payment in a Payment Run and every route assessment carries the same liquidity line. SwapEazi never holds, creates or moves liquidity. The same over MCP as liquidity_map.

curl "https://swapeazi.io/api/v1/liquidity?pair=NGN-USD&amount=100000&amount_currency=USD"
curl -X POST https://swapeazi.io/api/v1/liquidity -H 'content-type: application/json' \
  -d '{"pair":"USD-MWK","amount":20000,"prefunding":{"amount":50000,"days_held":14}}'
Access

Measuring a payment is free and needs no key: try it on the right. The assessment before a payment, the reconciliation after it and the audit need a paid key, sent as Authorization: Bearer sk_live_....

  • Measure a paymentFree, no key
  • Verify a recordFree, no key
  • Assess and reconcilePaid key, per payment
  • Audit a payment historyPaid key, per entity
Get a paid keySee prices
Measure a payment

Measured against today's independent reference rate, before you accept the quote.

The cost is free. No signup. Nothing is stored unless you add a paid payment to the benchmark.

Have a key?
Access

Free to measure, paid to decide.

No key
Measure a payment

POST /api/fx/landed-cost with what was sent, what landed and the date. Returns the Landed Drag Index with its margin of error. Rate-limited per IP.

Paid key
Assess, reconcile, audit

Send Authorization: Bearer sk_live_... to /api/guardrail/check before release, /api/guardrail/reconcile after, and /api/fx/audit for a history. Verifying a record at /api/attestations/verify needs no key.

MCP
For agents

56 tools over MCP: the guide, payout rules, know-your-agent (KYA) controls and approvals, signed records and the measurement tools. The verification and the reconciliation take your key in the server's Authorization header.

Examples

Copy, paste, measure.

curl, measure one payment (no key)
curl -X POST https://swapeazi.io/api/fx/landed-cost \
  -H 'content-type: application/json' \
  -d '{"sourceCurrency":"GBP","destinationCurrency":"EUR",
       "inputAmount":250000,"netLandedFiat":286200,"settledOn":"2026-09-23"}'
curl, guardrail before a payment (paid key)
curl -X POST https://swapeazi.io/api/guardrail/check \
  -H 'content-type: application/json' \
  -H 'Authorization: Bearer sk_live_...' \
  -d '{"client_id":"corp_treasury_8821",
       "origin_currency":"GBP","destination_currency":"EUR","source_amount":250000,
       "origin_jurisdiction":"GB","max_acceptable_ldi_bps":150,"require_regulated_lp":true,
       "quote":{"landed_amount":286200}}'
curl, after it lands: hold the payment to its assessment (paid key)
curl -X POST https://swapeazi.io/api/guardrail/reconcile \
  -H 'content-type: application/json' \
  -H 'Authorization: Bearer sk_live_...' \
  -d '{"attestation":"<decision.attestation from the assessment>",
       "message":"<the bank MT103 text or pacs.008 XML>"}'

# or, without a message
  -d '{"attestation":"...","settlement":{"landed_amount":286000,"settled_on":"2026-09-25"}}'
curl, verify any record (no key)
curl "https://swapeazi.io/api/attestations/verify?token=<attestation>"

# offline: Ed25519 public keys as a JWK set
curl https://swapeazi.io/api/attestations/keys
Inside ChatGPT or Claude: route, hedge and watch payables in chat
# Connector URL (free tools, no sign-in)
https://swapeazi.io/api/mcp

# Claude: Settings > Connectors > Add custom connector, paste the URL.
# ChatGPT: Settings > Apps & Connectors > Advanced, turn on developer mode,
#          then create a connector with the URL and no authentication.

# Then ask, for example:
"Route R370,000 to our Stellenbosch supplier by 30 December and watch it."
"Paste-in: our payables for Q4. Which ones does locking the rate change?"
"Intent ri_... landed: EUR 19,850 left, ZAR 370,000 arrived. Record it."

# Tools: route_intent (sentence or fields, remember: true to watch),
#        intent_status, record_landed
Payment cases: from intent to what landed (API and MCP)
# Open a case: options with evidence, then decision, handoff, outcome
POST /api/v1/cases { "from": "USDC", "to": "ZAR", "amount": 10000 }
POST /api/v1/intents/{pi_…}/decision        { candidate_id, decided_by }
POST /api/v1/intents/{pi_…}/handoff-package  # a package for YOUR provider; sends nothing
POST /api/v1/intents/{pi_…}/events           { type: "customer_reported_sent" }
POST /api/v1/intents/{pi_…}/outcomes         { source_amount, destination_amount, provenance }
GET  /api/v1/intents/{pi_…}                  # status, Evidence Passport, exceptions, timeline
# MCP (read-only): evidence_passport { intent_id }
Stablecoin payments prepared within your rules
# 1. Your organisation sets a spend profile once (organisation key)
POST /api/v1/rails/profiles
{ "name": "Payables agent", "approver_email": "cfo@yourco.com",
  "rules": { "max_per_payment_usd": 5000, "approval_above_usd": 1000,
             "daily_limit_usd": 10000, "monthly_limit_usd": 100000 } }

# 2. The agent reads the guide, names the stablecoin option it takes, prepares
"Pay 5,000 USDT to our supplier in Zambia"        -> discover_payment
prepare_payment { token, chain_id, from, to, amount, profile_id,
                  map_id, candidate_id }
#   within the rules: an approval_id; a person approves every agent payment
#     at /approvals, seeing what the guide showed for that option
#   outside the rules: refused, with the reason
payment_controls { approval_id }
#   once approved: the unsigned transaction for YOUR wallet to sign

# 3. After your wallet sends it
confirm_payment { prepare_id, tx_hash }           -> signed record

# USDT on Tron: chain_id 728126428, T... addresses; the transaction is the
#   TRC-20 transfer call (prepared.tron) for TronLink to build and sign;
#   confirm_payment reads it from TronGrid. Tron to or from an EVM chain:
#   private: true (NEAR Intents).
# Budgets, pending approvals and the audit trail: payment_controls
# SwapEazi never signs, holds keys or moves funds; no fee on the flow.
For AI agents that pay: one assessment before every payment abroad (MCP)
# An agent that holds a payment method (personal or business) calls this before it pays:
swapeazi_guardrail_check { origin_currency, destination_currency, source_amount,
                           max_acceptable_ldi_bps?, max_settlement_hours?, quote? }
  -> what it really costs against an independent reference, every eligible route,
     whether it is inside your limits, and a signed decision record (attestation)

# The budgets, limits and approver your organisation set (org key):
payment_controls {}                               -> spend against budgets, approvals waiting

# After it lands: hold the payment to its assessment
swapeazi_guardrail_reconcile { attestation, settlement }  -> what it cost, verifiable later

# SwapEazi never holds the agent's credentials, the account or the money.
MCP, add to Claude Code, Cursor or Claude Desktop
# Free tools
claude mcp add --transport http swapeazi https://swapeazi.io/api/mcp

# With a paid key, for the guardrail
claude mcp add --transport http swapeazi https://swapeazi.io/api/mcp \
  --header "Authorization: Bearer sk_live_..."
OpenAI function calling, guardrail schema
{
  "name": "swapeazi_guardrail_check",
  "description": "Score every eligible route for a cross-border payment against my limits before it moves.",
  "parameters": {
    "type": "object",
    "properties": {
      "origin_currency": { "type": "string" },
      "destination_currency": { "type": "string" },
      "source_amount": { "type": "number" },
      "max_acceptable_ldi_bps": { "type": "number" },
      "require_regulated_lp": { "type": "boolean" }
    },
    "required": ["origin_currency", "destination_currency", "source_amount"]
  }
}

Every response is evidence against your own policy, never advice. Full schemas are in the OpenAPI spec.

For accountants, payables and ERP software

Put the free assessment inside your product, in one line.

Your clients measure what an international payment cost without leaving your site: the same free assessment and one-page report as on swapeazi.io, with the same allowance and no signup. No integration work, no data shared with you or with us beyond the assessment itself.

<iframe src="https://swapeazi.io/embed/check" width="100%" height="760"
        style="border:0" title="What did this payment cost?"></iframe>