Schemas
GET /schema/{countryCode} returns a country-specific JSON Schema (draft-07) describing everything a payout to that country must contain. Query it before building a recipient so your form renders exactly the fields β and the validation rules β that corridor requires.
Because required fields, postal-code formats, document types, and payout methods vary by country, a form hardcoded for one corridor will fail in another. Drive the form off the schema instead:
- Build dynamic forms that adapt to each destination country
- Validate input client-side using the schema's
pattern,enum,minLength, andrequired - Display the right fields for each payout method (bank deposit, PIX, wallet)
The response is a draft-07 JSON Schema document: an object with type, required, and properties, where nested objects (address, paymentMethod) and arrays (documents) carry their own required/properties.
Country codes are ISO 3166-1 alpha-3 throughout β in the path (
BRA,MEX,PHL) and in theaddress.countryCodefield, which the schema enforces with"pattern": "^[A-Z]{3}$"on bothrecipient.addressandsender.address.
Country Schema
Returns the complete push contract for a destination country: the recipient (identity, address, documents, payout method), the currency recipientAmount must carry, the additionalData that corridor requires, and β on corridors that constrain it β a sender block. This is the schema the gateway itself validates POST /v2/payment against, so it is the authoritative answer to "what does this country need?"
Not every country schema carries every top-level block.
senderin particular is present on some corridors and absent on others; where absent, only the generic push schema's sender rules apply. Read the blocks that are there rather than assuming a fixed shape β the set is being extended.
Unlike the three endpoints below, the country code is a path parameter, not a query parameter.
Endpoint
GET https://{FQDN}/schema/{countryCode}
Headers:
| Header | Value |
|---|---|
Authorization | Bearer {accessToken} |
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
countryCode | string | Yes | ISO 3166-1 alpha-3 country code (e.g., "IND", "BRA", "DEU") |
Example Request
curl -X GET 'https://{FQDN}/schema/DEU' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIs...'
Response (200)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Inyo Global PUSH Country Schema - Germany",
"version": "1.0.1",
"description": "Schema for processing a transaction to a DEU recipient",
"type": "object",
"properties": {
"recipient": {
"type": "object",
"required": ["firstName", "lastName"],
"properties": {
"firstName": { "type": "string", "minLength": 1 },
"lastName": { "type": "string", "minLength": 1 },
"address": { "type": "object", "properties": { "β¦": {} } },
"paymentMethod": {
"type": "object",
"required": ["countryCode"],
"properties": {
"type": { "type": "string", "enum": ["BANK_DEPOSIT"] },
"countryCode": { "type": "string", "enum": ["DEU"] },
"accountNumber": {
"type": "string",
"description": "The International Bank Account Number (IBAN).",
"pattern": "^DE\\d{20}$"
}
}
}
}
},
"recipientAmount": {
"type": "object",
"properties": {
"total": { "type": "number", "minimum": 0 },
"currency": { "type": "string", "enum": ["EUR"] }
}
},
"additionalData": {
"type": "object",
"properties": {
"statementNarrative": { "type": "string" }
}
}
}
}
Reading the conditionals
Richer corridors express their rules as JSON Schema conditionals rather than a flat required list. Two shapes appear:
allOfwithif/thenonpaymentMethod.typeβ the corridor offers more than one payout method and each demands different fields. Brazil requiresaccountNumber,accountType,bankCode,routingNumberwhentypeisBANK_DEPOSIT, butkeyandkeyTypewhen it isPIX.if/then/elseonaccountNumberTypeβ the corridor offers an alias rail alongside conventional accounts. India requires onlyaccountNumber(a UPI VPA) whenaccountNumberTypeisUPI, andaccountNumber+bankCode+accountTypeotherwise.
A validator that only reads the top-level required will accept payloads the gateway rejects with VE_001. Evaluate the whole document.
recipientAmount.currencyis an enum, not a suggestion. Each country pins its destination currency βBRAaccepts onlyBRL. Guinea (GIN) is the sole corridor accepting two (GNF,XOF).
Errors
| Status | Condition |
|---|---|
400 | Unknown or unsupported country code β PAY_271: Error retrieving JSON schema for country code: {countryCode} |
Per-Country Differences
The schemas are the source of truth, but a few corridors have quirks worth calling out. Always render from the live schema rather than hardcoding these β they can change.
| Country | Difference |
|---|---|
Brazil (BRA) | Offers BANK_DEPOSIT and PIX from one schema, each with its own required set. Recipient requires a CPF via documents[].document (11 digits, or formatted 123.456.789-09). For bank deposit: bankCode (3 digits) and routingNumber = branch/agΓͺncia. |
Mexico (MEX) | The CLABE (18 digits in accountNumber) already encodes the bank, so a BBAN payout needs nothing else. Selecting accountNumberType: "DIMO" switches accountNumber to a 10-digit phone number and makes bankCode required. |
India (IND) | accountNumberType: "UPI" puts a Virtual Payment Address (user@psp) in accountNumber and drops bankCode/accountType. BBAN requires all three, with bankCode an IFSC (^[A-Z]{4}0[A-Z0-9]{6}$). |
South Korea (KOR) | The only corridor that constrains the sender's identity: sender.birthDate (YYYY-MM-DD) and sender.birthCountryCode (alpha-3) are both required. |
| SEPA (23 countries) | Only the IBAN in accountNumber, validated against that country's own IBAN shape (^DE\d{20}$, ^FR\d{12}[A-Z0-9]{11}\d{2}$, β¦). No accountNumberType, no bank code. |
How to Consume a Schema
Reading the draft-07 keywords when rendering a field:
| Keyword | Use |
|---|---|
type | Data type: "string", "object", "array", "number", "boolean" |
required | Array of mandatory property names (at that object's level) |
properties | Field definitions for an object |
items | Element schema for an array (e.g. documents) |
enum | Allowed values β render a single-value enum as read-only, a multi-value enum as a select |
pattern | Regex the value must match (postal codes, CPF, account numbers) |
minLength | Minimum string length |
description | Human-readable hint β good default for a placeholder or label |
Note the two conditional keywords above: a validator that reads only the top-level required will accept payloads the gateway rejects with VE_001.
Recommended flow:
- Read the destination country from your form and convert it to ISO-3.
GET /schema/{countryCode}for that code.- Render the recipient form from
recipient.propertiesβ includingpaymentMethod, whose fields depend ontypeand, on some corridors,accountNumberType. - Apply the
senderblock if the schema carries one, and offer only therecipientAmount.currencyvalues its enum allows. - Validate every value against its
pattern/enum/required, evaluatingallOf/if/then/else. - Submit the collected
sender,recipient, andadditionalDatain the Push Transaction payload.
What's Next
- Push Transaction β Build the
recipientandpaymentMethodfrom this schema - Banks β Look up bank codes to populate
bankCodefields - Check Account β Validate account details before transacting
