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.
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.
- Payables in:
POST /api/v1/payment-runs - Each payment assessed: the route assessment (below) is this step
- Instruction prepared for your bank, provider or wallet
- A named person approves:
POST /api/v1/payment-runs/{id}/approve, one release record per payment - 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. - Record what landed:
POST /api/v1/payment-runs/{id}/reconcile - The audit export:
GET /api/v1/payment-runs/{id}/export
- The sample run (synthetic, labelled; no key)
- Its audit export, CSV
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 runAssess 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.
- EUR to ZMW, EUR 50,000 (the honest answer on a thin corridor)
- ZAR to USD, R250,000 (our deepest corridor)
- EUR to KES, no amount (assessed at about USD 10,000, labelled)
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 recordWhere 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}}'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
Free to measure, paid to decide.
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.
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.
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.
Copy, paste, measure.
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 -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 -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 "https://swapeazi.io/api/attestations/verify?token=<attestation>"
# offline: Ed25519 public keys as a JWK set
curl https://swapeazi.io/api/attestations/keys# 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# 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 }# 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.# 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.# 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_..."{
"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.
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>