> For the complete documentation index, see [llms.txt](https://docs.nexusglobalpayments.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.nexusglobalpayments.org/nexus-payments-apis/countries.md).

# Countries

Country reference data and payment constraints, including supported instruction priorities, SLA execution timeouts, currency amount ranges (min/max), and purpose-code requirements.

## Retrieve All Countries in Nexus

> Returns all countries available on the Nexus network, along with key reference data for sending payments to those countries, such as maximum transaction amounts and requirements for category purpose codes.\
> \
> \---\
> \
> \#### Response validation rules\
> \
> \*\*200 OK\*\* — the body MUST conform to the response schema below. Response objects are open: additional properties may be introduced in later minor versions, and clients MUST ignore properties they do not recognise.\
> \
> \| Field | Type | Presence | Nullable | Constraints |\
> \|---|---|---|---|---|\
> \| \`countries\` | array | Required | N | — |\
> \| \`countries\[].countryId\` | integer | Required | N | format \`int32\`; ≥ 1; ≤ 999 |\
> \| \`countries\[].countryCode\` | string | Required | N | pattern \`^\[A-Z]{2}$\`; length 2 |\
> \| \`countries\[].name\` | string | Required | N | min length 1; max length 100 |\
> \| \`countries\[].currencies\` | array | Required | N | ≥ 1 item(s) |\
> \| \`countries\[].currencies\[].currencyCode\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`countries\[].currencies\[].currencyName\` | string | Required | N | min length 1; max length 50 |\
> \| \`countries\[].currencies\[].symbol\` | string | Required | N | min length 1; max length 5 |\
> \| \`countries\[].currencies\[].decimalPlaces\` | integer | Required | N | format \`int32\`; ≥ 0; ≤ 4 |\
> \| \`countries\[].currencies\[].minAmount\` | string | Optional | N | pattern \`^\[0-9]+(\\.\[0-9]+)?$\`; max length 18 |\
> \| \`countries\[].currencies\[].maxAmount\` | string | Required | N | pattern \`^\[0-9]+(\\.\[0-9]+)?$\`; max length 18 |\
> \| \`countries\[].requiredMessageElements\` | object | Required | N | — |\
> \| \`countries\[].requiredMessageElements.pacs008\` | array | Required | N | each item: pattern \`^/Document/.+\` |\
> \| \`countries\[].requiredMessageElements.getQuotes\` | array | Conditional — present only for multi-IPS destination countries | N | each item: one of \`destinationPsp\` |\
> \| \`countries\[].supportedInstructionPriorities\` | array | Required | N | unique items; each item: one of \`NORM\`, \`HIGH\` |\
> \| \`countries\[].sla\` | object | Required | N | — |\
> \| \`countries\[].sla.normalPaymentMaxExecutionTimeout\` | integer | Required | N | format \`int32\`; ≥ 0 |\
> \| \`countries\[].sla.highPaymentMaxExecutionTimeout\` | integer | Conditional — present only when the country supports \`HIGH\` priority; omitted otherwise | N | format \`int32\`; ≥ 0 |\
> \
> \*\*Cross-field rules\*\*\
> \
> \- \`currencies\[].minAmount\` / \`currencies\[].maxAmount\`: fractional digits exactly equal \`currencies\[].decimalPlaces\`; JSON numbers, exponent notation and grouping separators are prohibited.\
> \- \`currencies\` lists only active currencies.\
> \- \`sla.highPaymentMaxExecutionTimeout\` is present only when the country supports \`HIGH\` priority (omitted otherwise); it therefore never appears unless \`supportedInstructionPriorities\` contains \`HIGH\`.\
> \- \`requiredMessageElements.getQuotes\` is present only for multi-IPS destination countries and then contains \`destinationPsp\`.\
> \- \`supportedInstructionPriorities\` is the union across the country's IPSes; \`sla\` values are the most relaxed (longest) MET across the country's IPSes, in whole seconds.\
> \
> \*\*Response signature\*\* — every 200 and 304 response carries \`Signature-Input\` and \`Signature\` (plus \`Content-Digest\` on 200) per the Nexus HTTP Message Signature Profile v1, signed by the responding server. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.\
> \
> \*\*Error responses (4xx/5xx with a body)\*\* — the body MUST conform to \`ErrorApiResponse\`: \`statusCode\` = \`RJCT\`; \`reasonCode\` matches \`^\[A-Z]{2}\[0-9]{3}$\`; \`name\` is UPPER\_SNAKE\_CASE (≤ 50); \`description\` ≤ 500 characters and MUST NOT contain PII. \`reasonCode\` values for this operation: \`TE099\`, \`AE001\`, \`AE002\`, \`AE003\`, \`AE005\`, \`AE006\`, \`AE004\`. Gateway errors (405, 429, 502, 503, 504) carry no body.

```json
{"openapi":"3.1.0","info":{"title":"Nexus Payments API","version":"v1"},"tags":[{"name":"Countries","description":"Country reference data and payment constraints, including supported instruction priorities, SLA execution timeouts, currency amount ranges (min/max), and purpose-code requirements."}],"servers":[{"url":"https://{environment}.payments.nexus.net","description":"Nexus participant-facing API endpoint. Resolved via Nexus private DNS over the established IPsec IKEv2 tunnel and not reachable from the public Internet.","variables":{"environment":{"default":"prod","enum":["pat","prod"],"description":"Deployment environment subdomain."}}}],"security":[{"mutualTLS":[],"nexusOAuth":["countries.read"]}],"components":{"securitySchemes":{"mutualTLS":{"type":"mutualTLS","description":"Mutual TLS: the IPSO presents its X.509 client certificate on every connection, validated during the TLS handshake (fail-closed). The same certificate is the RFC 8705 binding anchor for the OAuth access token (see nexusOAuth)."}},"parameters":{"SignatureInputBodyless":{"name":"Signature-Input","in":"header","required":true,"description":"RFC 9421 signature metadata for a request without a body, per the Nexus HTTP Message Signature Profile v1 (RFC 9421, RFC 9530). One dictionary member labelled `nexus` whose covered components are exactly `\"@method\" \"@authority\" \"@path\" \"@query\"`, followed by `\"if-none-match\"` when that header is sent. `@query` is always covered; an empty query serialises as `?`, so query parameters cannot be added or removed undetected. Signature parameters, emitted in this order: `created` and `expires` (Unix seconds; `expires` = `created` + 300; the receiver rejects `created` more than ±5 minutes from its clock or a signature past `expires`), `keyid` (base64url SHA-256 thumbprint of the signer's signing public key, registered at onboarding; a missing, unknown, expired or revoked key id is rejected - never resolved to a default key), `alg` (always `rsa-pss-sha512`) and `tag` (always `nexus-v1`). The signature parameters are signed through the `@signature-params` line of the signature base. A missing, malformed or non-conforming value is rejected with AE005.","schema":{"type":"string","maxLength":512,"pattern":"^nexus=\\(\"@method\" \"@authority\" \"@path\" \"@query\"( \"if-none-match\")?\\);created=[0-9]{1,15};expires=[0-9]{1,15};keyid=\"[A-Za-z0-9_-]{43}\";alg=\"rsa-pss-sha512\";tag=\"nexus-v1\"$"}},"Signature":{"name":"Signature","in":"header","required":true,"description":"RFC 9421 signature value: one dictionary member labelled `nexus` holding an RFC 8941 byte sequence - the **standard base64** (not base64url) RSASSA-PSS signature using SHA-512 (`rsa-pss-sha512`), computed over the RFC 9421 signature base built from the components and parameters declared in `Signature-Input`. Produced with the sender's own signing private key; the receiver verifies it against the sender's registered signing public key resolved from `keyid`. With the minimum RSA-3072 key the signature is 384 bytes, i.e. 512 base64 characters. A missing, malformed or non-verifying signature is rejected with AE005.","schema":{"type":"string","minLength":520,"maxLength":1400,"pattern":"^nexus=:[A-Za-z0-9+/]+={0,2}:$"}}},"headers":{"ResponseSignatureInput":{"description":"RFC 9421 signature metadata for a GET response, per the Nexus HTTP Message Signature Profile v1 (RFC 9421, RFC 9530). Signed by the responding server with its own signing private key. Covered components: `\"@status\" \"content-type\" \"content-digest\"` on 200, or `\"@status\" \"etag\"` on 304, followed in both cases by the request-bound components `\"@method\";req \"@path\";req \"@query\";req`, which tie the response to the resource that was requested. Same `created`, `expires`, `keyid`, `alg` and `tag` rules as requests. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.","required":true,"schema":{"type":"string","maxLength":512,"pattern":"^nexus=\\(\"@status\" (\"content-type\" \"content-digest\"|\"etag\") \"@method\";req \"@path\";req \"@query\";req\\);created=[0-9]{1,15};expires=[0-9]{1,15};keyid=\"[A-Za-z0-9_-]{43}\";alg=\"rsa-pss-sha512\";tag=\"nexus-v1\"$"}},"ResponseSignature":{"description":"RFC 9421 response signature: one dictionary member labelled `nexus` holding the standard base64 `rsa-pss-sha512` signature produced by the responding server over the signature base declared in the response `Signature-Input`. Verified by the client against the server's registered signing public key.","required":true,"schema":{"type":"string","minLength":520,"maxLength":1400,"pattern":"^nexus=:[A-Za-z0-9+/]+={0,2}:$"}},"ResponseContentDigest":{"description":"RFC 9530 SHA-512 digest of the exact response body bytes, covered by the response signature.","required":true,"schema":{"type":"string","pattern":"^sha-512=:[A-Za-z0-9+/]{86}==:$"}}},"schemas":{"CountriesResponse":{"type":"object","description":"Response containing a list of supported countries.","properties":{"countries":{"type":"array","description":"List of supported countries.","items":{"$ref":"#/components/schemas/CountryResponse"}}},"required":["countries"]},"CountryResponse":{"type":"object","description":"Country reference data with supported currencies, SLA configuration, and message requirements.","properties":{"countryId":{"type":"integer","format":"int32","description":"ISO 3166-1 numeric country code.","minimum":1,"maximum":999},"countryCode":{"type":"string","description":"The ISO 3166 alpha-2 country code","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},"name":{"type":"string","description":"Country display name.","minLength":1,"maxLength":100},"currencies":{"type":"array","description":"Supported (active) currencies for this country. At least one element.","items":{"$ref":"#/components/schemas/CountryCurrencyResponse"},"minItems":1},"requiredMessageElements":{"$ref":"#/components/schemas/RequiredMessageElementsResponse","description":"Required ISO 20022 message elements for routing."},"supportedInstructionPriorities":{"type":"array","description":"Supported instruction priorities for payments to this country.","items":{"type":"string","enum":["NORM","HIGH"]},"uniqueItems":true},"sla":{"$ref":"#/components/schemas/SlaResponse","description":"SLA timeout configuration for payment execution."}},"required":["countryCode","countryId","currencies","name","requiredMessageElements","sla","supportedInstructionPriorities"]},"CountryCurrencyResponse":{"type":"object","description":"Currency configuration for a country.","properties":{"currencyCode":{"type":"string","description":"The ISO 4217 alpha-3 currency code","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"currencyName":{"type":"string","description":"Currency name.","minLength":1,"maxLength":50},"symbol":{"type":"string","description":"Currency symbol.","minLength":1,"maxLength":5},"decimalPlaces":{"type":"integer","format":"int32","description":"Currency decimal places.","minimum":0,"maximum":4},"minAmount":{"type":"string","description":"IPS minimum transaction amount for this currency, when configured. Plain decimal string (≥ 0) whose fractional digits exactly equal `decimalPlaces`; no exponent or grouping separators.","maxLength":18,"pattern":"^[0-9]+(\\.[0-9]+)?$"},"maxAmount":{"type":"string","description":"IPS maximum transaction amount for this currency. Plain decimal string (≥ 0) whose fractional digits exactly equal `decimalPlaces`; no exponent or grouping separators. Represented as a string to preserve decimal precision.","maxLength":18,"pattern":"^[0-9]+(\\.[0-9]+)?$"}},"required":["currencyCode","currencyName","decimalPlaces","maxAmount","symbol"]},"RequiredMessageElementsResponse":{"type":"object","description":"Required ISO 20022 message elements.","properties":{"pacs008":{"type":"array","description":"Required pacs.008 message elements.","items":{"type":"string","pattern":"^/Document/.+"}},"getQuotes":{"type":"array","description":"Lists additional parameters the Source PSP must supply on GET /v1/quotes. Present only when the destination country operates multiple IPSes, where it lists destinationPsp to indicate that destFinInstId and destFinInstIdType are required; absent for single-IPS countries.","items":{"type":"string","enum":["destinationPsp"]}}},"required":["pacs008"]},"SlaResponse":{"type":"object","description":"SLA timeout configuration for payment execution.","properties":{"normalPaymentMaxExecutionTimeout":{"type":"integer","format":"int32","description":"Maximum execution timeout for normal priority payments, in seconds.","minimum":0},"highPaymentMaxExecutionTimeout":{"type":"integer","format":"int32","description":"Maximum execution timeout for high priority payments, in seconds. Omitted if HIGH priority not supported.","minimum":0}},"required":["normalPaymentMaxExecutionTimeout"]},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the Nexus authentication layer or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.\n\n#### Validation rules\n\n- All four fields are required and never `null`.\n- `statusCode`: always `RJCT`.\n- `reasonCode`: 5 characters matching `^[A-Z]{2}[0-9]{3}$`; family prefix `TE` (technical), `AE` (authentication/authorisation, enforced at authentication) or `BE` (business); one of the values enumerated in the `reasonCode` schema.\n- `name`: UPPER_SNAKE_CASE, 1–50 characters; the name paired with `reasonCode` (e.g. `TE001` ↔ `INVALID_REQUEST`).\n- `description`: 1–500 characters; MUST NOT contain PII.\n- Gateway-level errors (405, 409, 413, 429, 502, 503, 504) do not carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4,"minLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, AE001–AE006, enforced at authentication), BE (Business Error, BE001–BE031).","enum":["TE001","TE002","TE099","AE001","AE002","AE003","AE004","AE005","AE006","BE001","BE002","BE007","BE008","BE009","BE010","BE011","BE012","BE013","BE014","BE015","BE016","BE017","BE018","BE019","BE020","BE021","BE030","BE031"],"maxLength":5,"pattern":"^[A-Z]{2}[0-9]{3}$","minLength":5},"name":{"type":"string","description":"Machine-readable error name paired with the reason code.","maxLength":50,"pattern":"^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$","minLength":1},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII.","maxLength":500,"minLength":1}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/countries":{"get":{"tags":["Countries"],"summary":"Retrieve All Countries in Nexus","description":"Returns all countries available on the Nexus network, along with key reference data for sending payments to those countries, such as maximum transaction amounts and requirements for category purpose codes.\n\n---\n\n#### Response validation rules\n\n**200 OK** — the body MUST conform to the response schema below. Response objects are open: additional properties may be introduced in later minor versions, and clients MUST ignore properties they do not recognise.\n\n| Field | Type | Presence | Nullable | Constraints |\n|---|---|---|---|---|\n| `countries` | array | Required | N | — |\n| `countries[].countryId` | integer | Required | N | format `int32`; ≥ 1; ≤ 999 |\n| `countries[].countryCode` | string | Required | N | pattern `^[A-Z]{2}$`; length 2 |\n| `countries[].name` | string | Required | N | min length 1; max length 100 |\n| `countries[].currencies` | array | Required | N | ≥ 1 item(s) |\n| `countries[].currencies[].currencyCode` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `countries[].currencies[].currencyName` | string | Required | N | min length 1; max length 50 |\n| `countries[].currencies[].symbol` | string | Required | N | min length 1; max length 5 |\n| `countries[].currencies[].decimalPlaces` | integer | Required | N | format `int32`; ≥ 0; ≤ 4 |\n| `countries[].currencies[].minAmount` | string | Optional | N | pattern `^[0-9]+(\\.[0-9]+)?$`; max length 18 |\n| `countries[].currencies[].maxAmount` | string | Required | N | pattern `^[0-9]+(\\.[0-9]+)?$`; max length 18 |\n| `countries[].requiredMessageElements` | object | Required | N | — |\n| `countries[].requiredMessageElements.pacs008` | array | Required | N | each item: pattern `^/Document/.+` |\n| `countries[].requiredMessageElements.getQuotes` | array | Conditional — present only for multi-IPS destination countries | N | each item: one of `destinationPsp` |\n| `countries[].supportedInstructionPriorities` | array | Required | N | unique items; each item: one of `NORM`, `HIGH` |\n| `countries[].sla` | object | Required | N | — |\n| `countries[].sla.normalPaymentMaxExecutionTimeout` | integer | Required | N | format `int32`; ≥ 0 |\n| `countries[].sla.highPaymentMaxExecutionTimeout` | integer | Conditional — present only when the country supports `HIGH` priority; omitted otherwise | N | format `int32`; ≥ 0 |\n\n**Cross-field rules**\n\n- `currencies[].minAmount` / `currencies[].maxAmount`: fractional digits exactly equal `currencies[].decimalPlaces`; JSON numbers, exponent notation and grouping separators are prohibited.\n- `currencies` lists only active currencies.\n- `sla.highPaymentMaxExecutionTimeout` is present only when the country supports `HIGH` priority (omitted otherwise); it therefore never appears unless `supportedInstructionPriorities` contains `HIGH`.\n- `requiredMessageElements.getQuotes` is present only for multi-IPS destination countries and then contains `destinationPsp`.\n- `supportedInstructionPriorities` is the union across the country's IPSes; `sla` values are the most relaxed (longest) MET across the country's IPSes, in whole seconds.\n\n**Response signature** — every 200 and 304 response carries `Signature-Input` and `Signature` (plus `Content-Digest` on 200) per the Nexus HTTP Message Signature Profile v1, signed by the responding server. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.\n\n**Error responses (4xx/5xx with a body)** — the body MUST conform to `ErrorApiResponse`: `statusCode` = `RJCT`; `reasonCode` matches `^[A-Z]{2}[0-9]{3}$`; `name` is UPPER_SNAKE_CASE (≤ 50); `description` ≤ 500 characters and MUST NOT contain PII. `reasonCode` values for this operation: `TE099`, `AE001`, `AE002`, `AE003`, `AE005`, `AE006`, `AE004`. Gateway errors (405, 429, 502, 503, 504) carry no body.","operationId":"listCountries","parameters":[{"name":"Accept","in":"header","description":"*/*","required":true,"schema":{"type":"string","default":"*/*"}},{"name":"If-None-Match","in":"header","description":"Optional. ETag value from a previous response for conditional GET. If it matches the current entity tag, the server returns 304 Not Modified with no body.","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/SignatureInputBodyless"},{"$ref":"#/components/parameters/Signature"}],"responses":{"200":{"description":"A list of countries with payment details.","headers":{"ETag":{"description":"Entity tag for cache validation","style":"simple","schema":{"type":"string"}},"Cache-Control":{"description":"Caching guidance for this reference-data resource. Nexus invalidates the underlying cache immediately when the underlying configuration changes; responses may otherwise be cached for up to 300 seconds.","schema":{"type":"string"}},"Signature-Input":{"$ref":"#/components/headers/ResponseSignatureInput"},"Signature":{"$ref":"#/components/headers/ResponseSignature"},"Content-Digest":{"$ref":"#/components/headers/ResponseContentDigest"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountriesResponse"}}}},"304":{"description":"Not Modified. The resource has not changed since the last request.","headers":{"ETag":{"description":"Entity tag for cache validation","style":"simple","schema":{"type":"string"}},"Signature-Input":{"$ref":"#/components/headers/ResponseSignatureInput"},"Signature":{"$ref":"#/components/headers/ResponseSignature"}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```

## Retrieve a Single Country

> Returns a specified country based on the 2-letter countryCode provided, along with key reference data for sending payments to that country, such as maximum transaction amounts and requirements for category purpose codes.\
> \
> \---\
> \
> \#### Response validation rules\
> \
> \*\*200 OK\*\* — the body MUST conform to the response schema below. Response objects are open: additional properties may be introduced in later minor versions, and clients MUST ignore properties they do not recognise.\
> \
> \| Field | Type | Presence | Nullable | Constraints |\
> \|---|---|---|---|---|\
> \| \`countryId\` | integer | Required | N | format \`int32\`; ≥ 1; ≤ 999 |\
> \| \`countryCode\` | string | Required | N | pattern \`^\[A-Z]{2}$\`; length 2 |\
> \| \`name\` | string | Required | N | min length 1; max length 100 |\
> \| \`currencies\` | array | Required | N | ≥ 1 item(s) |\
> \| \`currencies\[].currencyCode\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`currencies\[].currencyName\` | string | Required | N | min length 1; max length 50 |\
> \| \`currencies\[].symbol\` | string | Required | N | min length 1; max length 5 |\
> \| \`currencies\[].decimalPlaces\` | integer | Required | N | format \`int32\`; ≥ 0; ≤ 4 |\
> \| \`currencies\[].minAmount\` | string | Optional | N | pattern \`^\[0-9]+(\\.\[0-9]+)?$\`; max length 18 |\
> \| \`currencies\[].maxAmount\` | string | Required | N | pattern \`^\[0-9]+(\\.\[0-9]+)?$\`; max length 18 |\
> \| \`requiredMessageElements\` | object | Required | N | — |\
> \| \`requiredMessageElements.pacs008\` | array | Required | N | each item: pattern \`^/Document/.+\` |\
> \| \`requiredMessageElements.getQuotes\` | array | Conditional — present only for multi-IPS destination countries | N | each item: one of \`destinationPsp\` |\
> \| \`supportedInstructionPriorities\` | array | Required | N | unique items; each item: one of \`NORM\`, \`HIGH\` |\
> \| \`sla\` | object | Required | N | — |\
> \| \`sla.normalPaymentMaxExecutionTimeout\` | integer | Required | N | format \`int32\`; ≥ 0 |\
> \| \`sla.highPaymentMaxExecutionTimeout\` | integer | Conditional — present only when the country supports \`HIGH\` priority; omitted otherwise | N | format \`int32\`; ≥ 0 |\
> \
> \*\*Cross-field rules\*\*\
> \
> \- \`countryCode\` equals the \`countryCode\` path parameter.\
> \- \`currencies\[].minAmount\` / \`currencies\[].maxAmount\`: fractional digits exactly equal \`currencies\[].decimalPlaces\`; JSON numbers, exponent notation and grouping separators are prohibited.\
> \- \`currencies\` lists only active currencies.\
> \- \`sla.highPaymentMaxExecutionTimeout\` is present only when the country supports \`HIGH\` priority (omitted otherwise); it therefore never appears unless \`supportedInstructionPriorities\` contains \`HIGH\`.\
> \- \`requiredMessageElements.getQuotes\` is present only for multi-IPS destination countries and then contains \`destinationPsp\`.\
> \- \`supportedInstructionPriorities\` is the union across the country's IPSes; \`sla\` values are the most relaxed (longest) MET across the country's IPSes, in whole seconds.\
> \
> \*\*Response signature\*\* — every 200 and 304 response carries \`Signature-Input\` and \`Signature\` (plus \`Content-Digest\` on 200) per the Nexus HTTP Message Signature Profile v1, signed by the responding server. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.\
> \
> \*\*Error responses (4xx/5xx with a body)\*\* — the body MUST conform to \`ErrorApiResponse\`: \`statusCode\` = \`RJCT\`; \`reasonCode\` matches \`^\[A-Z]{2}\[0-9]{3}$\`; \`name\` is UPPER\_SNAKE\_CASE (≤ 50); \`description\` ≤ 500 characters and MUST NOT contain PII. \`reasonCode\` values for this operation: \`TE001\`, \`BE001\`, \`BE002\`, \`TE099\`, \`AE001\`, \`AE002\`, \`AE003\`, \`AE005\`, \`AE006\`, \`AE004\`. Gateway errors (405, 429, 502, 503, 504) carry no body.

```json
{"openapi":"3.1.0","info":{"title":"Nexus Payments API","version":"v1"},"tags":[{"name":"Countries","description":"Country reference data and payment constraints, including supported instruction priorities, SLA execution timeouts, currency amount ranges (min/max), and purpose-code requirements."}],"servers":[{"url":"https://{environment}.payments.nexus.net","description":"Nexus participant-facing API endpoint. Resolved via Nexus private DNS over the established IPsec IKEv2 tunnel and not reachable from the public Internet.","variables":{"environment":{"default":"prod","enum":["pat","prod"],"description":"Deployment environment subdomain."}}}],"security":[{"mutualTLS":[],"nexusOAuth":["countries.read"]}],"components":{"securitySchemes":{"mutualTLS":{"type":"mutualTLS","description":"Mutual TLS: the IPSO presents its X.509 client certificate on every connection, validated during the TLS handshake (fail-closed). The same certificate is the RFC 8705 binding anchor for the OAuth access token (see nexusOAuth)."}},"parameters":{"SignatureInputBodyless":{"name":"Signature-Input","in":"header","required":true,"description":"RFC 9421 signature metadata for a request without a body, per the Nexus HTTP Message Signature Profile v1 (RFC 9421, RFC 9530). One dictionary member labelled `nexus` whose covered components are exactly `\"@method\" \"@authority\" \"@path\" \"@query\"`, followed by `\"if-none-match\"` when that header is sent. `@query` is always covered; an empty query serialises as `?`, so query parameters cannot be added or removed undetected. Signature parameters, emitted in this order: `created` and `expires` (Unix seconds; `expires` = `created` + 300; the receiver rejects `created` more than ±5 minutes from its clock or a signature past `expires`), `keyid` (base64url SHA-256 thumbprint of the signer's signing public key, registered at onboarding; a missing, unknown, expired or revoked key id is rejected - never resolved to a default key), `alg` (always `rsa-pss-sha512`) and `tag` (always `nexus-v1`). The signature parameters are signed through the `@signature-params` line of the signature base. A missing, malformed or non-conforming value is rejected with AE005.","schema":{"type":"string","maxLength":512,"pattern":"^nexus=\\(\"@method\" \"@authority\" \"@path\" \"@query\"( \"if-none-match\")?\\);created=[0-9]{1,15};expires=[0-9]{1,15};keyid=\"[A-Za-z0-9_-]{43}\";alg=\"rsa-pss-sha512\";tag=\"nexus-v1\"$"}},"Signature":{"name":"Signature","in":"header","required":true,"description":"RFC 9421 signature value: one dictionary member labelled `nexus` holding an RFC 8941 byte sequence - the **standard base64** (not base64url) RSASSA-PSS signature using SHA-512 (`rsa-pss-sha512`), computed over the RFC 9421 signature base built from the components and parameters declared in `Signature-Input`. Produced with the sender's own signing private key; the receiver verifies it against the sender's registered signing public key resolved from `keyid`. With the minimum RSA-3072 key the signature is 384 bytes, i.e. 512 base64 characters. A missing, malformed or non-verifying signature is rejected with AE005.","schema":{"type":"string","minLength":520,"maxLength":1400,"pattern":"^nexus=:[A-Za-z0-9+/]+={0,2}:$"}}},"headers":{"ResponseSignatureInput":{"description":"RFC 9421 signature metadata for a GET response, per the Nexus HTTP Message Signature Profile v1 (RFC 9421, RFC 9530). Signed by the responding server with its own signing private key. Covered components: `\"@status\" \"content-type\" \"content-digest\"` on 200, or `\"@status\" \"etag\"` on 304, followed in both cases by the request-bound components `\"@method\";req \"@path\";req \"@query\";req`, which tie the response to the resource that was requested. Same `created`, `expires`, `keyid`, `alg` and `tag` rules as requests. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.","required":true,"schema":{"type":"string","maxLength":512,"pattern":"^nexus=\\(\"@status\" (\"content-type\" \"content-digest\"|\"etag\") \"@method\";req \"@path\";req \"@query\";req\\);created=[0-9]{1,15};expires=[0-9]{1,15};keyid=\"[A-Za-z0-9_-]{43}\";alg=\"rsa-pss-sha512\";tag=\"nexus-v1\"$"}},"ResponseSignature":{"description":"RFC 9421 response signature: one dictionary member labelled `nexus` holding the standard base64 `rsa-pss-sha512` signature produced by the responding server over the signature base declared in the response `Signature-Input`. Verified by the client against the server's registered signing public key.","required":true,"schema":{"type":"string","minLength":520,"maxLength":1400,"pattern":"^nexus=:[A-Za-z0-9+/]+={0,2}:$"}},"ResponseContentDigest":{"description":"RFC 9530 SHA-512 digest of the exact response body bytes, covered by the response signature.","required":true,"schema":{"type":"string","pattern":"^sha-512=:[A-Za-z0-9+/]{86}==:$"}}},"schemas":{"CountryResponse":{"type":"object","description":"Country reference data with supported currencies, SLA configuration, and message requirements.","properties":{"countryId":{"type":"integer","format":"int32","description":"ISO 3166-1 numeric country code.","minimum":1,"maximum":999},"countryCode":{"type":"string","description":"The ISO 3166 alpha-2 country code","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},"name":{"type":"string","description":"Country display name.","minLength":1,"maxLength":100},"currencies":{"type":"array","description":"Supported (active) currencies for this country. At least one element.","items":{"$ref":"#/components/schemas/CountryCurrencyResponse"},"minItems":1},"requiredMessageElements":{"$ref":"#/components/schemas/RequiredMessageElementsResponse","description":"Required ISO 20022 message elements for routing."},"supportedInstructionPriorities":{"type":"array","description":"Supported instruction priorities for payments to this country.","items":{"type":"string","enum":["NORM","HIGH"]},"uniqueItems":true},"sla":{"$ref":"#/components/schemas/SlaResponse","description":"SLA timeout configuration for payment execution."}},"required":["countryCode","countryId","currencies","name","requiredMessageElements","sla","supportedInstructionPriorities"]},"CountryCurrencyResponse":{"type":"object","description":"Currency configuration for a country.","properties":{"currencyCode":{"type":"string","description":"The ISO 4217 alpha-3 currency code","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"currencyName":{"type":"string","description":"Currency name.","minLength":1,"maxLength":50},"symbol":{"type":"string","description":"Currency symbol.","minLength":1,"maxLength":5},"decimalPlaces":{"type":"integer","format":"int32","description":"Currency decimal places.","minimum":0,"maximum":4},"minAmount":{"type":"string","description":"IPS minimum transaction amount for this currency, when configured. Plain decimal string (≥ 0) whose fractional digits exactly equal `decimalPlaces`; no exponent or grouping separators.","maxLength":18,"pattern":"^[0-9]+(\\.[0-9]+)?$"},"maxAmount":{"type":"string","description":"IPS maximum transaction amount for this currency. Plain decimal string (≥ 0) whose fractional digits exactly equal `decimalPlaces`; no exponent or grouping separators. Represented as a string to preserve decimal precision.","maxLength":18,"pattern":"^[0-9]+(\\.[0-9]+)?$"}},"required":["currencyCode","currencyName","decimalPlaces","maxAmount","symbol"]},"RequiredMessageElementsResponse":{"type":"object","description":"Required ISO 20022 message elements.","properties":{"pacs008":{"type":"array","description":"Required pacs.008 message elements.","items":{"type":"string","pattern":"^/Document/.+"}},"getQuotes":{"type":"array","description":"Lists additional parameters the Source PSP must supply on GET /v1/quotes. Present only when the destination country operates multiple IPSes, where it lists destinationPsp to indicate that destFinInstId and destFinInstIdType are required; absent for single-IPS countries.","items":{"type":"string","enum":["destinationPsp"]}}},"required":["pacs008"]},"SlaResponse":{"type":"object","description":"SLA timeout configuration for payment execution.","properties":{"normalPaymentMaxExecutionTimeout":{"type":"integer","format":"int32","description":"Maximum execution timeout for normal priority payments, in seconds.","minimum":0},"highPaymentMaxExecutionTimeout":{"type":"integer","format":"int32","description":"Maximum execution timeout for high priority payments, in seconds. Omitted if HIGH priority not supported.","minimum":0}},"required":["normalPaymentMaxExecutionTimeout"]},"ErrorApiResponse":{"type":"object","description":"Standard structured rejection body. Returned for all non-2xx responses produced by the Nexus authentication layer or the application. Gateway level errors (405, 409, 413, 429, 502, 503, 504) do NOT carry this body.\n\n#### Validation rules\n\n- All four fields are required and never `null`.\n- `statusCode`: always `RJCT`.\n- `reasonCode`: 5 characters matching `^[A-Z]{2}[0-9]{3}$`; family prefix `TE` (technical), `AE` (authentication/authorisation, enforced at authentication) or `BE` (business); one of the values enumerated in the `reasonCode` schema.\n- `name`: UPPER_SNAKE_CASE, 1–50 characters; the name paired with `reasonCode` (e.g. `TE001` ↔ `INVALID_REQUEST`).\n- `description`: 1–500 characters; MUST NOT contain PII.\n- Gateway-level errors (405, 409, 413, 429, 502, 503, 504) do not carry this body.","properties":{"statusCode":{"type":"string","description":"Business-level status code. Always RJCT (Rejected) — the structured error body is only returned for rejection cases. Successful responses use HTTP status alone (200 OK for sync, 202 Accepted for async ingress) with no structured statusCode body.","enum":["RJCT"],"maxLength":4,"minLength":4},"reasonCode":{"type":"string","description":"Categorised reason code. Three families: TE (Technical Error, e.g. TE001/TE002/TE099), AE (Authentication / Authorization Error, AE001–AE006, enforced at authentication), BE (Business Error, BE001–BE031).","enum":["TE001","TE002","TE099","AE001","AE002","AE003","AE004","AE005","AE006","BE001","BE002","BE007","BE008","BE009","BE010","BE011","BE012","BE013","BE014","BE015","BE016","BE017","BE018","BE019","BE020","BE021","BE030","BE031"],"maxLength":5,"pattern":"^[A-Z]{2}[0-9]{3}$","minLength":5},"name":{"type":"string","description":"Machine-readable error name paired with the reason code.","maxLength":50,"pattern":"^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$","minLength":1},"description":{"type":"string","description":"Human-readable error description. MUST NOT contain PII.","maxLength":500,"minLength":1}},"required":["description","name","reasonCode","statusCode"]}}},"paths":{"/v1/countries/{countryCode}":{"get":{"tags":["Countries"],"summary":"Retrieve a Single Country","description":"Returns a specified country based on the 2-letter countryCode provided, along with key reference data for sending payments to that country, such as maximum transaction amounts and requirements for category purpose codes.\n\n---\n\n#### Response validation rules\n\n**200 OK** — the body MUST conform to the response schema below. Response objects are open: additional properties may be introduced in later minor versions, and clients MUST ignore properties they do not recognise.\n\n| Field | Type | Presence | Nullable | Constraints |\n|---|---|---|---|---|\n| `countryId` | integer | Required | N | format `int32`; ≥ 1; ≤ 999 |\n| `countryCode` | string | Required | N | pattern `^[A-Z]{2}$`; length 2 |\n| `name` | string | Required | N | min length 1; max length 100 |\n| `currencies` | array | Required | N | ≥ 1 item(s) |\n| `currencies[].currencyCode` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `currencies[].currencyName` | string | Required | N | min length 1; max length 50 |\n| `currencies[].symbol` | string | Required | N | min length 1; max length 5 |\n| `currencies[].decimalPlaces` | integer | Required | N | format `int32`; ≥ 0; ≤ 4 |\n| `currencies[].minAmount` | string | Optional | N | pattern `^[0-9]+(\\.[0-9]+)?$`; max length 18 |\n| `currencies[].maxAmount` | string | Required | N | pattern `^[0-9]+(\\.[0-9]+)?$`; max length 18 |\n| `requiredMessageElements` | object | Required | N | — |\n| `requiredMessageElements.pacs008` | array | Required | N | each item: pattern `^/Document/.+` |\n| `requiredMessageElements.getQuotes` | array | Conditional — present only for multi-IPS destination countries | N | each item: one of `destinationPsp` |\n| `supportedInstructionPriorities` | array | Required | N | unique items; each item: one of `NORM`, `HIGH` |\n| `sla` | object | Required | N | — |\n| `sla.normalPaymentMaxExecutionTimeout` | integer | Required | N | format `int32`; ≥ 0 |\n| `sla.highPaymentMaxExecutionTimeout` | integer | Conditional — present only when the country supports `HIGH` priority; omitted otherwise | N | format `int32`; ≥ 0 |\n\n**Cross-field rules**\n\n- `countryCode` equals the `countryCode` path parameter.\n- `currencies[].minAmount` / `currencies[].maxAmount`: fractional digits exactly equal `currencies[].decimalPlaces`; JSON numbers, exponent notation and grouping separators are prohibited.\n- `currencies` lists only active currencies.\n- `sla.highPaymentMaxExecutionTimeout` is present only when the country supports `HIGH` priority (omitted otherwise); it therefore never appears unless `supportedInstructionPriorities` contains `HIGH`.\n- `requiredMessageElements.getQuotes` is present only for multi-IPS destination countries and then contains `destinationPsp`.\n- `supportedInstructionPriorities` is the union across the country's IPSes; `sla` values are the most relaxed (longest) MET across the country's IPSes, in whole seconds.\n\n**Response signature** — every 200 and 304 response carries `Signature-Input` and `Signature` (plus `Content-Digest` on 200) per the Nexus HTTP Message Signature Profile v1, signed by the responding server. The client MUST verify the response signature before using the response and MUST discard a response that fails verification.\n\n**Error responses (4xx/5xx with a body)** — the body MUST conform to `ErrorApiResponse`: `statusCode` = `RJCT`; `reasonCode` matches `^[A-Z]{2}[0-9]{3}$`; `name` is UPPER_SNAKE_CASE (≤ 50); `description` ≤ 500 characters and MUST NOT contain PII. `reasonCode` values for this operation: `TE001`, `BE001`, `BE002`, `TE099`, `AE001`, `AE002`, `AE003`, `AE005`, `AE006`, `AE004`. Gateway errors (405, 429, 502, 503, 504) carry no body.","operationId":"getCountryByCode","parameters":[{"name":"Accept","in":"header","description":"*/*","required":true,"schema":{"type":"string","default":"*/*"}},{"name":"countryCode","in":"path","description":"ISO 3166-1 alpha-2 uppercase destination code","required":true,"schema":{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"}},{"name":"If-None-Match","in":"header","description":"Optional. ETag value from a previous response for conditional GET. If it matches the current entity tag, the server returns 304 Not Modified with no body.","required":false,"schema":{"type":"string"}},{"$ref":"#/components/parameters/SignatureInputBodyless"},{"$ref":"#/components/parameters/Signature"}],"responses":{"200":{"description":"Country information.","headers":{"ETag":{"description":"Entity tag for cache validation","style":"simple","schema":{"type":"string"}},"Cache-Control":{"description":"Caching guidance for this reference-data resource. Nexus invalidates the underlying cache immediately when the underlying configuration changes; responses may otherwise be cached for up to 300 seconds.","schema":{"type":"string"}},"Signature-Input":{"$ref":"#/components/headers/ResponseSignatureInput"},"Signature":{"$ref":"#/components/headers/ResponseSignature"},"Content-Digest":{"$ref":"#/components/headers/ResponseContentDigest"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryResponse"}}}},"304":{"description":"Not Modified. The resource has not changed since the last request.","headers":{"ETag":{"description":"Entity tag for cache validation","style":"simple","schema":{"type":"string"}},"Signature-Input":{"$ref":"#/components/headers/ResponseSignatureInput"},"Signature":{"$ref":"#/components/headers/ResponseSignature"}}},"400":{"description":"Invalid Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"401":{"description":"Authentication Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"403":{"description":"Authorization Failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"404":{"description":"Resource Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"405":{"description":"Method Not Allowed. The HTTP method is not supported for this endpoint. Use the correct HTTP method.","headers":{"Allow":{"description":"Permitted HTTP methods for this endpoint","schema":{"type":"string"}}}},"429":{"description":"Too Many Requests. Rate limit exceeded. The Retry-After header indicates when to retry. Back off and retry after the indicated duration.","headers":{"Retry-After":{"description":"Duration after which the caller may retry","schema":{"type":"integer","minimum":0}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponse"}}}},"502":{"description":"Bad Gateway. The gateway received an invalid response from the upstream service. Retry with exponential backoff. If persistent, escalate."},"503":{"description":"Service Unavailable. The upstream service is temporarily unavailable, for example during rolling deployment. Retry with exponential backoff."},"504":{"description":"Gateway Timeout. The upstream service did not respond within the gateway's timeout window. Retry with exponential backoff."}}}}}}
```
