Skip to content
SiloraSilora

The data model

ISO 20022

The Silora model is ISO 20022 throughout. Two content types carry it: a flattened Simple profile that most integrations use, and the full pain.001 JSON binding for institutions that already speak ISO. There is no XML endpoint.

Why ISO 20022

  • It is what the networks on the other side of Silora already speak. A proprietary model would have to be translated at every hop, and every translation is a place to lose a field.
  • Structured party and address data is becoming mandatory under CBPR+. A model that only has addressLine cannot express what regulators now require.
  • Reason codes are an external, versioned ISO code set. Silora validates against the quarterly set rather than a hardcoded enum, so a new code does not require a Silora release.
  • Remittance information survives end to end, which is what makes beneficiary-side reconciliation work.

The two content types

Content typeWhat it isUse it when
application/vnd.silora.simple+jsonA flattened projection of the ISO model with a published 1:1 field map. Every example in these docs uses it.Almost always. It is shorter, obvious to read, and loses nothing.
application/jsonThe full ISO 20022 pain.001 CustomerCreditTransferInitiation, JSON binding.You already generate pain.001 and would rather not flatten it.

The field map

SimpleISO 20022Notes
endToEndIdPmtId/EndToEndIdYour reference. Echoed everywhere, never a path key.
uetrPmtId/UETRMinted by Silora on acceptance. The identity of the payment.
instructedAmountAmt/InstdAmtAmount and currency. Value is a string.
debtorDbtrParty: name, address, identification.
debtorAccountDbtrAcct
creditorCdtr
creditorAccountCdtrAcct
creditorAgentCdtrAgtBIC, or clearing system member id such as an IFSC code.
ultimateDebtorUltmtDbtrThe party on whose behalf the payment is made.
purposePurp/Cd or Purp/PrtryLocal regulatory codes come from a corridor code list.
categoryPurposeCtgyPurp/Cd
charges.bearerChrgBrDEBT · CRED · SHAR · SLEV
remittanceInformationRmtInfBoth unstructured and structured are arrays.
regulatoryReportingRgltryRptgFEMA, RBI purpose reporting, and equivalents.
instructionsForCreditorAgentInstrForCdtrAgt

Side by side

{
  "endToEndId": "INV-2026-4471",
  "instructedAmount": { "currency": "USD", "value": "24500.00" },
  "creditor": {
    "type": "ORGA",
    "name": "Meridian Textiles Pvt Ltd",
    "address": {
      "streetName": "Trade Centre", "buildingNumber": "402",
      "postCode": "400051", "townName": "Mumbai", "country": "IN"
    }
  },
  "creditorAccount": { "scheme": "IN_ACCOUNT", "id": "50100234567890", "currency": "INR" },
  "creditorAgent": { "clearingSystem": "INIFSC", "clearingSystemMemberId": "HDFC0000123" },
  "purpose": "P0103"
}

Conventions that follow from the model

  • Amounts are strings, never JSON numbers. "value": "24500.00". IEEE-754 doubles silently corrupt money.
  • Dates are YYYY-MM-DD; timestamps are RFC 3339 in UTC.
  • Repeating elements are always arrays, even at length one. remittanceInformation.unstructured is an array of one string far more often than not.
  • Codes are ISO external code values in caps, validated against the quarterly code set.
  • Send structured addresses, not address lines. CBPR+ is moving to structured-mandatory and several corridors already reject addressLine with RR03.

Status, mapped both ways

Every payment carries a Silora status and an isoStatus. The Silora status is what you show a human; the ISO status is what reconciles against the network.

Silora `status``isoStatus`Terminal
INITIATEDRCVDno
SCREENEDACTCno
ROUTEDACTCno
SUBMITTEDACSPno
SETTLEDACSCyes
FAILEDRJCTyes
CANCELLEDCANCyes
RETURNEDRJCT with a pacs.004 returnyes

Messages behind the scenes

MessageWhere it appears
pain.001Your instruction. POST /payments, full ISO body.
pacs.008The interbank transfer Silora instructs on your behalf.
pacs.002Status report from the network. Becomes isoStatus on the payment.
pacs.004Payment return. Becomes a payment.returned webhook.
camt.056Cancellation request, when you cancel after submission.
camt.053 / camt.054Statement and advice data behind GET /ledger/accounts.

You never send or parse these. They are named here so that when a provider or a correspondent mentions one, you know where it sits in the flow.