> 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/quotes.md).

# Quotes

FX quotes for a corridor and amount.

## FX Quote Retrieval & Selection

> Source PSP retrieves FX quotes from Nexus for a given corridor and amount. Includes improved rates for PSP, improved rates for the amount, and checks Maximum Source and Destination IPS amounts for the currencies. Service used when Source PSP uses third-party FXP.\
> \
> \---\
> \
> \#### 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 |\
> \|---|---|---|---|---|\
> \| \`quoteRequestId\` | string | Required | N | format \`uuid\`; pattern \`^\[0-9a-fA-F]{8}-\[0-9a-fA-F]{4}-4\[0-9a-fA-F]{3}-\[89abAB]\[0-9a-fA-F]{3}-\[0-9a-fA-F]{12}$\`; length 36 |\
> \| \`sourceCountry\` | string | Required | N | pattern \`^\[A-Z]{2}$\`; length 2 |\
> \| \`sourceCurrency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`destinationCountry\` | string | Required | N | pattern \`^\[A-Z]{2}$\`; length 2 |\
> \| \`destinationCurrency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`amountCurrency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`amount\` | number | Required | N | > 0 |\
> \| \`quotes\` | array | Required | N | — |\
> \| \`quotes\[].quoteId\` | string | Required | N | format \`uuid\`; pattern \`^\[0-9a-fA-F]{8}-\[0-9a-fA-F]{4}-4\[0-9a-fA-F]{3}-\[89abAB]\[0-9a-fA-F]{3}-\[0-9a-fA-F]{12}$\`; length 36 |\
> \| \`quotes\[].issuedDateTime\` | string | Required | N | format \`date-time\`; pattern \`^\[0-9]{4}-\[0-9]{2}-\[0-9]{2}T\[0-9]{2}:\[0-9]{2}:\[0-9]{2}Z$\`; max length 24 |\
> \| \`quotes\[].expiryDateTime\` | string | Required | N | format \`date-time\`; pattern \`^\[0-9]{4}-\[0-9]{2}-\[0-9]{2}T\[0-9]{2}:\[0-9]{2}:\[0-9]{2}Z$\`; max length 24 |\
> \| \`quotes\[].fxpFinInstIdType\` | string | Required | N | one of \`BICFI\`, \`LEI\`, \`otherId\`; max length 10 |\
> \| \`quotes\[].fxpFinInstId\` | string | Required | N | min length 1; max length 35 |\
> \| \`quotes\[].exchangeRate\` | number | Required | N | > 0 |\
> \| \`quotes\[].debtorAgent\` | object | Required | N | — |\
> \| \`quotes\[].debtorAgent.interbankSettlementAmount\` | object | Required | N | — |\
> \| \`quotes\[].debtorAgent.interbankSettlementAmount.currency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`quotes\[].debtorAgent.interbankSettlementAmount.amount\` | number | Required | N | ≥ 0 |\
> \| \`quotes\[].debtorAgent.interbankSettlementAmount.cappedToMaxAmount\` | boolean | Required | N | — |\
> \| \`quotes\[].intermediaryAgent1\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent1.finInstId\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent1.finInstId.name\` | string | Required | N | min length 1; max length 140 |\
> \| \`quotes\[].intermediaryAgent1.finInstId.BICFI\` | string | Conditional — present when the institution has a BIC | Y | pattern \`^\[A-Z]{6}\[0-9A-Z]{2}(\[0-9A-Z]{3})?$\`; max length 11 |\
> \| \`quotes\[].intermediaryAgent1.finInstId.LEI\` | string | Optional | Y | pattern \`^\[0-9A-Z]{18}\[0-9]{2}$\`; max length 20 |\
> \| \`quotes\[].intermediaryAgent1.finInstId.clearingSystemMemberId\` | object | Optional | N | — |\
> \| \`quotes\[].intermediaryAgent1.finInstId.clearingSystemMemberId.clearingSystemId\` | string | Optional | Y | — |\
> \| \`quotes\[].intermediaryAgent1.finInstId.clearingSystemMemberId.memberId\` | string | Optional | Y | max length 35 |\
> \| \`quotes\[].intermediaryAgent1.finInstId.other\` | object | Optional | N | — |\
> \| \`quotes\[].intermediaryAgent1.finInstId.other.id\` | string | Optional | Y | max length 35 |\
> \| \`quotes\[].intermediaryAgent1Account\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent1Account.id\` | string | Required | N | min length 1; max length 34 |\
> \| \`quotes\[].intermediaryAgent2\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent2.finInstId\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent2.finInstId.name\` | string | Required | N | min length 1; max length 140 |\
> \| \`quotes\[].intermediaryAgent2.finInstId.BICFI\` | string | Conditional — present when the institution has a BIC | Y | pattern \`^\[A-Z]{6}\[0-9A-Z]{2}(\[0-9A-Z]{3})?$\`; max length 11 |\
> \| \`quotes\[].intermediaryAgent2.finInstId.LEI\` | string | Optional | Y | pattern \`^\[0-9A-Z]{18}\[0-9]{2}$\`; max length 20 |\
> \| \`quotes\[].intermediaryAgent2.finInstId.clearingSystemMemberId\` | object | Optional | N | — |\
> \| \`quotes\[].intermediaryAgent2.finInstId.clearingSystemMemberId.clearingSystemId\` | string | Optional | Y | — |\
> \| \`quotes\[].intermediaryAgent2.finInstId.clearingSystemMemberId.memberId\` | string | Optional | Y | max length 35 |\
> \| \`quotes\[].intermediaryAgent2.finInstId.other\` | object | Optional | N | — |\
> \| \`quotes\[].intermediaryAgent2.finInstId.other.id\` | string | Optional | Y | max length 35 |\
> \| \`quotes\[].intermediaryAgent2Account\` | object | Required | N | — |\
> \| \`quotes\[].intermediaryAgent2Account.id\` | string | Required | N | min length 1; max length 34 |\
> \| \`quotes\[].creditorAgent\` | object | Required | N | — |\
> \| \`quotes\[].creditorAgent.interbankSettlementAmount\` | object | Required | N | — |\
> \| \`quotes\[].creditorAgent.interbankSettlementAmount.currency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`quotes\[].creditorAgent.interbankSettlementAmount.amount\` | number | Required | N | ≥ 0 |\
> \| \`quotes\[].creditorAgent.interbankSettlementAmount.cappedToMaxAmount\` | boolean | Required | N | — |\
> \| \`quotes\[].creditorAgent.chargesAmount\` | object | Required | N | — |\
> \| \`quotes\[].creditorAgent.chargesAmount.amount\` | number | Required | N | ≥ 0 |\
> \| \`quotes\[].creditorAgent.chargesAmount.currency\` | string | Required | N | pattern \`^\[A-Z]{3}$\`; length 3 |\
> \| \`quotes\[].creditorAgent.creditorAccountAmount\` | number | Required | N | ≥ 0 |\
> \
> \*\*Cross-field rules\*\*\
> \
> \- \`sourceCountry\`, \`sourceCurrency\`, \`destinationCountry\`, \`destinationCurrency\`, \`amountCurrency\` and \`amount\` echo the request parameters.\
> \- \`quotes\` is an empty array when no FXP is eligible.\
> \- \`quotes\[].expiryDateTime\` = \`quotes\[].issuedDateTime\` + NQVT (Nexus Quote Validity Time).\
> \- \`quotes\[].fxpFinInstId\` conforms to the format implied by \`quotes\[].fxpFinInstIdType\` (e.g. BIC pattern for \`BICFI\`, LEI pattern for \`LEI\`).\
> \- \`quotes\[].exchangeRate\` carries at most 8 decimal places.\
> \- \`quotes\[].debtorAgent.interbankSettlementAmount.currency\` = \`sourceCurrency\`.\
> \- \`quotes\[].creditorAgent.interbankSettlementAmount.currency\` = \`quotes\[].creditorAgent.chargesAmount.currency\` = \`destinationCurrency\`.\
> \- \`quotes\[].creditorAgent.creditorAccountAmount\` = \`quotes\[].creditorAgent.interbankSettlementAmount.amount\` − \`quotes\[].creditorAgent.chargesAmount.amount\`.\
> \- Monetary amounts are rounded to the currency's ISO 4217 minor units (decimal places from the currency's Nexus configuration) using \`ROUND\_HALF\_UP\`.\
> \
> \*\*Response signature\*\* — every 200 response carries \`Signature-Input\` and \`Signature\` and \`Content-Digest\` 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\`, \`BE007\`, \`BE008\`, \`AE001\`, \`AE002\`, \`AE003\`, \`AE005\`, \`AE006\`, \`AE004\`, \`BE009\`, \`TE099\`. Gateway errors (405, 429, 502, 503, 504) carry no body.

```json
{"openapi":"3.1.0","info":{"title":"Nexus Payments API","version":"v1"},"tags":[{"name":"Quotes","description":"FX quotes for a corridor and amount."}],"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":["quotes.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}:$"}}},"schemas":{"QuoteResponse":{"type":"object","description":"FX quote response with quote details.","properties":{"quoteRequestId":{"type":"string","description":"Quote request identifier.","format":"uuid","minLength":36,"maxLength":36,"pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"},"sourceCountry":{"type":"string","description":"The ISO 3166 alpha-2 country code","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},"sourceCurrency":{"type":"string","description":"The ISO 4217 alpha-3 currency code","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"destinationCountry":{"type":"string","description":"ISO 3166-1 alpha-2 destination country code.","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"},"destinationCurrency":{"type":"string","description":"ISO 4217 destination currency code.","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"amountCurrency":{"type":"string","description":"Currency for the amount.","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"amount":{"type":"number","description":"Amount value. When copied into an ISO 20022 XML amount the value must have at most 5 fractional digits and at most 18 total digits; serialise as a plain decimal, never in exponent form.","exclusiveMinimum":0},"quotes":{"type":"array","description":"Quote detail list.","items":{"$ref":"#/components/schemas/QuoteDetail"}}},"required":["amount","amountCurrency","destinationCountry","destinationCurrency","quoteRequestId","quotes","sourceCountry","sourceCurrency"]},"QuoteDetail":{"type":"object","description":"Individual quote detail.","properties":{"quoteId":{"type":"string","description":"Quote identifier. Lowercase UUID v4 only; must be copied unchanged into the XML QtId.","format":"uuid","minLength":36,"maxLength":36,"pattern":"^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$"},"issuedDateTime":{"type":"string","format":"date-time","description":"Quote issue timestamp (ISO-8601).","maxLength":24,"pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"},"expiryDateTime":{"type":"string","format":"date-time","description":"Quote expiry timestamp (ISO-8601).","maxLength":24,"pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$"},"fxpFinInstIdType":{"type":"string","description":"FXP financial institution id type.","enum":["BICFI","LEI","otherId"],"maxLength":10},"fxpFinInstId":{"type":"string","description":"FXP financial institution id.","maxLength":35,"minLength":1},"exchangeRate":{"type":"number","description":"FX rate applied to the quote. Effective rate after all improvements (Source Currency to Destination Currency); greater than zero, 8 decimal places. When copied into an ISO 20022 XML exchange rate it must be serialised with exactly 8 fractional digits and at most 11 total digits (for example 25 becomes 25.00000000).","exclusiveMinimum":0},"debtorAgent":{"$ref":"#/components/schemas/DebtorAgent","description":"Debtor agent amounts."},"intermediaryAgent1":{"$ref":"#/components/schemas/IntermediaryAgent","description":"First intermediary agent."},"intermediaryAgent1Account":{"$ref":"#/components/schemas/IntermediaryAgentAccount","description":"First intermediary agent account."},"intermediaryAgent2":{"$ref":"#/components/schemas/IntermediaryAgent","description":"Second intermediary agent."},"intermediaryAgent2Account":{"$ref":"#/components/schemas/IntermediaryAgentAccount","description":"Second intermediary agent account."},"creditorAgent":{"$ref":"#/components/schemas/CreditorAgent","description":"Creditor agent amounts."}},"required":["creditorAgent","debtorAgent","exchangeRate","expiryDateTime","fxpFinInstId","fxpFinInstIdType","intermediaryAgent1","intermediaryAgent1Account","intermediaryAgent2","intermediaryAgent2Account","issuedDateTime","quoteId"]},"DebtorAgent":{"type":"object","description":"Debtor agent amounts for a quote.","properties":{"interbankSettlementAmount":{"$ref":"#/components/schemas/InterbankAmount","description":"Interbank settlement amount."}},"required":["interbankSettlementAmount"]},"InterbankAmount":{"type":"object","description":"Interbank settlement amount with cap indicator.","properties":{"currency":{"type":"string","description":"The ISO 4217 alpha-3 currency code","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"},"amount":{"type":"number","description":"Amount value. When copied into an ISO 20022 XML amount the value must have at most 5 fractional digits and at most 18 total digits; serialise as a plain decimal, never in exponent form.","minimum":0},"cappedToMaxAmount":{"type":"boolean","description":"Whether the amount was capped by IPS limits."}},"required":["amount","cappedToMaxAmount","currency"]},"IntermediaryAgent":{"type":"object","description":"Intermediary agent details.","properties":{"finInstId":{"$ref":"#/components/schemas/IntermediaryFinInstId","description":"Financial institution identifier."}},"required":["finInstId"]},"IntermediaryFinInstId":{"type":"object","description":"Financial institution identifiers for an intermediary agent.","properties":{"name":{"type":"string","description":"Financial institution name.","minLength":1,"maxLength":140},"BICFI":{"type":["string","null"],"description":"BICFI identifier.","maxLength":11,"pattern":"^[A-Z]{6}[0-9A-Z]{2}([0-9A-Z]{3})?$"},"LEI":{"type":["string","null"],"description":"LEI identifier.","maxLength":20,"pattern":"^[0-9A-Z]{18}[0-9]{2}$"},"clearingSystemMemberId":{"$ref":"#/components/schemas/ClearingSystemMemberId","description":"Clearing system member identifier."},"other":{"$ref":"#/components/schemas/OtherId","description":"Other identifier."}},"required":["name"]},"ClearingSystemMemberId":{"type":"object","description":"Clearing system member identifier.","properties":{"clearingSystemId":{"type":["string","null"],"description":"Clearing system identifier. `null` if not applicable."},"memberId":{"type":["string","null"],"description":"Member identifier within the clearing system. `null` if not applicable.","maxLength":35}}},"OtherId":{"type":"object","description":"Generic identifier wrapper.","properties":{"id":{"type":["string","null"],"description":"Alternative proprietary identifier. `null` if not applicable.","maxLength":35}}},"IntermediaryAgentAccount":{"type":"object","description":"Intermediary agent account identifier.","properties":{"id":{"type":"string","description":"Account identifier.","minLength":1,"maxLength":34}},"required":["id"]},"CreditorAgent":{"type":"object","description":"Creditor agent amounts for a quote.","properties":{"interbankSettlementAmount":{"$ref":"#/components/schemas/InterbankAmount","description":"Interbank settlement amount."},"chargesAmount":{"$ref":"#/components/schemas/AmountDto","description":"Destination PSP Deducted Fee."},"creditorAccountAmount":{"type":"number","description":"Net amount credited to the creditor account. When copied into an ISO 20022 XML amount the value must have at most 5 fractional digits and at most 18 total digits; serialise as a plain decimal, never in exponent form.","minimum":0}},"required":["chargesAmount","creditorAccountAmount","interbankSettlementAmount"]},"AmountDto":{"type":"object","description":"Monetary amount with currency code.","properties":{"amount":{"type":"number","description":"Monetary amount. When copied into an ISO 20022 XML amount the value must have at most 5 fractional digits and at most 18 total digits; serialise as a plain decimal, never in exponent form.","minimum":0},"currency":{"type":"string","description":"ISO-4217 currency code.","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"}},"required":["amount","currency"]},"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"]}},"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}==:$"}}}},"paths":{"/v1/quotes":{"get":{"tags":["Quotes"],"summary":"FX Quote Retrieval & Selection","description":"Source PSP retrieves FX quotes from Nexus for a given corridor and amount. Includes improved rates for PSP, improved rates for the amount, and checks Maximum Source and Destination IPS amounts for the currencies. Service used when Source PSP uses third-party FXP.\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| `quoteRequestId` | string | Required | N | format `uuid`; pattern `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`; length 36 |\n| `sourceCountry` | string | Required | N | pattern `^[A-Z]{2}$`; length 2 |\n| `sourceCurrency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `destinationCountry` | string | Required | N | pattern `^[A-Z]{2}$`; length 2 |\n| `destinationCurrency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `amountCurrency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `amount` | number | Required | N | > 0 |\n| `quotes` | array | Required | N | — |\n| `quotes[].quoteId` | string | Required | N | format `uuid`; pattern `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`; length 36 |\n| `quotes[].issuedDateTime` | string | Required | N | format `date-time`; pattern `^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$`; max length 24 |\n| `quotes[].expiryDateTime` | string | Required | N | format `date-time`; pattern `^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$`; max length 24 |\n| `quotes[].fxpFinInstIdType` | string | Required | N | one of `BICFI`, `LEI`, `otherId`; max length 10 |\n| `quotes[].fxpFinInstId` | string | Required | N | min length 1; max length 35 |\n| `quotes[].exchangeRate` | number | Required | N | > 0 |\n| `quotes[].debtorAgent` | object | Required | N | — |\n| `quotes[].debtorAgent.interbankSettlementAmount` | object | Required | N | — |\n| `quotes[].debtorAgent.interbankSettlementAmount.currency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `quotes[].debtorAgent.interbankSettlementAmount.amount` | number | Required | N | ≥ 0 |\n| `quotes[].debtorAgent.interbankSettlementAmount.cappedToMaxAmount` | boolean | Required | N | — |\n| `quotes[].intermediaryAgent1` | object | Required | N | — |\n| `quotes[].intermediaryAgent1.finInstId` | object | Required | N | — |\n| `quotes[].intermediaryAgent1.finInstId.name` | string | Required | N | min length 1; max length 140 |\n| `quotes[].intermediaryAgent1.finInstId.BICFI` | string | Conditional — present when the institution has a BIC | Y | pattern `^[A-Z]{6}[0-9A-Z]{2}([0-9A-Z]{3})?$`; max length 11 |\n| `quotes[].intermediaryAgent1.finInstId.LEI` | string | Optional | Y | pattern `^[0-9A-Z]{18}[0-9]{2}$`; max length 20 |\n| `quotes[].intermediaryAgent1.finInstId.clearingSystemMemberId` | object | Optional | N | — |\n| `quotes[].intermediaryAgent1.finInstId.clearingSystemMemberId.clearingSystemId` | string | Optional | Y | — |\n| `quotes[].intermediaryAgent1.finInstId.clearingSystemMemberId.memberId` | string | Optional | Y | max length 35 |\n| `quotes[].intermediaryAgent1.finInstId.other` | object | Optional | N | — |\n| `quotes[].intermediaryAgent1.finInstId.other.id` | string | Optional | Y | max length 35 |\n| `quotes[].intermediaryAgent1Account` | object | Required | N | — |\n| `quotes[].intermediaryAgent1Account.id` | string | Required | N | min length 1; max length 34 |\n| `quotes[].intermediaryAgent2` | object | Required | N | — |\n| `quotes[].intermediaryAgent2.finInstId` | object | Required | N | — |\n| `quotes[].intermediaryAgent2.finInstId.name` | string | Required | N | min length 1; max length 140 |\n| `quotes[].intermediaryAgent2.finInstId.BICFI` | string | Conditional — present when the institution has a BIC | Y | pattern `^[A-Z]{6}[0-9A-Z]{2}([0-9A-Z]{3})?$`; max length 11 |\n| `quotes[].intermediaryAgent2.finInstId.LEI` | string | Optional | Y | pattern `^[0-9A-Z]{18}[0-9]{2}$`; max length 20 |\n| `quotes[].intermediaryAgent2.finInstId.clearingSystemMemberId` | object | Optional | N | — |\n| `quotes[].intermediaryAgent2.finInstId.clearingSystemMemberId.clearingSystemId` | string | Optional | Y | — |\n| `quotes[].intermediaryAgent2.finInstId.clearingSystemMemberId.memberId` | string | Optional | Y | max length 35 |\n| `quotes[].intermediaryAgent2.finInstId.other` | object | Optional | N | — |\n| `quotes[].intermediaryAgent2.finInstId.other.id` | string | Optional | Y | max length 35 |\n| `quotes[].intermediaryAgent2Account` | object | Required | N | — |\n| `quotes[].intermediaryAgent2Account.id` | string | Required | N | min length 1; max length 34 |\n| `quotes[].creditorAgent` | object | Required | N | — |\n| `quotes[].creditorAgent.interbankSettlementAmount` | object | Required | N | — |\n| `quotes[].creditorAgent.interbankSettlementAmount.currency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `quotes[].creditorAgent.interbankSettlementAmount.amount` | number | Required | N | ≥ 0 |\n| `quotes[].creditorAgent.interbankSettlementAmount.cappedToMaxAmount` | boolean | Required | N | — |\n| `quotes[].creditorAgent.chargesAmount` | object | Required | N | — |\n| `quotes[].creditorAgent.chargesAmount.amount` | number | Required | N | ≥ 0 |\n| `quotes[].creditorAgent.chargesAmount.currency` | string | Required | N | pattern `^[A-Z]{3}$`; length 3 |\n| `quotes[].creditorAgent.creditorAccountAmount` | number | Required | N | ≥ 0 |\n\n**Cross-field rules**\n\n- `sourceCountry`, `sourceCurrency`, `destinationCountry`, `destinationCurrency`, `amountCurrency` and `amount` echo the request parameters.\n- `quotes` is an empty array when no FXP is eligible.\n- `quotes[].expiryDateTime` = `quotes[].issuedDateTime` + NQVT (Nexus Quote Validity Time).\n- `quotes[].fxpFinInstId` conforms to the format implied by `quotes[].fxpFinInstIdType` (e.g. BIC pattern for `BICFI`, LEI pattern for `LEI`).\n- `quotes[].exchangeRate` carries at most 8 decimal places.\n- `quotes[].debtorAgent.interbankSettlementAmount.currency` = `sourceCurrency`.\n- `quotes[].creditorAgent.interbankSettlementAmount.currency` = `quotes[].creditorAgent.chargesAmount.currency` = `destinationCurrency`.\n- `quotes[].creditorAgent.creditorAccountAmount` = `quotes[].creditorAgent.interbankSettlementAmount.amount` − `quotes[].creditorAgent.chargesAmount.amount`.\n- Monetary amounts are rounded to the currency's ISO 4217 minor units (decimal places from the currency's Nexus configuration) using `ROUND_HALF_UP`.\n\n**Response signature** — every 200 response carries `Signature-Input` and `Signature` and `Content-Digest` 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`, `BE007`, `BE008`, `AE001`, `AE002`, `AE003`, `AE005`, `AE006`, `AE004`, `BE009`, `TE099`. Gateway errors (405, 429, 502, 503, 504) carry no body.","operationId":"createQuote","parameters":[{"name":"Accept","in":"header","description":"*/*","required":true,"schema":{"type":"string","default":"*/*"}},{"$ref":"#/components/parameters/SignatureInputBodyless"},{"$ref":"#/components/parameters/Signature"},{"name":"sourceCountry","in":"query","description":"ISO-3166 alpha-2 country code of the Source Country.","required":true,"schema":{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"}},{"name":"sourceCurrency","in":"query","description":"ISO-4217 3-letter code of the Source Currency.","required":true,"schema":{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"}},{"name":"destinationCountry","in":"query","description":"ISO-3166 alpha-2 country code of the Destination Country.","required":true,"schema":{"type":"string","maxLength":2,"minLength":2,"pattern":"^[A-Z]{2}$"}},{"name":"destinationCurrency","in":"query","description":"ISO-4217 3-letter code of the Destination Currency.","required":true,"schema":{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"}},{"name":"amountCurrency","in":"query","description":"   ISO-4217 3-letter currency code of `amount`. Equals `sourceCurrency` if Sender defined `DebtorAccountAmount`,\n   or `destinationCurrency` if Sender defined `CreditorAccountAmount`.\n","required":true,"schema":{"type":"string","maxLength":3,"minLength":3,"pattern":"^[A-Z]{3}$"}},{"name":"amount","in":"query","description":"  Amount specified by Sender. If Sender chose `DebtorAccountAmount`,\n  this is `DebtorAccountAmount` minus `Source PSP Deducted Fee` (Source Currency).\n  If Sender chose `CreditorAccountAmount`, this is `CreditorAccountAmount` (Destination Currency).\n","required":true,"schema":{"type":"number","exclusiveMinimum":0}},{"name":"finInstIdType","in":"query","description":"  Type ID of the Source PSP. Used together with `finInstId` to identify the Source PSP for FXP eligibility and rate improvement lookups.\n  The originating Source IPS is resolved separately from the authenticated caller context.\n\nOne of `BICFI`, `LEI` or `otherId`.\n","required":true,"schema":{"type":"string","enum":["BICFI","LEI","otherId"]}},{"name":"finInstId","in":"query","description":"ID of the Source PSP.\n\nFormat depends on the sibling `finInstIdType` parameter: `BICFI` is 8 or 11 characters, `LEI` is 20 characters, `otherId` is free text of up to 35 characters. The per-type format is enforced as a business validation (`BE019 FI_ID_TYPE_UNSUPPORTED` / `BE020 FI_NOT_FOUND`) rather than by this schema, because it cannot be expressed as a constraint on an independent parameter.\n","required":true,"schema":{"type":"string","minLength":1,"maxLength":35}},{"name":"destFinInstIdType","in":"query","description":"  Type ID of the Destination PSP. Required when the destination country operates multiple IPSes.\n  Used to resolve which Destination IPS(s) the Destination PSP is connected to,\n  constraining eligible FXPs to those with Destination-side access on the same IPS(s).\n\nOne of `BICFI`, `LEI` or `otherId`.\n","required":false,"schema":{"type":"string","enum":["BICFI","LEI","otherId"]}},{"name":"destFinInstId","in":"query","description":"  ID of the Destination PSP. Required when the destination country operates multiple IPSes.\n  If absent in a multi-IPS destination country, Nexus rejects the request with `BE008 QUOTE_DESTINATION_PSP_REQUIRED`\n\nFormat depends on the sibling `destFinInstIdType` parameter: `BICFI` is 8 or 11 characters, `LEI` is 20 characters, `otherId` is free text of up to 35 characters. The per-type format is enforced as a business validation (`BE019 FI_ID_TYPE_UNSUPPORTED` / `BE020 FI_NOT_FOUND`) rather than by this schema, because it cannot be expressed as a constraint on an independent parameter.\n","required":false,"schema":{"type":"string","minLength":1,"maxLength":35}}],"responses":{"200":{"description":"Quote created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponse"}}},"headers":{"Signature-Input":{"$ref":"#/components/headers/ResponseSignatureInput"},"Signature":{"$ref":"#/components/headers/ResponseSignature"},"Content-Digest":{"$ref":"#/components/headers/ResponseContentDigest"}}},"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."}}}}}}
```
