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
Quote
POST /payments/quoteresolves provider, FX and fees and creates nothing. Optional, and worth doing whenever a human will see a number before approving. - 3
Create the payment
POST /paymentsreturns202 Acceptedwith auetr. The creditor rides inline in this same call. Acceptance is not execution. - 4
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 — create the payment
The creditor rides inline — name, account and agent, straight from what your core banking or customer information system already holds. Silora has no directory to check first.
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' },
creditor: { type: 'ORGA', name: 'Meridian Textiles Pvt Ltd' },
creditorAccount: { scheme: 'IN_ACCOUNT', id: '50100234567890', currency: 'INR' },
creditorAgent: { clearingSystem: 'INIFSC', clearingSystemMemberId: 'HDFC0000123', bic: 'HDFCINBBXXX' },
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 3 — 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.

