{
"data": null,
"code": 403,
"message": "API key does not have the required permission",
"status": "Error",
"errors": [
{
"code": "403",
"message": "API key does not have the required permission",
"field": "API key does not have the required permission"
}
]
}
{
"code": 409,
"message": "The request conflicts with the current state of the resource",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "CONFLICT",
"message": "The request conflicts with the current state of the resource",
"field": null
}
]
}
{
"code": 503,
"message": "Credentials could not be verified right now",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "DIRECTORY_UNAVAILABLE",
"message": "Credentials could not be verified right now",
"field": null
}
]
}
Generate quote
Prices a transfer and returns a quote. The key must carry the quotes permission.
The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once.
A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction.
The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing).
Three rules the schema cannot express
Each produces a 400 that looks arbitrary without the explanation.
AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0.
RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not.
CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated.
Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones.
Picking the payout rail
The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.
{
"data": null,
"code": 403,
"message": "API key does not have the required permission",
"status": "Error",
"errors": [
{
"code": "403",
"message": "API key does not have the required permission",
"field": "API key does not have the required permission"
}
]
}
{
"code": 409,
"message": "The request conflicts with the current state of the resource",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "CONFLICT",
"message": "The request conflicts with the current state of the resource",
"field": null
}
]
}
{
"code": 503,
"message": "Credentials could not be verified right now",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "DIRECTORY_UNAVAILABLE",
"message": "Credentials could not be verified right now",
"field": null
}
]
}
depositRail must be CRYPTO for a stablecoin source, and payoutRail must be
CRYPTO for a stablecoin destination — SWIFT is rejected outright for a
crypto destination.
Stablecoin → stablecoin lifts the 100 USD minimum but keeps the maximum. The floor is a fiat-settlement rule and a crypto transfer can legitimately be smaller; the per-account-type ceiling still applies on this route exactly as it does elsewhere.
Account type
Minimum
Maximum
INDIVIDUAL
lifted on this route
100,000 USD
BUSINESS
lifted on this route
500,000 USD
Two structural ceilings also apply, because the quote row has to store the numbers. Nothing is exempt from these:
Leg
Must fit
Rejected above
Source amount
numeric(10,4)
999,999.9999
Destination amount
numeric(10,2)
99,999,999.99
On every other route the floor applies too — 100 USD for both account types, and 15,200 USD if SWIFT is on either leg, checked first. Each payout rail also carries its own published maximum; where several providers serve one rail the widest cap applies.A reverse quote is bounded by the same range. The source amount is not known when the request is validated, so the limits are enforced against the derived amount once pricing has run — which is why a reverse quote can be rejected for a source amount you never sent. A business is allowed down to 50 USD there; an individual is not.
A stablecoin → stablecoin quote has no fiat leg, so the end user needs
Sumsub KYC only. Bridge KYC applies to Bridge-routed fiat quotes; Paywho-routed
ones take the Sumsub gate too.
X-API-KEY is not read. Header names are case-insensitive, so API-KEY and
api-key are the same header — but X-API-KEY is a different name and is
ignored. If you have an integration predating the header rename, that is the
first thing to check.
There is no secret header; the key alone authenticates, and it must carry the
quotes permission.
Branch on errors[0].code, never on the message. The top-level message is "GetQuote failed!" on every rejection below — it is not the reason. The reason is errors[0].message, and the code is errors[0].code.
errors[0].code
Message
Cause
ERRCORE_1001
valid depositRail is required
Missing, or not a known enum value. Caught by @Valid before pricing.
ERRCORE_1001
valid payoutRail is required
Missing, or not a known enum value.
ERRCORE_1001
valid accountType is required - INDIVIDUAL/BUSINESS
Missing or blank.
ERRCORE_1001
source field is required
The source object is absent. Same wording for destination.
ERRCORE_1001
source.currency field is required
Currency missing or blank. Same wording for destination.currency.
One message names rails that no longer exist: For USDC/USDT source currency, depositType must be CRYPTO_WALLET or CRYPTO_MANUAL_WALLET. It fires when depositRail is not CRYPTO for a stablecoin source — send CRYPTO; the names in the message are legacy and are not valid enum values.
The partner rate before markup — see the warning below.
feeList
One entry per fee line. feeCategoryTypeEnum is the one to switch on, and the set is open.
feeTotal / feeCurrency
The sum, always in the source currency.
coupon
Only populated when a coupon applied.
gasFeeBreakdown
Estimated vs charged on-chain gas. null when the route has no on-chain leg. The charged amount is already in feeList.
source.amount × fxRate will not equal destination.amount.fxRate is the raw partner rate before markup, and the markup is charged as a fee line rather than folded into the rate. Reconcile with the amounts and feeList.
Nulls are present, not omitted, and decimal scale is preserved exactly as computed — 0.9990, not 0.999. Parse the numbers as decimals; do not assume a fixed number of places, and never compare them as strings.
The quoteId that comes back is what you pass to Submit transaction, together with the recipientId.
The API version this request targets. Required on every /api/v0/* call. Format YYYY-MM.<release>; 2026-09.1 is the latest. The version that served the request is echoed back on the response. Missing, malformed or unsupported values are rejected with 400.
The customer the quote belongs to. Must be a cus_… reference id, and must belong to your partner account. Malformed, unknown, soft-deleted or another partner's → 404 ERRREF_1001.
Estimated vs charged on-chain gas. null when the route has no on-chain leg. The charged amount is already in feeList.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Endl API","description":"Official API documentation for the Endl platform.","colors":{"primary":"#245FFE","light":"#5280FE","dark":"#013FE9"},"logo":{"light":"https://mintcdn.com/zaymentfinanceltd/vAyX8M6UjfgZPY1s/logo/endl-api-light-mode.svg?fit=max\u0026auto=format\u0026n=vAyX8M6UjfgZPY1s\u0026q=85\u0026s=317a3d2271242ccb4a73e8c8cc70884d","dark":"https://mintcdn.com/zaymentfinanceltd/vAyX8M6UjfgZPY1s/logo/endl-api-dark-mode.svg?fit=max\u0026auto=format\u0026n=vAyX8M6UjfgZPY1s\u0026q=85\u0026s=b136951611411c621ca45b782a881f95"},"favicon":"https://mintcdn.com/zaymentfinanceltd/vAyX8M6UjfgZPY1s/favicon.svg?fit=max\u0026auto=format\u0026n=vAyX8M6UjfgZPY1s\u0026q=85\u0026s=535b7fe6b8d30064c6319f5c6521341a","api":{"playground":{"proxy":false}},"footer":{"socials":{"website":"https://endl.io"}},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"zaymentfinanceltd","hasAudioNarration":false,"actualSubdomain":"zaymentfinanceltd","customDomains":["docs.endl.io"],"gitSource":{"type":"github","owner":"endl-team","repo":"endl-api-documentation-repo","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adf033c8c0a1951943f3472","collectionId":"ee77d0eb-1dd7-4637-8099-0460519d2752","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adf033c8c0a1951943f3472"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adf033c8c0a1951943f3472","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API reference","count":128},{"language":"default","tag":"Endpoints","count":123},{"language":"default","tag":"Cards","count":28},{"language":"default","tag":"POBO","count":16},{"language":"default","tag":"Webhooks","count":15},{"language":"default","tag":"Onboarding","count":14},{"language":"default","tag":"Guides","count":14},{"language":"default","tag":"Accounts","count":12},{"language":"default","tag":"Gift Cards","count":11},{"language":"default","tag":"Transactions","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#sidebar li[data-group-tag]>button{font-weight:600;background-color:rgba(100,116,139,.12);margin-bottom:2px}#sidebar li[data-group-tag]>button:hover{background-color:rgba(100,116,139,.2)}html.dark #sidebar li[data-group-tag]>button{background-color:rgba(148,163,184,.13)}html.dark #sidebar li[data-group-tag]>button:hover{background-color:rgba(148,163,184,.22)}#sidebar li[data-group-tag][data-active=true]>button{color:#013fe9;background-color:rgba(36,95,254,.16)}#sidebar li[data-group-tag][data-active=true]>button:hover{background-color:rgba(36,95,254,.22)}#sidebar li[data-group-tag][data-active=true]>button svg{color:#013fe9;opacity:1}html.dark #sidebar li[data-group-tag][data-active=true]>button{color:#5280fe;background-color:rgba(82,128,254,.22)}html.dark #sidebar li[data-group-tag][data-active=true]>button:hover{background-color:rgba(82,128,254,.3)}html.dark #sidebar li[data-group-tag][data-active=true]>button svg{color:#5280fe;opacity:1}#sidebar a[aria-current=page]{position:relative;font-weight:600;background-color:rgba(36,95,254,.16)}#sidebar a[aria-current=page]::before{content:\"\";position:absolute;left:0;top:.3rem;bottom:.3rem;width:3px;border-radius:0 2px 2px 0;background:#245ffe}html.dark #sidebar a[aria-current=page]{background-color:rgba(82,128,254,.22)}html.dark #sidebar a[aria-current=page]::before{background:#5280fe}#sidebar a[aria-current=page] span{opacity:1}body:has([role=dialog]) #search-bar-entry{visibility:hidden}body:has([role=dialog])::before{content:\"\";position:fixed;inset:0;z-index:30;background:rgba(2,6,23,.45);backdrop-filter:blur(2px);pointer-events:none}a[href*=\"utm_campaign=poweredBy\"]{display:none!important}"}],"page":{"pagePath":"api-reference/quotes/generate-quote","slug":"/api-reference/quotes/generate-quote","pageMetadata":{"title":"Generate quote","openapi":"api-reference/endl-partner-api.json POST /api/v0/quotes/{userId}/generate","description":"Prices a transfer and returns a quote. The key must carry the `quotes` permission.\n\nThe request is bound with `@Valid`, so a missing field fails **before any pricing happens** and every missing field is reported at once.\n\nA quote fixes the FX rate and fees for a short window; confirm it with [Create pre-transaction](/api-reference/transactions/create-pre-transaction).\n\n**The field table above is the whole contract — nothing else you send has any effect.** There is no `recipientId` (the recipient is attached later, on [Submit transaction](/api-reference/transactions/submit-transaction)), no `partnerId` (the quote is filed under the partner the API key authenticated as), and no `overrideGasFee` (merchant-portal only — the partner endpoints clear it before pricing).\n\n### Three rules the schema cannot express\n\nEach produces a `400` that looks arbitrary without the explanation.\n\n**AMT — supply exactly one amount.** Either `source.amount` (a forward quote) or `destination.amount` (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns *Source or Destination amount is required*; a zero or negative value returns *Source amount must be greater than 0*.\n\n**RAIL — `depositRail` is coupled to `source.currency`.** A `USDC` or `USDT` source must use `CRYPTO`; any other source currency must not.\n\n**CHAIN — `chain` is required on the stablecoin source leg.** On `source` for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated.\n\n\u003cNote>\nUnknown properties are **ignored rather than rejected**, so sending the wrong field names produces *missing field* errors rather than *unknown field* ones.\n\u003c/Note>\n\n### Picking the payout rail\n\nThe rail decides which provider serves the corridor. `VND` routes through Paywho, which requires a **bank-transfer payout rail** — sending `CRYPTO` as the `payoutRail` would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.","href":"/api-reference/quotes/generate-quote"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n a: \"a\",\n code: \"code\",\n em: \"em\",\n h3: \"h3\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n }, {Note} = _components;\n if (!Note) _missingMdxReference(\"Note\", true);\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Prices a transfer and returns a quote. The key must carry the \", _jsx(_components.code, {\n children: \"quotes\"\n }), \" permission.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The request is bound with \", _jsx(_components.code, {\n children: \"@Valid\"\n }), \", so a missing field fails \", _jsx(_components.strong, {\n children: \"before any pricing happens\"\n }), \" and every missing field is reported at once.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A quote fixes the FX rate and fees for a short window; confirm it with \", _jsx(_components.a, {\n href: \"/api-reference/transactions/create-pre-transaction\",\n children: \"Create pre-transaction\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"The field table above is the whole contract — nothing else you send has any effect.\"\n }), \" There is no \", _jsx(_components.code, {\n children: \"recipientId\"\n }), \" (the recipient is attached later, on \", _jsx(_components.a, {\n href: \"/api-reference/transactions/submit-transaction\",\n children: \"Submit transaction\"\n }), \"), no \", _jsx(_components.code, {\n children: \"partnerId\"\n }), \" (the quote is filed under the partner the API key authenticated as), and no \", _jsx(_components.code, {\n children: \"overrideGasFee\"\n }), \" (merchant-portal only — the partner endpoints clear it before pricing).\"]\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Three rules the schema cannot express\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Each produces a \", _jsx(_components.code, {\n children: \"400\"\n }), \" that looks arbitrary without the explanation.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"AMT — supply exactly one amount.\"\n }), \" Either \", _jsx(_components.code, {\n children: \"source.amount\"\n }), \" (a forward quote) or \", _jsx(_components.code, {\n children: \"destination.amount\"\n }), \" (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns \", _jsx(_components.em, {\n children: \"Source or Destination amount is required\"\n }), \"; a zero or negative value returns \", _jsx(_components.em, {\n children: \"Source amount must be greater than 0\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"RAIL — \", _jsx(_components.code, {\n children: \"depositRail\"\n }), \" is coupled to \", _jsx(_components.code, {\n children: \"source.currency\"\n }), \".\"]\n }), \" A \", _jsx(_components.code, {\n children: \"USDC\"\n }), \" or \", _jsx(_components.code, {\n children: \"USDT\"\n }), \" source must use \", _jsx(_components.code, {\n children: \"CRYPTO\"\n }), \"; any other source currency must not.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsxs(_components.strong, {\n children: [\"CHAIN — \", _jsx(_components.code, {\n children: \"chain\"\n }), \" is required on the stablecoin source leg.\"]\n }), \" On \", _jsx(_components.code, {\n children: \"source\"\n }), \" for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated.\"]\n }), \"\\n\", _jsx(Note, {\n children: _jsxs(_components.p, {\n children: [\"Unknown properties are \", _jsx(_components.strong, {\n children: \"ignored rather than rejected\"\n }), \", so sending the wrong field names produces \", _jsx(_components.em, {\n children: \"missing field\"\n }), \" errors rather than \", _jsx(_components.em, {\n children: \"unknown field\"\n }), \" ones.\"]\n })\n }), \"\\n\", _jsx(_components.h3, {\n children: \"Picking the payout rail\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The rail decides which provider serves the corridor. \", _jsx(_components.code, {\n children: \"VND\"\n }), \" routes through Paywho, which requires a \", _jsx(_components.strong, {\n children: \"bank-transfer payout rail\"\n }), \" — sending \", _jsx(_components.code, {\n children: \"CRYPTO\"\n }), \" as the \", _jsx(_components.code, {\n children: \"payoutRail\"\n }), \" would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\nfunction _missingMdxReference(id, component) {\n throw new Error(\"Expected \" + (component ? \"component\" : \"object\") + \" `\" + id + \"` to be defined: you likely forgot to import, pass, or provide it.\");\n}\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`stablecoin-→-stablecoin`,children:`Stablecoin → stablecoin`}),`\n`,_jsxs(_components.p,{children:[`A USDC / USDT / RLUSD quote on both legs. `,_jsx(_components.strong,{children:`Six fields are mandatory`}),`, and all of\nthem are rejected at the door before any pricing happens:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"depositRail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CRYPTO\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"payoutRail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CRYPTO\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"accountType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"INDIVIDUAL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"currency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1000.00\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"chain\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ethereum\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"destination\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"currency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDT\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"chain\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tron\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`depositRail`}),` must be `,_jsx(_components.code,{children:`CRYPTO`}),` for a stablecoin source, and `,_jsx(_components.code,{children:`payoutRail`}),` must be\n`,_jsx(_components.code,{children:`CRYPTO`}),` for a stablecoin destination — `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`SWIFT`}),` is rejected outright`]}),` for a\ncrypto destination.`]}),`\n`,_jsx(Heading,{level:`3`,id:`chain-support`,children:`Chain support`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`chain`}),` is optional on this route, but a pair you do send is validated against\nwhat Endl actually issues. Chain codes are matched case-insensitively.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Currency`}),_jsx(_components.th,{children:`Supported chains`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`USDT`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ethereum`}),`, `,_jsx(_components.code,{children:`tron`}),` — `,_jsx(_components.strong,{children:`only these two`}),`. `,_jsx(_components.code,{children:`polygon`}),`, `,_jsx(_components.code,{children:`base`}),`, `,_jsx(_components.code,{children:`solana`}),`, `,_jsx(_components.code,{children:`arbitrum`}),`, `,_jsx(_components.code,{children:`optimism`}),` and `,_jsx(_components.code,{children:`xrp`}),` are rejected.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`USDC`}),` / `,_jsx(_components.code,{children:`RLUSD`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ethereum`}),`, `,_jsx(_components.code,{children:`polygon`}),`, `,_jsx(_components.code,{children:`solana`}),`, `,_jsx(_components.code,{children:`base`}),`, `,_jsx(_components.code,{children:`arbitrum`}),`, `,_jsx(_components.code,{children:`optimism`}),`, `,_jsx(_components.code,{children:`xrp`}),`, `,_jsx(_components.code,{children:`tron`})]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tron carries USDT only.`}),` Any non-USDT currency on `,_jsx(_components.code,{children:`tron`}),` is rejected.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`amount-limits`,children:`Amount limits`}),`\n`,_jsxs(_components.p,{children:[`Stablecoin → stablecoin `,_jsx(_components.strong,{children:`lifts the 100 USD minimum but keeps the maximum.`}),` The floor is a fiat-settlement rule and a crypto transfer can legitimately be smaller; the per-account-type ceiling still applies on this route exactly as it does elsewhere.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Account type`}),_jsx(_components.th,{children:`Minimum`}),_jsx(_components.th,{children:`Maximum`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`INDIVIDUAL`})}),_jsx(_components.td,{children:_jsx(_components.em,{children:`lifted on this route`})}),_jsx(_components.td,{children:`100,000 USD`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`BUSINESS`})}),_jsx(_components.td,{children:_jsx(_components.em,{children:`lifted on this route`})}),_jsx(_components.td,{children:`500,000 USD`})]})]})]}),`\n`,_jsx(_components.p,{children:`Two structural ceilings also apply, because the quote row has to store the numbers. Nothing is exempt from these:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Leg`}),_jsx(_components.th,{children:`Must fit`}),_jsx(_components.th,{children:`Rejected above`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Source amount`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numeric(10,4)`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`999,999.9999`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Destination amount`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`numeric(10,2)`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`99,999,999.99`})})]})]})]}),`\n`,_jsxs(_components.p,{children:[`On every other route the floor applies too — 100 USD for both account types, and 15,200 USD if `,_jsx(_components.code,{children:`SWIFT`}),` is on either leg, checked first. Each payout rail also carries its own published maximum; where several providers serve one rail the widest cap applies.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`reverse`}),` quote is bounded by the same range. The source amount is not known when the request is validated, so the limits are enforced against the derived amount once pricing has run — which is why a reverse quote can be rejected for a source amount you never sent. A business is allowed down to 50 USD there; an individual is not.`]}),`\n`,_jsx(Heading,{level:`3`,id:`kyc-depth`,children:`KYC depth`}),`\n`,_jsxs(_components.p,{children:[`A stablecoin → stablecoin quote has `,_jsx(_components.strong,{children:`no fiat leg`}),`, so the end user needs\n`,_jsx(_components.strong,{children:`Sumsub KYC only`}),`. Bridge KYC applies to Bridge-routed fiat quotes; Paywho-routed\nones take the Sumsub gate too.`]}),`\n`,_jsx(Heading,{level:`2`,id:`authentication`,children:`Authentication`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`X-API-KEY`}),` is not read.`]}),` Header names are case-insensitive, so `,_jsx(_components.code,{children:`API-KEY`}),` and\n`,_jsx(_components.code,{children:`api-key`}),` are the same header — but `,_jsx(_components.code,{children:`X-API-KEY`}),` is a `,_jsx(_components.em,{children:`different name`}),` and is\nignored. If you have an integration predating the header rename, that is the\nfirst thing to check.`]})}),`\n`,_jsxs(_components.p,{children:[`There is no secret header; the key alone authenticates, and it must carry the\n`,_jsx(_components.code,{children:`quotes`}),` permission.`]}),`\n`,_jsx(Heading,{level:`2`,id:`error-messages-on-this-route`,children:`Error messages on this route`}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Branch on `,_jsx(_components.code,{children:`errors[0].code`}),`, never on the message.`]}),` The top-level `,_jsx(_components.code,{children:`message`}),` is `,_jsx(_components.code,{children:`\"GetQuote failed!\"`}),` on every rejection below — it is not the reason. The reason is `,_jsx(_components.code,{children:`errors[0].message`}),`, and the code is `,_jsx(_components.code,{children:`errors[0].code`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:_jsx(_components.code,{children:`errors[0].code`})}),_jsx(_components.th,{children:`Message`}),_jsx(_components.th,{children:`Cause`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERRCORE_1001`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`valid depositRail is required`})}),_jsxs(_components.td,{children:[`Missing, or not a known enum value. Caught by `,_jsx(_components.code,{children:`@Valid`}),` before pricing.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERRCORE_1001`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`valid payoutRail is required`})}),_jsx(_components.td,{children:`Missing, or not a known enum value.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERRCORE_1001`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`valid accountType is required - INDIVIDUAL/BUSINESS`})}),_jsx(_components.td,{children:`Missing or blank.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERRCORE_1001`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`source field is required`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`source`}),` object is absent. Same wording for `,_jsx(_components.code,{children:`destination`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ERRCORE_1001`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`source.currency field is required`})}),_jsxs(_components.td,{children:[`Currency missing or blank. Same wording for `,_jsx(_components.code,{children:`destination.currency`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1002`,children:_jsx(_components.code,{children:`ERRQUO_1002`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Source or Destination amount is required`})}),_jsx(_components.td,{children:`Neither leg carried an amount.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1002`,children:_jsx(_components.code,{children:`ERRQUO_1002`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Source amount must be greater than 0`})}),_jsx(_components.td,{children:`An amount was supplied but is zero or negative.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1003`,children:_jsx(_components.code,{children:`ERRQUO_1003`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Min allowed Source amount is 100`})}),_jsxs(_components.td,{children:[`Below the account-type floor. `,_jsx(_components.code,{children:`15200`}),` on a SWIFT leg.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1004`,children:_jsx(_components.code,{children:`ERRQUO_1004`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Max allowed Source amount is 100,000`})}),_jsxs(_components.td,{children:[`Above the account-type ceiling. `,_jsx(_components.code,{children:`500,000`}),` for a business.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1005`,children:_jsx(_components.code,{children:`ERRQUO_1005`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Source amount exceeds the maximum supported value of 999,999`})}),_jsx(_components.td,{children:`Larger than the quote record can hold.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1006`,children:_jsx(_components.code,{children:`ERRQUO_1006`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Max allowed amount for \u003cRAIL> payouts in X is …`})}),_jsx(_components.td,{children:`Above that rail’s published maximum.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1009`,children:_jsx(_components.code,{children:`ERRQUO_1009`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`USDT to EUR quotes are not supported…`})}),_jsxs(_components.td,{children:[`A pair we do not price. Same for `,_jsx(_components.code,{children:`USDT`}),` → `,_jsx(_components.code,{children:`GBP`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1010`,children:_jsx(_components.code,{children:`ERRQUO_1010`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`source.chain is required for USDC/T deposits`})}),_jsx(_components.td,{children:`A stablecoin source with no network named.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1011`,children:_jsx(_components.code,{children:`ERRQUO_1011`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`USDT is not supported on the base network (source.chain)`})}),_jsx(_components.td,{children:`A currency/chain pair Endl does not issue.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1011`,children:_jsx(_components.code,{children:`ERRQUO_1011`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`valid source.chain is required for USDC/T deposits`})}),_jsx(_components.td,{children:`A network we do not settle on.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1012`,children:_jsx(_components.code,{children:`ERRQUO_1012`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`\u003cRAIL> payoutRail does not apply for destinationCurrency = X, or is not enabled`})}),_jsx(_components.td,{children:`The payout rail is not published for that destination currency.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1012`,children:_jsx(_components.code,{children:`ERRQUO_1012`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`SWIFT payout rail is not supported for USDC destination…`})}),_jsx(_components.td,{children:`SWIFT settles to banks only.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1013`,children:_jsx(_components.code,{children:`ERRQUO_1013`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`CRYPTO depositRail is not supported for source currency X, or is not enabled`})}),_jsx(_components.td,{children:`The deposit rail is not active for that source currency.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1014`,children:_jsx(_components.code,{children:`ERRQUO_1014`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`SWIFT payout rail is only available for Business accounts`})}),_jsx(_components.td,{children:`SWIFT is business-only, and must also be enabled on the customer.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1008`,children:_jsx(_components.code,{children:`ERRQUO_1008`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Source currency X is not supported in your country`})}),_jsx(_components.td,{children:`Currency not enabled for the end user’s country. Same wording for the destination.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1017`,children:_jsx(_components.code,{children:`ERRQUO_1017`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Could not calculate fees…`})}),_jsx(_components.td,{children:`No fee or rate configuration covers this route and amount.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`/api-reference/error-codes#errquo_1018`,children:_jsx(_components.code,{children:`ERRQUO_1018`})})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Quote could not be generated, please try again`})}),_jsxs(_components.td,{children:[`A pricing provider failed. `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`500`}),`, and safe to retry`]}),` — no quote was created.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Every quote code is documented on `,_jsx(_components.a,{href:`/api-reference/error-codes#quote-errors`,children:`Error codes`}),`.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`One message names rails that no longer exist: `,_jsx(_components.code,{children:`For USDC/USDT source currency, depositType must be CRYPTO_WALLET or CRYPTO_MANUAL_WALLET`}),`. It fires when `,_jsx(_components.code,{children:`depositRail`}),` is not `,_jsx(_components.code,{children:`CRYPTO`}),` for a stablecoin source — `,_jsxs(_components.strong,{children:[`send `,_jsx(_components.code,{children:`CRYPTO`})]}),`; the names in the message are legacy and are not valid enum values.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`working-request`,children:`Working request`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api-sandbox.endl.io/api/v0/quotes/cus_9HqA2mT7xK4vRb1NdLpZ/generate`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Api-Key: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$ENDL_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Api-Version: 2026-09.1\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"depositRail\": \"CRYPTO\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"payoutRail\": \"CRYPTO\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"accountType\": \"INDIVIDUAL\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"source\": { \"currency\": \"USDC\", \"amount\": \"1000.00\", \"chain\": \"ethereum\" },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"destination\": { \"currency\": \"USDT\", \"chain\": \"tron\" }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`working-response`,children:`Working response`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`200`}),`, and `,_jsx(_components.strong,{children:`the body is the quote itself`}),` — there is no envelope around a success on this surface.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`53`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`53`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"partnerId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ptr_6QvK3nR8yT2mWd5XcJhP\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"depositRail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CRYPTO\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"source\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1000.00`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"amountToConvert\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`996.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"amountToConvertActual\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`996.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"currency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"chain\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"ethereum\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"destination\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`995.51`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"currency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDT\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"chain\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tron\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"quoteId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"qut_4RmP8kY2wN6tJc3VfBxQ\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"expiresOn\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-09T11:52:19.317Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"bonusAmount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"fxRate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0.9990`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeList\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PLATFORM_FEE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCategoryTypeEnum\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PLATFORM_FEE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Platform fee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeAmount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeAmountActual\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCurrency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feePercent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tax\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GAS_FEE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCategoryTypeEnum\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GAS_FEE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Gas fee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeAmount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1.00`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeAmountActual\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1.00`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCurrency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feePercent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tax\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeTotal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeTotalActual\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`3.50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCurrency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"coupon\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"gasFeeBreakdown\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"actualGasFee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1.00`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"overrideGasFee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"chargedGasFee\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1.00`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"overridden\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"feeCurrency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USDC\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`partnerId`})}),_jsxs(_components.td,{children:[`The partner the key authenticated as, as a `,_jsx(_components.code,{children:`ptr_…`}),` reference id. Whatever you sent is overwritten.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`depositRail`})}),_jsxs(_components.td,{children:[`Echoed. `,_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`payoutRail`}),` is not echoed`]}),` — the response carries no payout rail at all.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`source.amount`})}),_jsx(_components.td,{children:`As requested, normalised to two decimal places.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`source.amountToConvert`})}),_jsx(_components.td,{children:`Display only: what will actually be converted, after fees. Never use it as an input.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`destination.amount`})}),_jsx(_components.td,{children:`What the recipient receives, after fees.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`quoteId`})}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`qut_…`}),` id. The only thing `,_jsx(_components.a,{href:`/api-reference/transactions/create-pre-transaction`,children:`Create pre-transaction`}),` needs from here.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`expiresOn`})}),_jsx(_components.td,{children:`Ten minutes out.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`fxRate`})}),_jsxs(_components.td,{children:[`The partner rate `,_jsx(_components.strong,{children:`before markup`}),` — see the warning below.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`feeList`})}),_jsxs(_components.td,{children:[`One entry per fee line. `,_jsx(_components.code,{children:`feeCategoryTypeEnum`}),` is the one to switch on, and the set is open.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`feeTotal`}),` / `,_jsx(_components.code,{children:`feeCurrency`})]}),_jsx(_components.td,{children:`The sum, always in the source currency.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`coupon`})}),_jsx(_components.td,{children:`Only populated when a coupon applied.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`gasFeeBreakdown`})}),_jsxs(_components.td,{children:[`Estimated vs charged on-chain gas. `,_jsx(_components.code,{children:`null`}),` when the route has no on-chain leg. The charged amount is `,_jsx(_components.strong,{children:`already`}),` in `,_jsx(_components.code,{children:`feeList`}),`.`]})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`source.amount`}),` × `,_jsx(_components.code,{children:`fxRate`}),` will not equal `,_jsx(_components.code,{children:`destination.amount`}),`.`]}),` `,_jsx(_components.code,{children:`fxRate`}),` is the raw partner rate before markup, and the markup is charged as a fee line rather than folded into the rate. Reconcile with the amounts and `,_jsx(_components.code,{children:`feeList`}),`.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Nulls are present, not omitted`}),`, and decimal scale is preserved exactly as computed — `,_jsx(_components.code,{children:`0.9990`}),`, not `,_jsx(_components.code,{children:`0.999`}),`. Parse the numbers as decimals; do not assume a fixed number of places, and never compare them as strings.`]})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`quoteId`}),` that comes back is what you pass to `,_jsx(_components.a,{href:`/api-reference/transactions/submit-transaction`,children:`Submit transaction`}),`, together with the `,_jsx(_components.code,{children:`recipientId`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Generate quote","openapi":"api-reference/endl-partner-api.json POST /api/v0/quotes/{userId}/generate","description":"Prices a transfer and returns a quote. The key must carry the `quotes` permission.\n\nThe request is bound with `@Valid`, so a missing field fails **before any pricing happens** and every missing field is reported at once.\n\nA quote fixes the FX rate and fees for a short window; confirm it with [Create pre-transaction](/api-reference/transactions/create-pre-transaction).\n\n**The field table above is the whole contract — nothing else you send has any effect.** There is no `recipientId` (the recipient is attached later, on [Submit transaction](/api-reference/transactions/submit-transaction)), no `partnerId` (the quote is filed under the partner the API key authenticated as), and no `overrideGasFee` (merchant-portal only — the partner endpoints clear it before pricing).\n\n### Three rules the schema cannot express\n\nEach produces a `400` that looks arbitrary without the explanation.\n\n**AMT — supply exactly one amount.** Either `source.amount` (a forward quote) or `destination.amount` (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns *Source or Destination amount is required*; a zero or negative value returns *Source amount must be greater than 0*.\n\n**RAIL — `depositRail` is coupled to `source.currency`.** A `USDC` or `USDT` source must use `CRYPTO`; any other source currency must not.\n\n**CHAIN — `chain` is required on the stablecoin source leg.** On `source` for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated.\n\n\u003cNote>\nUnknown properties are **ignored rather than rejected**, so sending the wrong field names produces *missing field* errors rather than *unknown field* ones.\n\u003c/Note>\n\n### Picking the payout rail\n\nThe rail decides which provider serves the corridor. `VND` routes through Paywho, which requires a **bank-transfer payout rail** — sending `CRYPTO` as the `payoutRail` would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.","href":"/api-reference/quotes/generate-quote"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Stablecoin → stablecoin","slug":"stablecoin-→-stablecoin","depth":2,"children":[{"title":"Chain support","slug":"chain-support","depth":3,"children":[]},{"title":"Amount limits","slug":"amount-limits","depth":3,"children":[]},{"title":"KYC depth","slug":"kyc-depth","depth":3,"children":[]}]},{"title":"Authentication","slug":"authentication","depth":2,"children":[]},{"title":"Error messages on this route","slug":"error-messages-on-this-route","depth":2,"children":[]},{"title":"Working request","slug":"working-request","depth":2,"children":[]},{"title":"Working response","slug":"working-response","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/zaymentfinanceltd/d373d43d77eb6813/custom.js"],"openApiReferenceData":{"operation":{"tags":["Quotes"],"summary":"Generate quote","description":"Prices a transfer and returns a quote. The key must carry the `quotes` permission.\n\nThe request is bound with `@Valid`, so a missing field fails **before any pricing happens** and every missing field is reported at once.\n\nA quote fixes the FX rate and fees for a short window; confirm it with [Create pre-transaction](/api-reference/transactions/create-pre-transaction).\n\n**The field table above is the whole contract — nothing else you send has any effect.** There is no `recipientId` (the recipient is attached later, on [Submit transaction](/api-reference/transactions/submit-transaction)), no `partnerId` (the quote is filed under the partner the API key authenticated as), and no `overrideGasFee` (merchant-portal only — the partner endpoints clear it before pricing).\n\n### Three rules the schema cannot express\n\nEach produces a `400` that looks arbitrary without the explanation.\n\n**AMT — supply exactly one amount.** Either `source.amount` (a forward quote) or `destination.amount` (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns *Source or Destination amount is required*; a zero or negative value returns *Source amount must be greater than 0*.\n\n**RAIL — `depositRail` is coupled to `source.currency`.** A `USDC` or `USDT` source must use `CRYPTO`; any other source currency must not.\n\n**CHAIN — `chain` is required on the stablecoin source leg.** On `source` for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated.\n\n\u003cNote>\nUnknown properties are **ignored rather than rejected**, so sending the wrong field names produces *missing field* errors rather than *unknown field* ones.\n\u003c/Note>\n\n### Picking the payout rail\n\nThe rail decides which provider serves the corridor. `VND` routes through Paywho, which requires a **bank-transfer payout rail** — sending `CRYPTO` as the `payoutRail` would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.","responses":{"200":"e88c80bf-4d3c-4826-b0f1-570420fbcb67","400":"8aaa2de1-a601-4905-8a9b-9e7a07d55710","401":"e3255e19-1830-4f1b-bd33-559a8cf0456b","403":"40f0600a-cd01-473e-a95a-f6f8af5c6e5e","404":"cf580dae-baf7-4e5d-a8bf-25bacda8ecbd","409":"6dd4e928-d1c9-41c0-9562-dd7a8586c8cb","429":"0b3b95d7-a4bb-4753-9370-99492d241879","500":"ab13cca4-4cb9-438b-b80f-60ca73623c89","502":"d651c264-02cd-4356-8c24-20467044bb7b","503":"d5c8676f-4da7-448e-a94f-616bae80143e"},"parameters":["bd360710-42f3-42a2-9046-9be2ffa6c0c6","df3fdc55-ec81-40a7-95c1-15738efd2d9b"],"requestBody":"6d95227b-3378-4987-8565-b707027484ad","method":"post","type":"path","servers":["bc33a2d9-c66f-4f15-a24d-5948ed2274d0"],"security":["4a6b0ab2-c34f-4116-8278-64644557d48c"],"path":"/api/v0/quotes/{userId}/generate","baseUrlOptions":["https://api-sandbox.endl.io"],"title":"Generate quote","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","disableProxy":true},"dependencies":{"parameters":{"bd360710-42f3-42a2-9046-9be2ffa6c0c6":{"name":"Api-Version","in":"header","required":true,"description":"The API version this request targets. Required on every `/api/v0/*` call. Format `YYYY-MM.\u003crelease>`; `2026-09.1` is the latest. The version that served the request is echoed back on the response. Missing, malformed or unsupported values are rejected with `400`.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}\\.\\d+$","default":"2026-09.1","isRequired":true,"description":"The API version this request targets. Required on every `/api/v0/*` call. Format `YYYY-MM.\u003crelease>`; `2026-09.1` is the latest. The version that served the request is echoed back on the response. Missing, malformed or unsupported values are rejected with `400`.","uniqueKey":"","typeLabel":"string"},"example":"2026-09.1"},"df3fdc55-ec81-40a7-95c1-15738efd2d9b":{"name":"userId","in":"path","required":true,"description":"The customer the quote belongs to. Must be a `cus_…` reference id, and must belong to your partner account. Malformed, unknown, soft-deleted or another partner's → `404 ERRREF_1001`.","schema":{"type":"string","example":"cus_9HqA2mT7xK4vRb1NdLpZ","isRequired":true,"description":"The customer the quote belongs to. Must be a `cus_…` reference id, and must belong to your partner account. Malformed, unknown, soft-deleted or another partner's → `404 ERRREF_1001`.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["depositRail","payoutRail","accountType","source","destination"],"properties":{"depositRail":{"type":"string","enum":["CRYPTO","ACH","FEDWIRE","SEPA","SEPA_CT","SWIFT","IMPS","UPI","EFT","FPS","CHAPS","PIX","SPEI","AED_LOCAL","ENDL_ACCOUNT","TOPUP_FIAT"],"description":"How the funds arrive. Coupled to `source.currency` — see the RAIL rule.","isRequired":true,"uniqueKey":"depositRail","typeLabel":"enum\u003cstring>"},"payoutRail":{"type":"string","enum":["CRYPTO","ACH","FEDWIRE","SEPA","SEPA_CT","SWIFT","IMPS","UPI","EFT","FPS","CHAPS","PIX","SPEI","AED_LOCAL","ENDL_ACCOUNT","TOPUP_FIAT","BANK_TRANSFER","CASH_PICKUP","ALIPAY","CHINA_UNIONPAY_CARD_TRANSFERS","HUMO_UZCARD","ELCARD_TRANSFER","KORTI_MILLI_TRANSFER","BANK_CARD_TRANSFER"],"description":"How the funds leave. A superset of the deposit rails.","isRequired":true,"uniqueKey":"payoutRail","typeLabel":"enum\u003cstring>"},"accountType":{"type":"string","description":"`INDIVIDUAL` or `BUSINESS`.","enum":["INDIVIDUAL","BUSINESS"],"isRequired":true,"uniqueKey":"accountType","typeLabel":"enum\u003cstring>"},"source":{"type":"object","required":["currency"],"properties":{"currency":{"type":"string","description":"Non-blank ISO 4217 code, or a stablecoin symbol such as `USDC`.","example":"USDC","isRequired":true,"uniqueKey":"source.currency","typeLabel":"string"},"amount":{"type":"number","description":"Forward quote — the amount to send. **Mutually exclusive with `destination.amount`.**","uniqueKey":"source.amount","typeLabel":"number"},"chain":{"type":"string","description":"Required on the stablecoin source of a stablecoin → fiat quote. **Optional** for stablecoin → stablecoin — but when present the currency/chain pair is validated. Matched case-insensitively.","uniqueKey":"source.chain","typeLabel":"string"}},"isRequired":true,"uniqueKey":"source","typeLabel":"object"},"destination":{"type":"object","required":["currency"],"properties":{"currency":{"type":"string","description":"Non-blank ISO 4217 code, or a stablecoin symbol such as `USDC`.","example":"VND","isRequired":true,"uniqueKey":"destination.currency","typeLabel":"string"},"amount":{"type":"number","description":"Reverse quote — price backwards from what the recipient should receive. **Mutually exclusive with `source.amount`.**","uniqueKey":"destination.amount","typeLabel":"number"},"chain":{"type":"string","description":"Optional, and validated when present. Fiat → stablecoin is not a supported direction, so a stablecoin destination only occurs on stablecoin → stablecoin, where the chain is optional per leg.","uniqueKey":"destination.chain","typeLabel":"string"}},"isRequired":true,"uniqueKey":"destination","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"example":{"depositRail":"CRYPTO","payoutRail":"BANK_TRANSFER","accountType":"INDIVIDUAL","source":{"currency":"USDC","amount":100,"chain":"ethereum"},"destination":{"currency":"VND"}},"examples":{"Example":{"title":"Example","value":{"depositRail":"CRYPTO","payoutRail":"BANK_TRANSFER","accountType":"INDIVIDUAL","source":{"currency":"USDC","amount":100,"chain":"ethereum"},"destination":{"currency":"VND"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"e88c80bf-4d3c-4826-b0f1-570420fbcb67":{"description":"The quote. **Unwrapped** — the body is the quote object itself, with no `{ data, code, message, status }` envelope.","content":{"application/json":{"example":{"partnerId":"ptr_6QvK3nR8yT2mWd5XcJhP","depositRail":"CRYPTO","source":{"amount":1000,"amountToConvert":996.5,"amountToConvertActual":996.5,"currency":"USDC","chain":"ethereum"},"destination":{"amount":995.51,"currency":"USDT","chain":"tron"},"quoteId":"qut_4RmP8kY2wN6tJc3VfBxQ","expiresOn":"2026-10-09T11:52:19.317Z","bonusAmount":null,"fxRate":0.999,"feeList":[{"feeType":"PLATFORM_FEE","feeCategoryTypeEnum":"PLATFORM_FEE","feeName":"Platform fee","feeAmount":2.5,"feeAmountActual":2.5,"feeCurrency":"USDC","feePercent":null,"tax":false},{"feeType":"GAS_FEE","feeCategoryTypeEnum":"GAS_FEE","feeName":"Gas fee","feeAmount":1,"feeAmountActual":1,"feeCurrency":"USDC","feePercent":null,"tax":false}],"feeTotal":3.5,"feeTotalActual":3.5,"feeCurrency":"USDC","coupon":null,"gasFeeBreakdown":{"actualGasFee":1,"overrideGasFee":null,"chargedGasFee":1,"overridden":false,"feeCurrency":"USDC"}},"schema":{"type":"object","properties":{"quoteId":{"type":"string","description":"The quote reference id — `qut_…`. Pass it to [Create pre-transaction](/api-reference/transactions/create-pre-transaction).","uniqueKey":"quoteId","typeLabel":"string"},"partnerId":{"type":"string","description":"The partner the key authenticated as, as a `ptr_…` reference id. Whatever you sent is overwritten.","uniqueKey":"partnerId","typeLabel":"string"},"depositRail":{"type":"string","description":"Echoed. `payoutRail` is **not** echoed — the response carries no payout rail at all.","uniqueKey":"depositRail","typeLabel":"string"},"source":{"type":"object","properties":{"amount":{"type":"number","description":"As requested, normalised to two decimal places.","uniqueKey":"source.amount","typeLabel":"number"},"amountToConvert":{"type":"number","description":"Display only: what will actually be converted, after fees. Never use it as an input.","uniqueKey":"source.amountToConvert","typeLabel":"number"},"amountToConvertActual":{"type":"number","description":"The settled figure.","uniqueKey":"source.amountToConvertActual","typeLabel":"number"},"currency":{"type":"string","description":"ISO 4217, or a stablecoin symbol.","uniqueKey":"source.currency","typeLabel":"string"},"chain":{"oneOf":[{"type":"string","description":"Settlement chain.","uniqueKey":"source.chain.oneOf.0","typeLabel":"string"},{"type":"null","description":"Settlement chain.","uniqueKey":"source.chain.oneOf.1","typeLabel":"null"}],"uniqueKey":"source.chain","typeLabel":"string | null"}},"uniqueKey":"source","typeLabel":"object"},"destination":{"type":"object","properties":{"amount":{"type":"number","description":"What the recipient receives.","uniqueKey":"destination.amount","typeLabel":"number"},"currency":{"type":"string","description":"ISO 4217.","uniqueKey":"destination.currency","typeLabel":"string"},"chain":{"oneOf":[{"type":"string","description":"`null` for a fiat destination.","uniqueKey":"destination.chain.oneOf.0","typeLabel":"string"},{"type":"null","description":"`null` for a fiat destination.","uniqueKey":"destination.chain.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination.chain","typeLabel":"string | null"}},"uniqueKey":"destination","typeLabel":"object"},"expiresOn":{"type":"string","description":"Ten minutes after generation. Expiry is enforced when the quote is used, on Create pre-transaction.","uniqueKey":"expiresOn","typeLabel":"string"},"fxRate":{"type":"number","description":"The partner rate **before markup**. The markup is charged as a fee line, so `source.amount × fxRate` will not reproduce `destination.amount`.","uniqueKey":"fxRate","typeLabel":"number"},"feeList":{"type":"array","description":"One entry per fee line. `feeCategoryTypeEnum` is the one to switch on, and the set is open.","items":{"type":"object","properties":{"feeType":{"type":"string","uniqueKey":"feeList.items.[INDEX].feeType","typeLabel":"string"},"feeCategoryTypeEnum":{"type":"string","description":"`EXCHANGE_FEE`, `EXCHANGE_MARKUP_FEE`, `OUTGOING_PROCESSING_FEE`, `GAS_FEE`, `PLATFORM_FEE`, `PARTNER_FEE`, `TDS_FEE` and others. Treat the set as open.","uniqueKey":"feeList.items.[INDEX].feeCategoryTypeEnum","typeLabel":"string"},"feeName":{"type":"string","uniqueKey":"feeList.items.[INDEX].feeName","typeLabel":"string"},"feeAmount":{"type":"number","uniqueKey":"feeList.items.[INDEX].feeAmount","typeLabel":"number"},"feeAmountActual":{"type":"number","uniqueKey":"feeList.items.[INDEX].feeAmountActual","typeLabel":"number"},"feeCurrency":{"type":"string","uniqueKey":"feeList.items.[INDEX].feeCurrency","typeLabel":"string"},"feePercent":{"oneOf":[{"type":"number","uniqueKey":"feeList.items.[INDEX].feePercent.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"feeList.items.[INDEX].feePercent.oneOf.1","typeLabel":"null"}],"uniqueKey":"feeList.items.[INDEX].feePercent","typeLabel":"number | null"},"tax":{"type":"boolean","uniqueKey":"feeList.items.[INDEX].tax","typeLabel":"boolean"}},"uniqueKey":"feeList.items.[INDEX]","typeLabel":"object"},"uniqueKey":"feeList","typeLabel":"object[]"},"feeTotal":{"type":"number","description":"Sum of `feeList`.","uniqueKey":"feeTotal","typeLabel":"number"},"feeTotalActual":{"type":"number","description":"The settled fee total.","uniqueKey":"feeTotalActual","typeLabel":"number"},"feeCurrency":{"type":"string","description":"Always the **source** currency.","uniqueKey":"feeCurrency","typeLabel":"string"},"bonusAmount":{"oneOf":[{"type":"number","description":"`null` when none applies.","uniqueKey":"bonusAmount.oneOf.0","typeLabel":"number"},{"type":"null","description":"`null` when none applies.","uniqueKey":"bonusAmount.oneOf.1","typeLabel":"null"}],"uniqueKey":"bonusAmount","typeLabel":"number | null"},"coupon":{"oneOf":[{"type":["object","null"],"description":"Only populated when a coupon applied. `null` otherwise.","uniqueKey":"coupon.oneOf.0","typeLabel":"object"},{"type":"null","description":"Only populated when a coupon applied. `null` otherwise.","uniqueKey":"coupon.oneOf.1","typeLabel":"null"}],"uniqueKey":"coupon","typeLabel":"object | null"},"gasFeeBreakdown":{"oneOf":[{"type":"object","description":"Estimated vs charged on-chain gas. `null` when the route has no on-chain leg. The charged amount is already in `feeList`.","properties":{"actualGasFee":{"type":"number","uniqueKey":"gasFeeBreakdown.oneOf.0.actualGasFee","typeLabel":"number"},"overrideGasFee":{"oneOf":[{"type":"number","uniqueKey":"gasFeeBreakdown.oneOf.0.overrideGasFee.oneOf.0","typeLabel":"number"},{"type":"null","uniqueKey":"gasFeeBreakdown.oneOf.0.overrideGasFee.oneOf.1","typeLabel":"null"}],"uniqueKey":"gasFeeBreakdown.oneOf.0.overrideGasFee","typeLabel":"number | null"},"chargedGasFee":{"type":"number","uniqueKey":"gasFeeBreakdown.oneOf.0.chargedGasFee","typeLabel":"number"},"overridden":{"type":"boolean","uniqueKey":"gasFeeBreakdown.oneOf.0.overridden","typeLabel":"boolean"},"feeCurrency":{"type":"string","uniqueKey":"gasFeeBreakdown.oneOf.0.feeCurrency","typeLabel":"string"}},"uniqueKey":"gasFeeBreakdown.oneOf.0","typeLabel":"object"},{"type":"null","description":"Estimated vs charged on-chain gas. `null` when the route has no on-chain leg. The charged amount is already in `feeList`.","properties":{"actualGasFee":{"type":"number"},"overrideGasFee":{"oneOf":[{"type":"number"},{"type":"null"}]},"chargedGasFee":{"type":"number"},"overridden":{"type":"boolean"},"feeCurrency":{"type":"string"}},"uniqueKey":"gasFeeBreakdown.oneOf.1","typeLabel":"null"}],"uniqueKey":"gasFeeBreakdown","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"partnerId":"ptr_6QvK3nR8yT2mWd5XcJhP","depositRail":"CRYPTO","source":{"amount":1000,"amountToConvert":996.5,"amountToConvertActual":996.5,"currency":"USDC","chain":"ethereum"},"destination":{"amount":995.51,"currency":"USDT","chain":"tron"},"quoteId":"qut_4RmP8kY2wN6tJc3VfBxQ","expiresOn":"2026-10-09T11:52:19.317Z","bonusAmount":null,"fxRate":0.999,"feeList":[{"feeType":"PLATFORM_FEE","feeCategoryTypeEnum":"PLATFORM_FEE","feeName":"Platform fee","feeAmount":2.5,"feeAmountActual":2.5,"feeCurrency":"USDC","feePercent":null,"tax":false},{"feeType":"GAS_FEE","feeCategoryTypeEnum":"GAS_FEE","feeName":"Gas fee","feeAmount":1,"feeAmountActual":1,"feeCurrency":"USDC","feePercent":null,"tax":false}],"feeTotal":3.5,"feeTotalActual":3.5,"feeCurrency":"USDC","coupon":null,"gasFeeBreakdown":{"actualGasFee":1,"overrideGasFee":null,"chargedGasFee":1,"overridden":false,"feeCurrency":"USDC"}}}},"exampleType":"examples"}},"exampleType":"examples"},"8aaa2de1-a601-4905-8a9b-9e7a07d55710":{"description":"Two shapes, from two layers. **Bean validation** (`@Valid`) returns the envelope with `message: \"Validation Failed\"` and one `errors[]` entry per failed field — all missing fields at once. **Business rules** use the same envelope with `message: \"GetQuote failed!\"` the reason in `errors[0].message` and an `ERRQUO_` code in `errors[0].code`. The **`Api-Version` check** runs before the body is parsed, so it returns a flat object instead.","content":{"application/json":{"example":{"data":{},"code":400,"status":"Error","message":"Validation Failed","errors":[{"code":"400","message":"valid payoutRail is required","field":"valid payoutRail is required"},{"code":"400","message":"valid accountType is required - INDIVIDUAL/BUSINESS","field":"valid accountType is required - INDIVIDUAL/BUSINESS"}]},"examples":{"Example":{"title":"Example","value":{"data":{},"code":400,"status":"Error","message":"Validation Failed","errors":[{"code":"400","message":"valid payoutRail is required","field":"valid payoutRail is required"},{"code":"400","message":"valid accountType is required - INDIVIDUAL/BUSINESS","field":"valid accountType is required - INDIVIDUAL/BUSINESS"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"e3255e19-1830-4f1b-bd33-559a8cf0456b":{"description":"Missing or invalid API credentials.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":null,"code":401,"message":"Authentication Failed!","status":"Error","errors":[{"code":"401","message":"Authentication Failed!","field":"Authentication Failed!"}]},"examples":{"Example":{"title":"Example","value":{"data":null,"code":401,"message":"Authentication Failed!","status":"Error","errors":[{"code":"401","message":"Authentication Failed!","field":"Authentication Failed!"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"40f0600a-cd01-473e-a95a-f6f8af5c6e5e":{"description":"A valid key that lacks the permission this endpoint requires. Raised at the edge.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":null,"code":403,"message":"API key does not have the required permission","status":"Error","errors":[{"code":"403","message":"API key does not have the required permission","field":"API key does not have the required permission"}]},"examples":{"Example":{"title":"Example","value":{"data":null,"code":403,"message":"API key does not have the required permission","status":"Error","errors":[{"code":"403","message":"API key does not have the required permission","field":"API key does not have the required permission"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"cf580dae-baf7-4e5d-a8bf-25bacda8ecbd":{"description":"No such resource, or it belongs to another partner.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"code":404,"message":"Resource not found","status":"ERROR","data":null,"errors":[{"code":"NOT_FOUND","message":"Resource not found","field":null}]},"examples":{"Example":{"title":"Example","value":{"code":404,"message":"Resource not found","status":"ERROR","data":null,"errors":[{"code":"NOT_FOUND","message":"Resource not found","field":null}]}}},"exampleType":"examples"}},"exampleType":"examples"},"6dd4e928-d1c9-41c0-9562-dd7a8586c8cb":{"description":"The request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"code":409,"message":"The request conflicts with the current state of the resource","status":"ERROR","data":null,"errors":[{"code":"CONFLICT","message":"The request conflicts with the current state of the resource","field":null}]},"examples":{"Example":{"title":"Example","value":{"code":409,"message":"The request conflicts with the current state of the resource","status":"ERROR","data":null,"errors":[{"code":"CONFLICT","message":"The request conflicts with the current state of the resource","field":null}]}}},"exampleType":"examples"}},"exampleType":"examples"},"0b3b95d7-a4bb-4753-9370-99492d241879":{"description":"The per-API-key request rate limit was exceeded. Carries `X-RateLimit-Limit` and `X-RateLimit-Remaining`.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":null,"code":429,"message":"Rate limit exceeded, please retry later","status":"Error","errors":[{"code":"429","message":"Rate limit exceeded, please retry later","field":"Rate limit exceeded, please retry later"}]},"examples":{"Example":{"title":"Example","value":{"data":null,"code":429,"message":"Rate limit exceeded, please retry later","status":"Error","errors":[{"code":"429","message":"Rate limit exceeded, please retry later","field":"Rate limit exceeded, please retry later"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"ab13cca4-4cb9-438b-b80f-60ca73623c89":{"description":"Unexpected server error.","content":{"application/json":{"example":{"errors":[{"code":"500","message":"An unexpected error occurred, you may try again later"}]},"examples":{"Example":{"title":"Example","value":{"errors":[{"code":"500","message":"An unexpected error occurred, you may try again later"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"d651c264-02cd-4356-8c24-20467044bb7b":{"description":"Endl could not reach the service behind the edge. Retry with backoff.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"data":null,"code":502,"message":"Upstream service error","status":"Error","errors":null},"examples":{"Example":{"title":"Example","value":{"data":null,"code":502,"message":"Upstream service error","status":"Error","errors":null}}},"exampleType":"examples"}},"exampleType":"examples"},"d5c8676f-4da7-448e-a94f-616bae80143e":{"description":"Credentials could not be verified right now. Retry with backoff.","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","example":400,"description":"The HTTP status, repeated in the body.","uniqueKey":"code","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","description":"A human-readable summary of the failure.","uniqueKey":"message","typeLabel":"string"},"status":{"type":"string","example":"ERROR","description":"`ERROR` on failure; `SUCCESS` on the equivalent success envelope.","uniqueKey":"status","typeLabel":"string"},"data":{"oneOf":[{"type":"object","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.0","typeLabel":"object"},{"type":"null","example":null,"description":"`null` on failure — no payload is returned when a request fails.","uniqueKey":"data.oneOf.1","typeLabel":"null"}],"uniqueKey":"data","typeLabel":"object | null"},"errors":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","example":"ERRACC_1009","description":"Stable machine-readable error code, `ERR\u003cMODULE>_\u003cnnnn>`. Match on this, never on `message`. See the [error catalogue](/api-reference/error-codes).","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","example":"must not be blank","description":"What is wrong with this specific field.","uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"field":{"type":"string","example":"sourceAmount","description":"Which request field the problem refers to, or `null` when the error is not about a specific input.","uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"description":"One entry per field that failed validation. Empty for failures that are not field-level.","uniqueKey":"errors","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"example":{"code":503,"message":"Credentials could not be verified right now","status":"ERROR","data":null,"errors":[{"code":"DIRECTORY_UNAVAILABLE","message":"Credentials could not be verified right now","field":null}]},"examples":{"Example":{"title":"Example","value":{"code":503,"message":"Credentials could not be verified right now","status":"ERROR","data":null,"errors":[{"code":"DIRECTORY_UNAVAILABLE","message":"Credentials could not be verified right now","field":null}]}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"4a6b0ab2-c34f-4116-8278-64644557d48c":{"apiKey":{"type":"apiKey","in":"header","name":"API-KEY","description":"Your partner API key.","scopes":[],"schemeName":"apiKey"}}},"servers":{"bc33a2d9-c66f-4f15-a24d-5948ed2274d0":{"url":"https://api-sandbox.endl.io","description":"Sandbox"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"API-KEY","description":"Your partner API key.","scopes":[],"schemeName":"apiKey"},"schema":{"title":"API-KEY","type":"string","description":"Your partner API key.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"API-KEY"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/endl-partner-api.json"},"subdomain":"zaymentfinanceltd","siteName":"Endl API","title":"Generate quote - Endl API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T11:27:29.988Z","originalFileLocation":"api-reference/quotes/generate-quote.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Prices a transfer and returns a quote. The key must carry the quotes permission. The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once. A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction. The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing). ### Three rules the schema cannot express Each produces a 400 that looks arbitrary without the explanation. AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0. RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not. CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated. Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones. ### Picking the payout rail The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Endl API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Generate quote - Endl API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Prices a transfer and returns a quote. The key must carry the quotes permission. The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once. A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction. The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing). ### Three rules the schema cannot express Each produces a 400 that looks arbitrary without the explanation. AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0. RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not. CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated. Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones. ### Picking the payout rail The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Endl API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.endl.io/api-reference/quotes/generate-quote\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://zaymentfinanceltd.mintlify.app/_mintlify/api/og/v2?division=Quotes\u0026amp;title=Generate+quote\u0026amp;description=Prices+a+transfer+and+returns+a+quote.+The+key+must+carry+the+%60quotes%60+permission.%0A%0AThe+request+is+bound+with+%60%40Valid%60%2C+so+a+missing+field+fails+**before+any+pr\u0026amp;theme=668efa5ed0467f58a90d23e2\u0026amp;signature=acbe38d4a026c35ddf83d69c021410cd3a6f5e71c0a706757ac165c922187d44\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Generate quote - Endl API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Prices a transfer and returns a quote. The key must carry the quotes permission. The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once. A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction. The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing). ### Three rules the schema cannot express Each produces a 400 that looks arbitrary without the explanation. AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0. RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not. CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated. Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones. ### Picking the payout rail The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://zaymentfinanceltd.mintlify.app/_mintlify/api/og/v2?division=Quotes\u0026amp;title=Generate+quote\u0026amp;description=Prices+a+transfer+and+returns+a+quote.+The+key+must+carry+the+%60quotes%60+permission.%0A%0AThe+request+is+bound+with+%60%40Valid%60%2C+so+a+missing+field+fails+**before+any+pr\u0026amp;theme=668efa5ed0467f58a90d23e2\u0026amp;signature=acbe38d4a026c35ddf83d69c021410cd3a6f5e71c0a706757ac165c922187d44\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/zaymentfinanceltd/V4tezyHprXdvGDz0/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Endl API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#245FFE\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.endl.io/api-reference/quotes/generate-quote\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/quotes/generate-quote.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.endl.io/#organization\",\"name\":\"Endl API\",\"url\":\"https://docs.endl.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/zaymentfinanceltd/vAyX8M6UjfgZPY1s/logo/endl-api-light-mode.svg?fit=max\u0026auto=format\u0026n=vAyX8M6UjfgZPY1s\u0026q=85\u0026s=317a3d2271242ccb4a73e8c8cc70884d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.endl.io#website\",\"name\":\"Endl API\",\"url\":\"https://docs.endl.io\",\"publisher\":{\"@id\":\"https://docs.endl.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.endl.io/api-reference/quotes/generate-quote#webpage\",\"url\":\"https://docs.endl.io/api-reference/quotes/generate-quote\",\"name\":\"Generate quote\",\"description\":\"Prices a transfer and returns a quote. The key must carry the quotes permission. The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once. A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction. The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing). ### Three rules the schema cannot express Each produces a 400 that looks arbitrary without the explanation. AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0. RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not. CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated. Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones. ### Picking the payout rail The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\",\"dateModified\":\"2026-10-15T11:27:29.988Z\",\"isPartOf\":{\"@id\":\"https://docs.endl.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.endl.io/api-reference/quotes/generate-quote#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.endl.io/api-reference/quotes/generate-quote#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.endl.io/api-reference/onboarding/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generate quote\",\"item\":\"https://docs.endl.io/api-reference/quotes/generate-quote\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.endl.io/api-reference/quotes/generate-quote#apireference\",\"headline\":\"Generate quote\",\"name\":\"Generate quote\",\"description\":\"Prices a transfer and returns a quote. The key must carry the quotes permission. The request is bound with @Valid, so a missing field fails before any pricing happens and every missing field is reported at once. A quote fixes the FX rate and fees for a short window; confirm it with Create pre-transaction. The field table above is the whole contract — nothing else you send has any effect. There is no recipientId (the recipient is attached later, on Submit transaction), no partnerId (the quote is filed under the partner the API key authenticated as), and no overrideGasFee (merchant-portal only — the partner endpoints clear it before pricing). ### Three rules the schema cannot express Each produces a 400 that looks arbitrary without the explanation. AMT — supply exactly one amount. Either source.amount (a forward quote) or destination.amount (a reverse quote, priced backwards from what the recipient should receive), never both. Neither returns Source or Destination amount is required; a zero or negative value returns Source amount must be greater than 0. RAIL — depositRail is coupled to source.currency. A USDC or USDT source must use CRYPTO; any other source currency must not. CHAIN — chain is required on the stablecoin source leg. On source for a stablecoin → fiat quote. On stablecoin → stablecoin it is optional per leg, but a chain you do send is validated. Unknown properties are ignored rather than rejected, so sending the wrong field names produces missing field errors rather than unknown field ones. ### Picking the payout rail The rail decides which provider serves the corridor. VND routes through Paywho, which requires a bank-transfer payout rail — sending CRYPTO as the payoutRail would silently route elsewhere rather than fail, so the quote you get back would not be the one you meant to price.\",\"url\":\"https://docs.endl.io/api-reference/quotes/generate-quote\",\"mainEntityOfPage\":{\"@id\":\"https://docs.endl.io/api-reference/quotes/generate-quote#webpage\"},\"dateModified\":\"2026-10-15T11:27:29.988Z\",\"publisher\":{\"@id\":\"https://docs.endl.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.endl.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Endl API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Endl API","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"Introduction","pages":[{"title":"API reference overview","href":"/api-reference/introduction"},{"title":"Authentication","href":"/api-reference/authentication"},{"title":"Versioning","href":"/api-reference/versioning"},{"title":"Errors and the response envelope","href":"/api-reference/errors"},{"title":"Error codes","href":"/api-reference/error-codes"}]},{"group":"Endpoints","pages":[{"group":"Onboarding","expanded":true,"pages":[{"title":"Onboarding overview","href":"/api-reference/onboarding/introduction"},{"title":"Errors and lifecycle","href":"/api-reference/onboarding/errors"},{"title":"Individual (KYC)","href":"/api-reference/onboarding/individual-kyc"},{"title":"Business (KYB)","href":"/api-reference/onboarding/business-kyb"},{"title":"Create customer","openapi":"api-reference/endl-onboarding-api.json POST /api/v0/customer","href":"/api-reference/onboarding/create-customer"},{"title":"Get customer","openapi":"api-reference/endl-onboarding-api.json GET /api/v0/customer/{userId}","href":"/api-reference/onboarding/get-customer"},{"title":"Update customer","openapi":"api-reference/endl-onboarding-api.json PUT /api/v0/customer/{userId}","href":"/api-reference/onboarding/update-customer"},{"title":"List customers","openapi":"api-reference/endl-onboarding-api.json GET /api/v0/customer","href":"/api-reference/onboarding/list-customers"},{"title":"Delete customer","openapi":"api-reference/endl-onboarding-api.json DELETE /api/v0/customer/{userId}","href":"/api-reference/onboarding/delete-customer"},{"title":"Generate KYC link","openapi":"api-reference/endl-onboarding-api.json POST /api/v0/customer/{userId}/kyc-link","href":"/api-reference/onboarding/generate-kyc-link"},{"title":"Upload document","openapi":"api-reference/endl-onboarding-api.json POST /api/v0/customer/{userId}/documents","href":"/api-reference/onboarding/upload-document"},{"title":"Upload owner document","openapi":"api-reference/endl-onboarding-api.json POST /api/v0/customer/{userId}/ubo/{uboRef}/documents","href":"/api-reference/onboarding/upload-ubo-document"},{"title":"Questionnaire reference","href":"/api-reference/onboarding/questionnaires"},{"title":"Country restrictions","href":"/api-reference/onboarding/country-restrictions"}]},{"group":"Reference data","expanded":true,"pages":[{"title":"List currencies","openapi":"api-reference/endl-partner-api.json GET /api/v0/currencies","href":"/api-reference/reference/list-currencies"},{"title":"List countries","openapi":"api-reference/endl-partner-api.json GET /api/v0/countries","href":"/api-reference/reference/list-countries"},{"title":"List occupations","openapi":"api-reference/endl-partner-api.json GET /api/v0/occupations","href":"/api-reference/reference/list-occupations"},{"title":"List rails","openapi":"api-reference/endl-partner-api.json GET /api/v0/rails","href":"/api-reference/reference/list-rails"},{"title":"Get recipient fields","openapi":"api-reference/endl-partner-api.json GET /api/v0/recipient-fields","href":"/api-reference/reference/get-recipient-fields"},{"title":"Get sender fields","openapi":"api-reference/endl-partner-api.json GET /api/v0/sender-fields","href":"/api-reference/reference/get-sender-fields"}]},{"group":"Wallets","expanded":true,"pages":[{"title":"List wallets","openapi":"api-reference/endl-partner-api.json GET /api/v0/wallets/{userId}","href":"/api-reference/wallets/list-wallets"},{"title":"Create wallet","openapi":"api-reference/endl-partner-api.json POST /api/v0/wallets/{userId}","href":"/api-reference/wallets/create-wallet"},{"title":"Get wallet","openapi":"api-reference/endl-partner-api.json GET /api/v0/wallets/{userId}/{walletId}","href":"/api-reference/wallets/get-wallet"},{"title":"Get wallet balance","openapi":"api-reference/endl-partner-api.json GET /api/v0/wallets/{userId}/{walletId}/balance","href":"/api-reference/wallets/get-wallet-balance"},{"title":"Update wallet","openapi":"api-reference/endl-partner-api.json PATCH /api/v0/wallets/{userId}/{walletId}","href":"/api-reference/wallets/update-wallet"},{"title":"Delete wallet","openapi":"api-reference/endl-partner-api.json DELETE /api/v0/wallets/{userId}/{walletId}","href":"/api-reference/wallets/delete-wallet"}]},{"group":"Accounts","expanded":true,"pages":[{"title":"Accounts API","href":"/api-reference/accounts/introduction"},{"title":"Account statuses","href":"/api-reference/accounts/statuses"},{"title":"Open account","openapi":"api-reference/endl-partner-api.json POST /api/v0/accounts/{userId}","href":"/api-reference/accounts/open-account"},{"title":"List accounts","openapi":"api-reference/endl-partner-api.json GET /api/v0/accounts/{userId}","href":"/api-reference/accounts/list-accounts"},{"title":"List currencies available for opening","openapi":"api-reference/endl-partner-api.json GET /api/v0/accounts/{userId}/available-for-opening","href":"/api-reference/accounts/list-accounts-available-for-opening"},{"title":"Get account","openapi":"api-reference/endl-partner-api.json GET /api/v0/accounts/{userId}/{accountId}","href":"/api-reference/accounts/get-account"},{"title":"Get account balance","openapi":"api-reference/endl-partner-api.json GET /api/v0/accounts/{userId}/{accountId}/balance","href":"/api-reference/accounts/get-account-balance"},{"title":"Get account activity","openapi":"api-reference/endl-partner-api.json GET /api/v0/accounts/{userId}/{accountId}/activity","href":"/api-reference/accounts/get-account-activity"},{"title":"Activate account","openapi":"api-reference/endl-partner-api.json PATCH /api/v0/accounts/{userId}/{accountId}/activate","href":"/api-reference/accounts/activate-account"},{"title":"Deactivate account","openapi":"api-reference/endl-partner-api.json PATCH /api/v0/accounts/{userId}/{accountId}/deactivate","href":"/api-reference/accounts/deactivate-account"},{"title":"Response by currency","href":"/api-reference/accounts/response-by-currency"},{"title":"Accounts errors","description":"Every error the accounts endpoints raise, what causes it, and whether to retry","href":"/api-reference/accounts/errors"}]},{"group":"Quotes","expanded":true,"pages":[{"title":"Generate quote","openapi":"api-reference/endl-partner-api.json POST /api/v0/quotes/{userId}/generate","href":"/api-reference/quotes/generate-quote"},{"title":"Get quote","openapi":"api-reference/endl-partner-api.json GET /api/v0/quotes/{userId}/{quoteId}","description":"Reads a quote back by its `qut_…` id. The key must carry the `quotes` permission, and the quote must belong to the customer in the path.","href":"/api-reference/quotes/get-quote"}]},{"group":"Recipients","expanded":true,"pages":[{"title":"Add recipient","openapi":"api-reference/endl-partner-api.json POST /api/v0/recipients/{userId}","href":"/api-reference/recipients/add-recipient"},{"title":"List recipients","openapi":"api-reference/endl-partner-api.json POST /api/v0/recipients/{userId}/all","href":"/api-reference/recipients/list-recipients"},{"title":"Get recipient","openapi":"api-reference/endl-partner-api.json GET /api/v0/recipients/{userId}/{recipientId}","href":"/api-reference/recipients/get-recipient"},{"title":"Delete recipient","openapi":"api-reference/endl-partner-api.json DELETE /api/v0/recipients/{userId}/{recipientId}","href":"/api-reference/recipients/delete-recipient"},{"title":"List supported rails","openapi":"api-reference/endl-partner-api.json GET /api/v0/recipients/{userId}/supported-rails","href":"/api-reference/recipients/list-supported-rails"},{"title":"Get counterparty checks","openapi":"api-reference/endl-partner-api.json GET /api/v0/recipients/{userId}/{recipientId}/counterparty-checks","href":"/api-reference/recipients/get-counterparty-checks"}]},{"group":"Transactions","expanded":true,"pages":[{"title":"Create pre-transaction","openapi":"api-reference/endl-partner-api.json POST /api/v0/transactions/{userId}/pre-txn","href":"/api-reference/transactions/create-pre-transaction"},{"title":"Submit transaction","openapi":"api-reference/endl-partner-api.json POST /api/v0/transactions/{userId}/submit","href":"/api-reference/transactions/submit-transaction"},{"title":"Get transaction","openapi":"api-reference/endl-partner-api.json GET /api/v0/transactions/{userId}/{txnId}","href":"/api-reference/transactions/get-transaction"},{"title":"List transactions","openapi":"api-reference/endl-partner-api.json POST /api/v0/transactions/{userId}/all","href":"/api-reference/transactions/list-transactions"},{"title":"Get transaction metadata","openapi":"api-reference/endl-partner-api.json GET /api/v0/transactions/{userId}/metadata","href":"/api-reference/transactions/get-transaction-metadata"},{"title":"List purpose codes","openapi":"api-reference/endl-partner-api.json GET /api/v0/transactions/purpose-codes","href":"/api-reference/transactions/list-purpose-codes"},{"title":"Upload invoice","openapi":"api-reference/endl-partner-api.json POST /api/v0/transactions/{userId}/invoice-upload","href":"/api-reference/transactions/upload-invoice"}]},{"group":"Cards","expanded":true,"pages":[{"title":"Cards overview","href":"/api-reference/cards/introduction"},{"title":"Enrol a customer","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/enrollment","href":"/api-reference/cards/enroll-customer"},{"title":"Get enrolment","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/enrollment","href":"/api-reference/cards/get-enrollment"},{"title":"Add a cardholder","openapi":"api-reference/endl-cards-api.json POST /api/v0/customer/{businessId}/card-users","href":"/api-reference/cards/create-cardholder"},{"title":"List cardholders","openapi":"api-reference/endl-cards-api.json GET /api/v0/customer/{businessId}/card-users","href":"/api-reference/cards/list-cardholders"},{"title":"Get a cardholder","openapi":"api-reference/endl-cards-api.json GET /api/v0/customer/{businessId}/card-users/{cardholderId}","href":"/api-reference/cards/get-cardholder"},{"title":"Issue a card","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{cardholderId}","href":"/api-reference/cards/issue-card"},{"title":"Issue a single-use card","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{cardholderId}/single-use","href":"/api-reference/cards/issue-single-use-card"},{"title":"List cards","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}","href":"/api-reference/cards/list-cards"},{"title":"Get a card","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/{cardId}","href":"/api-reference/cards/get-card"},{"title":"Update a card","openapi":"api-reference/endl-cards-api.json PATCH /api/v0/cards/{customerId}/{cardId}","href":"/api-reference/cards/update-card"},{"title":"Freeze a card","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/{cardId}/freeze","href":"/api-reference/cards/freeze-card"},{"title":"Unfreeze a card","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/{cardId}/unfreeze","href":"/api-reference/cards/unfreeze-card"},{"title":"Cancel a card","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/{cardId}/cancel","href":"/api-reference/cards/cancel-card"},{"title":"Get card details","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/{cardId}/details","href":"/api-reference/cards/get-card-details"},{"title":"Card details encryption","href":"/api-reference/cards/encryption"},{"title":"List card transactions","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/transactions","href":"/api-reference/cards/list-card-transactions"},{"title":"Get a card transaction","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/transactions/{transactionId}","href":"/api-reference/cards/get-card-transaction"},{"title":"Get card balance","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/balance","href":"/api-reference/cards/get-card-balance"},{"title":"Get deposit instructions","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/deposit-instructions","href":"/api-reference/cards/get-deposit-instructions"},{"title":"Deposit from the Endl account","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/deposits","href":"/api-reference/cards/create-card-deposit"},{"title":"List deposits","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/deposits","href":"/api-reference/cards/list-card-deposits"},{"title":"Get a deposit","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/deposits/{depositId}","href":"/api-reference/cards/get-card-deposit"},{"title":"Withdraw from the card balance","openapi":"api-reference/endl-cards-api.json POST /api/v0/cards/{customerId}/withdrawals","href":"/api-reference/cards/create-card-withdrawal"},{"title":"List withdrawals","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/withdrawals","href":"/api-reference/cards/list-card-withdrawals"},{"title":"Get a withdrawal","openapi":"api-reference/endl-cards-api.json GET /api/v0/cards/{customerId}/withdrawals/{withdrawalId}","href":"/api-reference/cards/get-card-withdrawal"},{"title":"Card webhook events","href":"/api-reference/cards/events"},{"title":"Card errors","href":"/api-reference/cards/errors"}]},{"group":"POBO","expanded":true,"pages":[{"title":"POBO overview","href":"/api-reference/pobo/introduction"},{"title":"Get owner","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/owner","href":"/api-reference/pobo/get-owner"},{"title":"Create sender","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/senders","href":"/api-reference/pobo/create-sender"},{"title":"List senders","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/senders","href":"/api-reference/pobo/list-senders"},{"title":"Get sender","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/senders/{senderId}","href":"/api-reference/pobo/get-sender"},{"title":"Delete sender","openapi":"api-reference/endl-pobo-api.json DELETE /api/v0/pobo/senders/{senderId}","href":"/api-reference/pobo/delete-sender"},{"title":"Create recipient","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/recipients","href":"/api-reference/pobo/create-recipient"},{"title":"List recipients","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/recipients/all","href":"/api-reference/pobo/list-recipients"},{"title":"Get recipient","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/recipients/{recipientId}","href":"/api-reference/pobo/get-recipient"},{"title":"Delete recipient","openapi":"api-reference/endl-pobo-api.json DELETE /api/v0/pobo/recipients/{recipientId}","href":"/api-reference/pobo/delete-recipient"},{"title":"Generate quote","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/quotes/generate","href":"/api-reference/pobo/generate-quote"},{"title":"Get quote","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/quotes/{quoteId}","href":"/api-reference/pobo/get-quote"},{"title":"Create pre-transaction","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/transactions/pre-txn","href":"/api-reference/pobo/create-pre-transaction"},{"title":"Submit transaction","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/transactions/submit","href":"/api-reference/pobo/submit-transaction"},{"title":"Get transaction","openapi":"api-reference/endl-pobo-api.json GET /api/v0/pobo/transactions/{txnId}","href":"/api-reference/pobo/get-transaction"},{"title":"List transactions","openapi":"api-reference/endl-pobo-api.json POST /api/v0/pobo/transactions/all","href":"/api-reference/pobo/list-transactions"}]},{"group":"Gift Cards","expanded":true,"pages":[{"title":"Giftcard API overview","href":"/giftcards/overview"},{"title":"Signing requests","href":"/giftcards/authentication"},{"title":"Conventions","href":"/giftcards/conventions"},{"title":"List products","openapi":"api-reference/endl-giftcard-api.json GET /catalog/products","href":"/giftcards/list-products"},{"title":"Create an order","openapi":"api-reference/endl-giftcard-api.json POST /orders","href":"/giftcards/create-order"},{"title":"Get an order","openapi":"api-reference/endl-giftcard-api.json GET /orders/{order_id}","href":"/giftcards/get-order"},{"title":"List orders","openapi":"api-reference/endl-giftcard-api.json GET /orders","href":"/giftcards/list-orders"},{"title":"Retrieve vouchers","openapi":"api-reference/endl-giftcard-api.json GET /orders/{order_id}/vouchers","href":"/giftcards/retrieve-vouchers"},{"title":"Order lifecycle","href":"/giftcards/lifecycle"},{"title":"Error codes","href":"/giftcards/errors"},{"title":"Worked flows","href":"/giftcards/flows"}]},{"group":"Webhooks","expanded":true,"pages":[{"title":"Webhooks overview","href":"/webhooks/overview"},{"title":"Verifying signatures","href":"/webhooks/signature-verification"},{"title":"Create subscription","openapi":"api-reference/endl-webhooks-api.json POST /api/v0/webhooks/subscriptions","href":"/webhooks/create-subscription"},{"title":"List subscriptions","openapi":"api-reference/endl-webhooks-api.json GET /api/v0/webhooks/subscriptions","href":"/webhooks/list-subscriptions"},{"title":"Get subscription","openapi":"api-reference/endl-webhooks-api.json GET /api/v0/webhooks/subscriptions/{id}","href":"/webhooks/get-subscription"},{"title":"Update subscription","openapi":"api-reference/endl-webhooks-api.json PATCH /api/v0/webhooks/subscriptions/{id}","href":"/webhooks/update-subscription"},{"title":"Delete subscription","openapi":"api-reference/endl-webhooks-api.json DELETE /api/v0/webhooks/subscriptions/{id}","href":"/webhooks/delete-subscription"},{"title":"Send event to subscription","openapi":"api-reference/endl-webhooks-api.json POST /api/v0/webhooks/subscriptions/{id}/send","href":"/webhooks/send-event"},{"title":"List deliveries","openapi":"api-reference/endl-webhooks-api.json GET /api/v0/webhooks/events","href":"/webhooks/list-deliveries"},{"title":"Get delivery","openapi":"api-reference/endl-webhooks-api.json GET /api/v0/webhooks/events/{id}","href":"/webhooks/get-delivery"},{"title":"Retry delivery","openapi":"api-reference/endl-webhooks-api.json POST /api/v0/webhooks/events/{id}/retry","href":"/webhooks/retry-delivery"},{"title":"Read the PULL feed","openapi":"api-reference/endl-webhooks-api.json GET /api/v0/events","href":"/webhooks/pull-events"},{"title":"Pagination","href":"/webhooks/pagination"},{"title":"Errors and response envelope","href":"/webhooks/errors"},{"title":"Reference","href":"/webhooks/reference"}]}]}]}]},"title":"Generate quote - Endl API","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}