Get started
Quickstart
Silora connects you once to multiple global payment networks. This walkthrough goes from a sandbox key to a settled payment, in the order a real integration is built. Every call here works against https://api.sandbox.silorapay.ai/v1.
Before you start
- A sandbox API key pair from the Client Portal, API keys screen. The key id goes in
X-Silora-Key; the secret never leaves your server and is used only to sign. - One HTTPS endpoint that can receive webhooks. Settlement arrives there, not on the
POSTresponse. - The corridor you intend to serve — a
{fromCountry}-{toCountry}pair such asUS-IN.
The shape of an integration
- 1
Ask the corridor what it wants
GET /corridors/{pair}/requirementsreturns the conditional field schema for that corridor. Build your payload from the answer instead of from guesswork. See Corridor requirements. - 2
Store the payee once
POST /beneficiariesremoves the largest and most error-prone part of the payment body from every subsequent call. - 3
Confirm the account before you pay it
POST /beneficiaries/{id}/validateis Confirmation of Payee. It is the single largest lever on yourAC03rejection rate. - 4
Quote
POST /payments/quoteresolves provider, FX and fees and creates nothing. Optional, and worth doing whenever a human will see a number before approving. - 5
Create the payment
POST /paymentsreturns202 Acceptedwith auetr. Acceptance is not execution. - 6
Receive the outcome
A
payment.settledorpayment.failedwebhook delivers the terminal state. See Webhooks.
Call 1 — what does this corridor demand?
curl -G 'https://api.sandbox.silorapay.ai/v1/corridors/US-IN/requirements' \
--data-urlencode 'currency=USD' \
--data-urlencode 'amount=24500' \
--data-urlencode 'creditorType=ORGA' \
-H "X-Silora-Key: $SILORA_KEY_ID" \
-H "X-Silora-Timestamp: $TS" \
-H "X-Silora-Signature: $SIG"Call 2 — store the payee
POST /v1/beneficiaries
Idempotency-Key: 8f1b2c9e-4a10-4e5b-9d33-77a2e1c0b415
{
"reference": "MERIDIAN-TEXTILES",
"type": "ORGA",
"name": "Meridian Textiles Pvt Ltd",
"address": {
"streetName": "Trade Centre", "buildingNumber": "402",
"postCode": "400051", "townName": "Mumbai",
"countrySubDivision": "Maharashtra", "country": "IN"
},
"identification": { "taxId": "AAACM1234F" },
"account": { "scheme": "IN_ACCOUNT", "id": "50100234567890", "currency": "INR" },
"agent": {
"clearingSystem": "INIFSC", "clearingSystemMemberId": "HDFC0000123",
"bic": "HDFCINBBXXX", "name": "HDFC Bank", "country": "IN"
},
"metadata": { "supplierCode": "SUP-4471", "costCentre": "CC-EMEA-07" }
}Account numbers are masked on every read. corridors is derived from the account and agent, so you know immediately which pairs this payee can be used on.
Call 3 — Confirmation of Payee
curl -X POST 'https://api.sandbox.silorapay.ai/v1/beneficiaries/ben_01J8M4TQ7X2K9/validate' \
-H "X-Silora-Key: $SILORA_KEY_ID" \
-H "X-Silora-Timestamp: $TS" \
-H "X-Silora-Signature: $SIG" \
-H 'Content-Type: application/json' \
-d '{ "amount": { "currency": "USD", "value": "24500.00" } }'Call 4 — create the payment
With a stored beneficiary the body collapses to identity, amount and the corridor-specific fields. Everything the beneficiary already holds is resolved server-side.
import { randomUUID } from 'node:crypto';
import { sign } from './silora-signer';
const PATH = '/payments';
const payload = JSON.stringify({
endToEndId: 'INV-2026-4471',
provider: 'AUTO',
instructedAmount: { currency: 'USD', value: '24500.00' },
debtorAccount: { scheme: 'US_ACCOUNT', id: '8901234567' },
beneficiaryId: 'ben_01J8M4TQ7X2K9',
purpose: 'P0103',
remittanceInformation: { unstructured: ['Invoice INV-2026-4471'] },
requestedExecutionDate: '2026-08-22',
metadata: { costCentre: 'CC-EMEA-07', poNumber: 'PO-88213' },
});
const { timestamp, signature } = sign({
secret: process.env.SILORA_KEY_SECRET!,
method: 'POST',
path: PATH,
body: payload,
});
const response = await fetch('https://api.sandbox.silorapay.ai/v1' + PATH, {
method: 'POST',
headers: {
'X-Silora-Key': process.env.SILORA_KEY_ID!,
'X-Silora-Timestamp': timestamp,
'X-Silora-Signature': signature,
'Idempotency-Key': randomUUID(),
'Content-Type': 'application/vnd.silora.simple+json',
},
body: payload,
});
const accepted = await response.json();
console.log(response.status, accepted.uetr); // 202 7a9c1e02-...Call 5 — receive the outcome
Register an endpoint once, then let Silora push. Subscribe to the three terminal events at minimum: payment.settled, payment.failed, payment.returned.
POST /v1/webhooks/endpoints
{
"url": "https://treasury.example.com/hooks/silora",
"events": ["payment.settled", "payment.failed", "payment.returned"],
"description": "Treasury settlement feed"
}The endpoint registration response returns a secret once. Store it; it is the HMAC key for verifying every delivery.
What to build next
- Authentication — signing, clock skew and key rotation.
- Corridor requirements — how to stop guessing what a corridor needs.
- Webhooks — verification, idempotency and the recovery path when your endpoint is down.
- Errors — the ISO reason codes, and how a validation failure points at the rule it broke.