Skip to main content

API Reference

The Kora Remittance API is organized around REST. It accepts JSON request bodies, returns JSON responses, and uses standard HTTP status codes. The full machine-readable spec is available as remittance.yaml (OpenAPI 3.1).

Base URL

https://api.korastratum.com/api/v1/remittance      # production
https://sandbox.korastratum.com/api/v1/remittance # sandbox

Authentication

HeaderValueUsed by
AuthorizationBearer kora_… (API key) or Bearer <session-jwt>Server calls / end-user calls
X-Tenant-IDTenant UUIDAll calls
X-Partner-API-KeyPartner keyPOST /auth/partner-token only

See Authentication for the full model.


Quotes

Create a quote — POST /quotes

Locks the FX rate and fees for a corridor for a short window.

// request
{ "sendAmount": "100.00", "sendCurrency": "USD", "receiveCurrency": "PHP", "destinationCountry": "PH" }

// 201
{ "quoteId": "3c8a1f7e-…", "exchangeRate": "56.0000", "receiveAmount": "5600.00",
"receiveCurrency": "PHP", "feeTotal": "1.50", "expiresAt": "2026-08-10T14:15:00Z" }

Transfers

Create a transfer — POST /transfers

Creates a transfer against a quote. The sender comes from the session token. Gated by KYC and screening — an unverified sender returns 422.

// request
{ "quoteId": "3c8a1f7e-…", "recipientId": "9f2c6d10-…",
"transferReason": "family_support", "sourceOfFunds": "salary", "relationshipToRecipient": "family" }

// 201
{ "id": "3c8a1f7e-…", "reference": "TXN-8ZK3QP", "status": "created",
"sendAmount": "100.00", "sendCurrency": "USD", "receiveAmount": "5600.00", "receiveCurrency": "PHP" }

List transfers (history) — GET /transfers

Returns the authenticated user's transfers, most recent first. The user id comes from the token — a caller only ever sees their own transfers. Paginated with page (default 1) and pageSize (default 20, max 100).

// 200
{ "transfers": [ { "id": "…", "reference": "TXN-8ZK3QP", "status": "completed",
"sendAmount": "100.00", "receiveAmount": "5600.00", "recipientName": "Maria S.",
"createdAt": "2026-08-10T14:10:02Z" } ],
"totalCount": 42, "page": 1, "pageSize": 20 }

Get a transfer — GET /transfers/{id}

Retrieve one transfer by UUID, including its status-history events for rendering a timeline.

Statuses: created · funded · processing · completed · failed · refunded.


Corridors

List supported corridors — GET /corridors

Returns the corridors available to the tenant, with supported currencies and destination countries.

// 200
{ "corridors": [ { "sendCurrency": "USD", "receiveCurrency": "PHP", "destinationCountry": "PH", "enabled": true } ] }

Handoff

Partner-initiated SSO. Full guide: Partner Handoff.

Mint a handoff token — POST /auth/partner-token

Server-to-server with X-Partner-API-Key. Returns a one-time, short-lived token and a redirect URL.

// request
{ "partnerUserId": "usr_abc123", "phone": "+15551234567", "email": "user@example.com",
"returnUrl": "https://app.yourbrand.com/wallet" }

// 200
{ "token": "<one-time-jwt>", "redirectUrl": "https://app.yourbrand.com/handoff?t=<jwt>", "expiresIn": 120 }

Exchange a handoff token — POST /auth/exchange-token

Exchanges a one-time handoff token for an end-user session. No other credential required.

// request
{ "token": "<one-time-jwt>" }

// 200
{ "token": "<session-jwt>", "refreshToken": "…", "expiresIn": 3600 }

Webhooks

Transfer lifecycle events are delivered to your endpoint as signed HTTP POSTs. See Webhooks for the payload, headers, and HMAC-SHA256 verification.

Errors

Errors return a JSON body { "error": "…", "code": "…" } with a standard HTTP status: 400 invalid request, 401 bad credentials, 404 not found, 422 compliance/KYC not satisfied.