{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
{
"type": "https://docs.etherfuse.com/ramp/v2/errors/quote-expired",
"title": "Quote expired",
"status": 400,
"detail": "quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist",
"instance": "tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d",
"errors": [
{
"pointer": "#/accountDetails/clabe",
"detail": "This field is required."
}
],
"required": [
"<string>"
],
"missing": [
"<string>"
]
}
Payment Accounts
Register payment account
Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness.
State where the account lives in one of two ways:
Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe).
Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send.
Registering does not prove that the customer owns the account.
Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization’s verified identity when we hold it. When a required field is still missing, the request fails with 422registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422holder-tax-id-mismatch).
You can send any registration field, including ones this route does not require; we check each value’s format and ignore the fields the route does not use. A name that is not a registration field returns 400validation-error.
Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready.
Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409payment-account-unavailable.
Your organization's name for the account. Must not be blank. We trim it. A label that contains <, >, ;, {, }, a backtick, |, \, $(, ../ or a control character returns 400.
The identifier that names the account, tagged by kind. The kind decides the field set: send exactly the fields your kind declares. A missing field or a field the kind does not declare returns 400validation-error with a pointer per field.
Account holder information a bank account route requires. The route and the organization's account type (personal or business) decide which fields are required: accountHolderName and taxId for bank accounts, plus the personal or business fields on routes that need them. We fill a field from the organization's verified identity when we hold it, so you only need to send the fields a registration-info-required problem lists in missing. You may send other registration fields too: we check their format and ignore the ones the route does not use. A name that is not listed here returns 400validation-error. A text value that contains <, >, ;, {, }, a backtick, |, \, $(, ../ or a control character returns 400invalid-request. Wallets require no fields.
Show child attributes
Response
The organization already holds this account. Returns it. A rejected direction is registered again and returns as pending.
The account as a whole. ready when any rail direction is ready. rejected when every rail direction is rejected; register the account again with corrected registrationInfo to retry. disabled when we turned the account off; it cannot be registered or quoted. Otherwise pending. Readiness per rail and direction is in rails.
The rails this account can move money on, keyed by rail name (a PaymentRail value such as spei or stellar). A rail the account cannot move money on is absent. The account identifier you registered is not returned.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Etherfuse API","colors":{"primary":"#141414","light":"#E4FF3F","dark":"#141414"},"logo":{"light":"https://mintcdn.com/etherfuse/XRSchVFGUgreQatD/img/logo-black.svg?fit=max\u0026auto=format\u0026n=XRSchVFGUgreQatD\u0026q=85\u0026s=92cf84eca27df4a19f7b032da398d110","dark":"https://mintcdn.com/etherfuse/XRSchVFGUgreQatD/img/logo-white.svg?fit=max\u0026auto=format\u0026n=XRSchVFGUgreQatD\u0026q=85\u0026s=7c87780c9a248347ffe6357ccf6762ed","href":"https://etherfuse.com"},"favicon":"https://mintcdn.com/etherfuse/pF4txuzXWQE790kS/img/favicon.png?fit=max\u0026auto=format\u0026n=pF4txuzXWQE790kS\u0026q=85\u0026s=ac74be5f7f4605e75bc961be0c6e5ff9","api":{"playground":{"display":"interactive"},"examples":{"languages":["curl","javascript","python"],"autogenerate":true}},"navbar":{"links":[{"href":"https://cal.com/team/etherfuse/api-overview?overlayCalendar=true","label":"Book a demo"},{"href":"https://app.etherfuse.com","label":"App"}],"primary":{"type":"button","label":"Get sandbox keys","href":"https://sandbox.etherfuse.com/sign-in?returnTo=%2Faccount%2Fmanage"}},"footer":{"links":[{"items":[{"label":"Website","href":"https://etherfuse.com"},{"label":"App","href":"https://app.etherfuse.com"},{"label":"Book a demo","href":"https://cal.com/team/etherfuse/api-overview?overlayCalendar=true"}]}]},"fonts":{"family":"Figtree"},"integrations":{"posthog":{"apiKey":"phc_vJEpZk4aZr9PxdPqapjg8ZKWFybTTmDvAxZNg88LTuPu","apiHost":"https://us.i.posthog.com"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"etherfuse","hasAudioNarration":false,"actualSubdomain":"etherfuse","customDomains":["docs.etherfuse.com"],"gitSource":{"type":"github","owner":"etherfuse","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae547dfd382909612c83cf7","collectionId":"eee1a3e5-d040-4b45-980d-cc540ca77f29","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae547dfd382909612c83cf7"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae547dfd382909612c83cf7","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"API Reference","count":151},{"language":"default","tag":"Ramp API","count":72},{"language":"default","tag":"Guides","count":65},{"language":"default","tag":"KYC","count":20},{"language":"default","tag":"Lookup API","count":18},{"language":"default","tag":"Orders","count":17},{"language":"default","tag":"Organizations","count":16},{"language":"default","tag":"User Authentication","count":12},{"language":"default","tag":"Blockchains","count":12},{"language":"default","tag":"Integration Guides","count":12}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"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":"turbopuffer-dual-write","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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"global.css","content":"body{scrollbar-gutter:stable}.sandbox-playground-cta{display:block;margin:1rem 0 1.25rem;padding:1rem 1.25rem;border-radius:.75rem;border:1px solid #141414;background-color:#e4ff3f;color:#141414!important;text-decoration:none;transition:background-color .15s ease,box-shadow .15s ease}.sandbox-playground-cta:hover{background-color:#d8f32f;box-shadow:0 2px 8px rgba(20,20,20,.12);color:#141414!important}.sandbox-playground-cta__body,.sandbox-playground-cta__detail,.sandbox-playground-cta__title{color:inherit!important}.dark .sandbox-playground-cta{border-color:#e4ff3f;background-color:#e4ff3f;color:#141414!important}.dark .sandbox-playground-cta:hover{background-color:#d8f32f;color:#141414!important}.sandbox-playground-cta__title{display:block;font-size:1rem;font-weight:600;margin-bottom:.35rem}.sandbox-playground-cta__body{display:block;font-size:.95rem;line-height:1.45;font-weight:500}.sandbox-playground-cta__detail{display:block;margin-top:.35rem;font-size:.85rem;line-height:1.45;opacity:.85}"}],"page":{"pagePath":"v2/api-reference/payment-accounts/register-payment-account","slug":"/v2/api-reference/payment-accounts/register-payment-account","pageMetadata":{"title":"Register payment account","openapi":"openapi-v2.json POST /organization/{organizationId}/payment_account","description":"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness.\n\nState where the account lives in one of two ways:\n- **Bank account:** set `kind` to `bank`, send `country` and `currency` (for example `MX` and `MXN`), and describe the account in `accountDetails` (for example a `clabe`).\n- **Wallet:** set `kind` to `wallet` and send `accountDetails` of kind `address` with its `chain`. Do not send `country` or `currency` for a wallet. A wallet requires no `registrationInfo`, and we ignore any you send.\n\nRegistering does not prove that the customer owns the account.\n\n**Registration info.** A bank account route requires holder fields such as `accountHolderName` and `taxId`. We fill each one from the organization's verified identity when we hold it. When a required field is still missing, the request fails with `422` `registration-info-required`, and the problem lists every required field in `required` and the ones still needed in `missing`, as JSON Pointers into the request (for example `#/registrationInfo/taxId`). Send the missing fields in `registrationInfo` and retry. A supplied `taxId` must match the verified one (`422` `holder-tax-id-mismatch`).\n\nYou can send any registration field, including ones this route does not require; we check each value's format and ignore the fields the route does not use. A name that is not a registration field returns `400` `validation-error`.\n\n**Readiness.** A new account starts `pending`, and so does each rail direction. We register it with the payment provider, then move each direction to `ready` or `rejected`. Subscribe to `paymentAccountUpdated`, or read the account again, and quote a direction once it is `ready`.\n\n**Registering an account again.** If the organization already holds the account, you get it back with `200`. When a direction was `rejected`, we register the account with the provider again using the `registrationInfo` you send, and those directions go back to `pending`. Otherwise we change nothing. If another organization holds it, the request fails with `409` `payment-account-unavailable`.","href":"/v2/api-reference/payment-accounts/register-payment-account"},"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 code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"State where the account lives in one of two ways:\"\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Bank account:\"\n }), \" set \", _jsx(_components.code, {\n children: \"kind\"\n }), \" to \", _jsx(_components.code, {\n children: \"bank\"\n }), \", send \", _jsx(_components.code, {\n children: \"country\"\n }), \" and \", _jsx(_components.code, {\n children: \"currency\"\n }), \" (for example \", _jsx(_components.code, {\n children: \"MX\"\n }), \" and \", _jsx(_components.code, {\n children: \"MXN\"\n }), \"), and describe the account in \", _jsx(_components.code, {\n children: \"accountDetails\"\n }), \" (for example a \", _jsx(_components.code, {\n children: \"clabe\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Wallet:\"\n }), \" set \", _jsx(_components.code, {\n children: \"kind\"\n }), \" to \", _jsx(_components.code, {\n children: \"wallet\"\n }), \" and send \", _jsx(_components.code, {\n children: \"accountDetails\"\n }), \" of kind \", _jsx(_components.code, {\n children: \"address\"\n }), \" with its \", _jsx(_components.code, {\n children: \"chain\"\n }), \". Do not send \", _jsx(_components.code, {\n children: \"country\"\n }), \" or \", _jsx(_components.code, {\n children: \"currency\"\n }), \" for a wallet. A wallet requires no \", _jsx(_components.code, {\n children: \"registrationInfo\"\n }), \", and we ignore any you send.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Registering does not prove that the customer owns the account.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Registration info.\"\n }), \" A bank account route requires holder fields such as \", _jsx(_components.code, {\n children: \"accountHolderName\"\n }), \" and \", _jsx(_components.code, {\n children: \"taxId\"\n }), \". We fill each one from the organization’s verified identity when we hold it. When a required field is still missing, the request fails with \", _jsx(_components.code, {\n children: \"422\"\n }), \" \", _jsx(_components.code, {\n children: \"registration-info-required\"\n }), \", and the problem lists every required field in \", _jsx(_components.code, {\n children: \"required\"\n }), \" and the ones still needed in \", _jsx(_components.code, {\n children: \"missing\"\n }), \", as JSON Pointers into the request (for example \", _jsx(_components.code, {\n children: \"#/registrationInfo/taxId\"\n }), \"). Send the missing fields in \", _jsx(_components.code, {\n children: \"registrationInfo\"\n }), \" and retry. A supplied \", _jsx(_components.code, {\n children: \"taxId\"\n }), \" must match the verified one (\", _jsx(_components.code, {\n children: \"422\"\n }), \" \", _jsx(_components.code, {\n children: \"holder-tax-id-mismatch\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"You can send any registration field, including ones this route does not require; we check each value’s format and ignore the fields the route does not use. A name that is not a registration field returns \", _jsx(_components.code, {\n children: \"400\"\n }), \" \", _jsx(_components.code, {\n children: \"validation-error\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Readiness.\"\n }), \" A new account starts \", _jsx(_components.code, {\n children: \"pending\"\n }), \", and so does each rail direction. We register it with the payment provider, then move each direction to \", _jsx(_components.code, {\n children: \"ready\"\n }), \" or \", _jsx(_components.code, {\n children: \"rejected\"\n }), \". Subscribe to \", _jsx(_components.code, {\n children: \"paymentAccountUpdated\"\n }), \", or read the account again, and quote a direction once it is \", _jsx(_components.code, {\n children: \"ready\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Registering an account again.\"\n }), \" If the organization already holds the account, you get it back with \", _jsx(_components.code, {\n children: \"200\"\n }), \". When a direction was \", _jsx(_components.code, {\n children: \"rejected\"\n }), \", we register the account with the provider again using the \", _jsx(_components.code, {\n children: \"registrationInfo\"\n }), \" you send, and those directions go back to \", _jsx(_components.code, {\n children: \"pending\"\n }), \". Otherwise we change nothing. If another organization holds it, the request fails with \", _jsx(_components.code, {\n children: \"409\"\n }), \" \", _jsx(_components.code, {\n children: \"payment-account-unavailable\"\n }), \".\"]\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};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Register payment account","openapi":"openapi-v2.json POST /organization/{organizationId}/payment_account","description":"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness.\n\nState where the account lives in one of two ways:\n- **Bank account:** set `kind` to `bank`, send `country` and `currency` (for example `MX` and `MXN`), and describe the account in `accountDetails` (for example a `clabe`).\n- **Wallet:** set `kind` to `wallet` and send `accountDetails` of kind `address` with its `chain`. Do not send `country` or `currency` for a wallet. A wallet requires no `registrationInfo`, and we ignore any you send.\n\nRegistering does not prove that the customer owns the account.\n\n**Registration info.** A bank account route requires holder fields such as `accountHolderName` and `taxId`. We fill each one from the organization's verified identity when we hold it. When a required field is still missing, the request fails with `422` `registration-info-required`, and the problem lists every required field in `required` and the ones still needed in `missing`, as JSON Pointers into the request (for example `#/registrationInfo/taxId`). Send the missing fields in `registrationInfo` and retry. A supplied `taxId` must match the verified one (`422` `holder-tax-id-mismatch`).\n\nYou can send any registration field, including ones this route does not require; we check each value's format and ignore the fields the route does not use. A name that is not a registration field returns `400` `validation-error`.\n\n**Readiness.** A new account starts `pending`, and so does each rail direction. We register it with the payment provider, then move each direction to `ready` or `rejected`. Subscribe to `paymentAccountUpdated`, or read the account again, and quote a direction once it is `ready`.\n\n**Registering an account again.** If the organization already holds the account, you get it back with `200`. When a direction was `rejected`, we register the account with the provider again using the `registrationInfo` you send, and those directions go back to `pending`. Otherwise we change nothing. If another organization holds it, the request fails with `409` `payment-account-unavailable`.","href":"/v2/api-reference/payment-accounts/register-payment-account"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Payment Accounts"],"summary":"Register payment account","operationId":"v2CreatePaymentAccount","parameters":["ae3e3c40-0298-4ff4-99cb-f84bb86c55a3"],"description":"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness.\n\nState where the account lives in one of two ways:\n- **Bank account:** set `kind` to `bank`, send `country` and `currency` (for example `MX` and `MXN`), and describe the account in `accountDetails` (for example a `clabe`).\n- **Wallet:** set `kind` to `wallet` and send `accountDetails` of kind `address` with its `chain`. Do not send `country` or `currency` for a wallet. A wallet requires no `registrationInfo`, and we ignore any you send.\n\nRegistering does not prove that the customer owns the account.\n\n**Registration info.** A bank account route requires holder fields such as `accountHolderName` and `taxId`. We fill each one from the organization's verified identity when we hold it. When a required field is still missing, the request fails with `422` `registration-info-required`, and the problem lists every required field in `required` and the ones still needed in `missing`, as JSON Pointers into the request (for example `#/registrationInfo/taxId`). Send the missing fields in `registrationInfo` and retry. A supplied `taxId` must match the verified one (`422` `holder-tax-id-mismatch`).\n\nYou can send any registration field, including ones this route does not require; we check each value's format and ignore the fields the route does not use. A name that is not a registration field returns `400` `validation-error`.\n\n**Readiness.** A new account starts `pending`, and so does each rail direction. We register it with the payment provider, then move each direction to `ready` or `rejected`. Subscribe to `paymentAccountUpdated`, or read the account again, and quote a direction once it is `ready`.\n\n**Registering an account again.** If the organization already holds the account, you get it back with `200`. When a direction was `rejected`, we register the account with the provider again using the `registrationInfo` you send, and those directions go back to `pending`. Otherwise we change nothing. If another organization holds it, the request fails with `409` `payment-account-unavailable`.","requestBody":"6b8cac57-9ef7-40bc-8382-5a727bdbb557","responses":{"200":"abcebf93-e4ec-445a-a2f4-894ffbc9bf01","201":"c6aab3c4-d251-4950-a48c-4781b3bdfb65","400":"461ca153-82e9-4466-aaba-78108eac9d33","401":"c06af626-d31c-4f37-bb0a-ede80852d979","404":"aacf49f3-af8a-4035-86cf-4af50078ee88","409":"ca058aa1-fd35-4dee-a3d0-83ab17b115d1","413":"5a304280-b310-46a3-9dde-1dc09a83ab38","422":"916736d4-0b67-47a7-9f49-43f44b92e7e3","500":"1b024419-66c5-4b1f-b101-2b2aea0e8d1b"},"method":"post","type":"path","servers":["58ef8c25-fe99-4a3a-b3d6-63ae68d90d12"],"security":["e2afb556-03f4-4063-920b-822ee6d2cce7"],"path":"/organization/{organizationId}/payment_account","baseUrlOptions":["https://api.sand.etherfuse.com"],"title":"Register payment account","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"ae3e3c40-0298-4ff4-99cb-f84bb86c55a3":{"name":"organizationId","in":"path","required":true,"description":"The organization this call acts for: your API key's organization or one of its customer organizations. Any other id returns `404` `not-found`.","schema":{"type":"string","format":"uuid","isRequired":true,"description":"The organization this call acts for: your API key's organization or one of its customer organizations. Any other id returns `404` `not-found`.","uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","label","accountDetails"],"properties":{"kind":{"type":"string","enum":["bank","wallet","embeddedWallet","debitCard","cash"],"description":"The kind of account. `embeddedWallet` is a wallet we create on a chain; see [Embedded wallets](/v2/guides/embedded-wallets). `debitCard` and `cash` return `422` `unsupported`.","isRequired":true,"uniqueKey":"kind","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"Your organization's name for the account. Must not be blank. We trim it. A label that contains `\u003c`, `>`, `;`, `{`, `}`, a backtick, `|`, `\\`, `$(`, `../` or a control character returns `400`.","example":"Operating account","isRequired":true,"uniqueKey":"label","typeLabel":"string"},"accountDetails":{"oneOf":[{"type":"object","title":"clabe","description":"The identifier that names the account, tagged by `kind`. The kind decides the field set: send exactly the fields your kind declares. A missing field or a field the kind does not declare returns `400` `validation-error` with a pointer per field.","required":["kind","clabe"],"properties":{"kind":{"type":"string","const":"clabe","isRequired":true,"uniqueKey":"accountDetails.oneOf.0.kind","typeLabel":"string"},"clabe":{"type":"string","description":"An 18-digit Mexican CLABE. We check its length and check digit.","example":"012180000000000002","isRequired":true,"uniqueKey":"accountDetails.oneOf.0.clabe","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"accountDetails.oneOf.0","typeLabel":"clabe · object"},{"type":"object","title":"pixKey","description":"The identifier that names the account, tagged by `kind`. The kind decides the field set: send exactly the fields your kind declares. A missing field or a field the kind does not declare returns `400` `validation-error` with a pointer per field.","required":["kind","pixKey"],"properties":{"kind":{"type":"string","const":"pixKey","isRequired":true,"uniqueKey":"accountDetails.oneOf.1.kind","typeLabel":"string"},"pixKey":{"type":"string","description":"A Brazilian PIX key: an email, a phone, a CPF, a CNPJ or a random key. 1 to 77 characters.","maxLength":77,"isRequired":true,"uniqueKey":"accountDetails.oneOf.1.pixKey","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"accountDetails.oneOf.1","typeLabel":"pixKey · object"},{"type":"object","title":"address","description":"The identifier that names the account, tagged by `kind`. The kind decides the field set: send exactly the fields your kind declares. A missing field or a field the kind does not declare returns `400` `validation-error` with a pointer per field.","required":["kind","address","chain"],"properties":{"kind":{"type":"string","const":"address","isRequired":true,"uniqueKey":"accountDetails.oneOf.2.kind","typeLabel":"string"},"address":{"type":"string","description":"The wallet address. We validate it for `chain`.","example":"GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF","isRequired":true,"uniqueKey":"accountDetails.oneOf.2.address","typeLabel":"string"},"chain":{"type":"string","enum":["stellar","solana","base","polygon","monad","avalanche"],"description":"The chain a wallet is on.","isRequired":true,"uniqueKey":"accountDetails.oneOf.2.chain","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"accountDetails.oneOf.2","typeLabel":"address · object"},{"type":"object","title":"signerPublicKey","description":"The identifier that names the account, tagged by `kind`. The kind decides the field set: send exactly the fields your kind declares. A missing field or a field the kind does not declare returns `400` `validation-error` with a pointer per field.","required":["kind","chain","signerPublicKey"],"properties":{"kind":{"type":"string","const":"signerPublicKey","isRequired":true,"uniqueKey":"accountDetails.oneOf.3.kind","typeLabel":"string"},"chain":{"type":"string","enum":["stellar","solana","base","polygon","monad","avalanche"],"description":"The chain a wallet is on.","isRequired":true,"uniqueKey":"accountDetails.oneOf.3.chain","typeLabel":"enum\u003cstring>"},"signerPublicKey":{"type":"string","description":"The holder's P-256 public key, hex-encoded SEC1, compressed or uncompressed. The holder signs order authorizations with the matching private key.","example":"02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc","isRequired":true,"uniqueKey":"accountDetails.oneOf.3.signerPublicKey","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"accountDetails.oneOf.3","typeLabel":"signerPublicKey · object"}],"isRequired":true,"uniqueKey":"accountDetails","typeLabel":"clabe · object | pixKey · object | address · object | signerPublicKey · object"},"country":{"type":"string","description":"Two-letter country code of the account's market. Send with `currency` for a bank account. Omit for a wallet.","example":"MX","uniqueKey":"country","typeLabel":"string"},"currency":{"type":"string","description":"Three-letter currency code of the account's market. Send with `country` for a bank account. Omit for a wallet.","example":"MXN","uniqueKey":"currency","typeLabel":"string"},"registrationInfo":{"type":"object","additionalProperties":false,"description":"Account holder information a bank account route requires. The route and the organization's account type (personal or business) decide which fields are required: `accountHolderName` and `taxId` for bank accounts, plus the personal or business fields on routes that need them. We fill a field from the organization's verified identity when we hold it, so you only need to send the fields a `registration-info-required` problem lists in `missing`. You may send other registration fields too: we check their format and ignore the ones the route does not use. A name that is not listed here returns `400` `validation-error`. A text value that contains `\u003c`, `>`, `;`, `{`, `}`, a backtick, `|`, `\\`, `$(`, `../` or a control character returns `400` `invalid-request`. Wallets require no fields.","properties":{"accountHolderName":{"type":"string","description":"Name of the account holder.","uniqueKey":"registrationInfo.accountHolderName","typeLabel":"string"},"taxId":{"type":"string","description":"Tax ID of the account holder. Must match the verified tax ID when we hold one.","example":"XAXX010101000","uniqueKey":"registrationInfo.taxId","typeLabel":"string"},"curp":{"type":"string","description":"Mexican CURP (personal accounts).","example":"XEXX010101HNEXXXA4","uniqueKey":"registrationInfo.curp","typeLabel":"string"},"firstName":{"type":"string","description":"First name (personal accounts).","uniqueKey":"registrationInfo.firstName","typeLabel":"string"},"paternalLastName":{"type":"string","description":"Paternal last name (personal accounts).","uniqueKey":"registrationInfo.paternalLastName","typeLabel":"string"},"maternalLastName":{"type":"string","description":"Maternal last name (personal accounts).","uniqueKey":"registrationInfo.maternalLastName","typeLabel":"string"},"dateOfBirth":{"type":"string","format":"date","description":"`YYYY-MM-DD` (personal accounts).","uniqueKey":"registrationInfo.dateOfBirth","typeLabel":"string\u003cdate>"},"countryOfBirth":{"type":"string","description":"Two-letter country code (personal accounts).","example":"MX","uniqueKey":"registrationInfo.countryOfBirth","typeLabel":"string"},"dateOfIncorporation":{"type":"string","format":"date","description":"`YYYY-MM-DD` (business accounts).","uniqueKey":"registrationInfo.dateOfIncorporation","typeLabel":"string\u003cdate>"},"countryOfIncorporation":{"type":"string","description":"Two-letter country code (business accounts).","example":"MX","uniqueKey":"registrationInfo.countryOfIncorporation","typeLabel":"string"}},"uniqueKey":"registrationInfo","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"bank":{"title":"bank","value":{"kind":"bank","label":"Operating account","country":"MX","currency":"MXN","accountDetails":{"kind":"clabe","clabe":"012180000000000002"},"registrationInfo":{"accountHolderName":"Ejemplo Comercial SA de CV","taxId":"XAXX010101000"}}},"wallet":{"title":"wallet","value":{"kind":"wallet","label":"Treasury wallet","accountDetails":{"kind":"address","address":"GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF","chain":"stellar"}}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"abcebf93-e4ec-445a-a2f4-894ffbc9bf01":{"description":"The organization already holds this account. Returns it. A `rejected` direction is registered again and returns as `pending`.","content":{"application/json":{"schema":{"type":"object","required":["id","status","label","rails","createdAt"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account as a whole. `ready` when any rail direction is `ready`. `rejected` when every rail direction is `rejected`; register the account again with corrected `registrationInfo` to retry. `disabled` when we turned the account off; it cannot be registered or quoted. Otherwise `pending`. Readiness per rail and direction is in `rails`.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"Your organization's name for the account.","isRequired":true,"uniqueKey":"label","typeLabel":"string"},"rails":{"type":"object","description":"The rails this account can move money on, keyed by rail name (a `PaymentRail` value such as `spei` or `stellar`). A rail the account cannot move money on is absent. The account identifier you registered is not returned.","additionalProperties":{"type":"object","required":["source","destination"],"properties":{"source":{"oneOf":[{"type":"object","description":"The account as the source of a transfer on this rail. Null when the rail cannot carry money from this account.","required":["isDefault","status"],"properties":{"isDefault":{"type":"boolean","description":"True when a quote that does not name a rail for this side uses this rail.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.isDefault","typeLabel":"boolean"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account's status on one rail in one direction. Only `ready` can be quoted.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.status","typeLabel":"enum\u003cstring>"},"minAmount":{"type":"string","description":"Minimum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no minimum.","uniqueKey":"rails.additionalProperties.source.oneOf.0.minAmount","typeLabel":"string"},"maxAmount":{"type":"string","description":"Maximum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no maximum; that does not mean unlimited.","uniqueKey":"rails.additionalProperties.source.oneOf.0.maxAmount","typeLabel":"string"},"rejection":{"type":"object","description":"Why this direction was rejected. Present only when `status` is `rejected`.","required":["code","message"],"properties":{"code":{"type":"string","enum":["registeredInV1","taxIdHasActiveAccount","registrationDetailsChanged","invalidRegistrationInfo","invalidAccountNumber","unknownBank","inactiveBank","accountBlocked","holderNameMismatch","railUnavailable","providerRejected","registrationFailed","registrationCanceled"],"description":"Why a rail direction was rejected. New values may be added.\n\n- `registeredInV1`: the bank account is registered with our v1 API. It becomes usable in v2 once we finish migrating existing accounts.\n- `taxIdHasActiveAccount`: the tax ID already has an active account for a different bank account. Use that bank account.\n- `registrationDetailsChanged`: the account is already registered with different details. Register it again with the details it was first registered with.\n- `invalidRegistrationInfo`: the registration info doesn't meet the payment provider's rules. Correct `registrationInfo`, then register the account again.\n- `invalidAccountNumber`: the payment provider says the account number isn't valid. Check it, then register the account again.\n- `unknownBank`: we don't recognize the bank the account number belongs to. Check the account number, then register the account again.\n- `inactiveBank`: the account's bank can't take transfers right now. Register the account again later, or use an account at another bank.\n- `accountBlocked`: the payment provider has blocked the account. Registering it again won't help; use a different account, or contact support.\n- `holderNameMismatch`: the account holder name doesn't match the bank's records. Correct `registrationInfo.accountHolderName`, then register the account again.\n- `railUnavailable`: we can't register accounts on this rail right now. This is on our side; contact support.\n- `providerRejected`: the payment provider rejected the account, for a reason not listed above. Check `accountDetails` and `registrationInfo`, then register it again.\n- `registrationFailed`: we couldn't complete the registration. Register the account again.\n- `registrationCanceled`: the registration was canceled. Register the account again.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Our explanation of `code`, written so you can show it to your customer. The wording may change; branch on `code`.","example":"This tax ID already has an active account for a different bank account. Use that bank account instead.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection.message","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection","typeLabel":"object"}},"isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0","typeLabel":"object"},{"type":"null","description":"The account as the source of a transfer on this rail. Null when the rail cannot carry money from this account.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rails.additionalProperties.source","typeLabel":"object | null"},"destination":{"oneOf":[{"type":"object","description":"The account as the destination of a transfer on this rail. Null when the rail cannot carry money to this account.","required":["isDefault","status"],"properties":{"isDefault":{"type":"boolean","description":"True when a quote that does not name a rail for this side uses this rail.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.isDefault","typeLabel":"boolean"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account's status on one rail in one direction. Only `ready` can be quoted.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.status","typeLabel":"enum\u003cstring>"},"minAmount":{"type":"string","description":"Minimum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no minimum.","uniqueKey":"rails.additionalProperties.destination.oneOf.0.minAmount","typeLabel":"string"},"maxAmount":{"type":"string","description":"Maximum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no maximum; that does not mean unlimited.","uniqueKey":"rails.additionalProperties.destination.oneOf.0.maxAmount","typeLabel":"string"},"rejection":{"type":"object","description":"Why this direction was rejected. Present only when `status` is `rejected`.","required":["code","message"],"properties":{"code":{"type":"string","enum":["registeredInV1","taxIdHasActiveAccount","registrationDetailsChanged","invalidRegistrationInfo","invalidAccountNumber","unknownBank","inactiveBank","accountBlocked","holderNameMismatch","railUnavailable","providerRejected","registrationFailed","registrationCanceled"],"description":"Why a rail direction was rejected. New values may be added.\n\n- `registeredInV1`: the bank account is registered with our v1 API. It becomes usable in v2 once we finish migrating existing accounts.\n- `taxIdHasActiveAccount`: the tax ID already has an active account for a different bank account. Use that bank account.\n- `registrationDetailsChanged`: the account is already registered with different details. Register it again with the details it was first registered with.\n- `invalidRegistrationInfo`: the registration info doesn't meet the payment provider's rules. Correct `registrationInfo`, then register the account again.\n- `invalidAccountNumber`: the payment provider says the account number isn't valid. Check it, then register the account again.\n- `unknownBank`: we don't recognize the bank the account number belongs to. Check the account number, then register the account again.\n- `inactiveBank`: the account's bank can't take transfers right now. Register the account again later, or use an account at another bank.\n- `accountBlocked`: the payment provider has blocked the account. Registering it again won't help; use a different account, or contact support.\n- `holderNameMismatch`: the account holder name doesn't match the bank's records. Correct `registrationInfo.accountHolderName`, then register the account again.\n- `railUnavailable`: we can't register accounts on this rail right now. This is on our side; contact support.\n- `providerRejected`: the payment provider rejected the account, for a reason not listed above. Check `accountDetails` and `registrationInfo`, then register it again.\n- `registrationFailed`: we couldn't complete the registration. Register the account again.\n- `registrationCanceled`: the registration was canceled. Register the account again.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Our explanation of `code`, written so you can show it to your customer. The wording may change; branch on `code`.","example":"This tax ID already has an active account for a different bank account. Use that bank account instead.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection.message","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection","typeLabel":"object"}},"isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0","typeLabel":"object"},{"type":"null","description":"The account as the destination of a transfer on this rail. Null when the rail cannot carry money to this account.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rails.additionalProperties.destination","typeLabel":"object | null"},"currency":{"type":"string","description":"The fiat currency of this rail. Absent for a wallet rail.","example":"MXN","uniqueKey":"rails.additionalProperties.currency","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"rails","typeLabel":"object"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"}},"example":{"id":"3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70","status":"pending","label":"Operating account","rails":{"spei":{"currency":"MXN","source":{"isDefault":true,"status":"ready"},"destination":{"isDefault":true,"status":"pending"}}},"createdAt":"2026-09-28T17:04:11.482Z"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70","status":"pending","label":"Operating account","rails":{"spei":{"currency":"MXN","source":{"isDefault":true,"status":"ready"},"destination":{"isDefault":true,"status":"pending"}}},"createdAt":"2026-09-28T17:04:11.482Z"}}},"exampleType":"generated"}},"exampleType":"generated"},"c6aab3c4-d251-4950-a48c-4781b3bdfb65":{"description":"The registered account: a new registration, or an account the organization removed and registered again.","content":{"application/json":{"schema":{"type":"object","required":["id","status","label","rails","createdAt"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account as a whole. `ready` when any rail direction is `ready`. `rejected` when every rail direction is `rejected`; register the account again with corrected `registrationInfo` to retry. `disabled` when we turned the account off; it cannot be registered or quoted. Otherwise `pending`. Readiness per rail and direction is in `rails`.","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"Your organization's name for the account.","isRequired":true,"uniqueKey":"label","typeLabel":"string"},"rails":{"type":"object","description":"The rails this account can move money on, keyed by rail name (a `PaymentRail` value such as `spei` or `stellar`). A rail the account cannot move money on is absent. The account identifier you registered is not returned.","additionalProperties":{"type":"object","required":["source","destination"],"properties":{"source":{"oneOf":[{"type":"object","description":"The account as the source of a transfer on this rail. Null when the rail cannot carry money from this account.","required":["isDefault","status"],"properties":{"isDefault":{"type":"boolean","description":"True when a quote that does not name a rail for this side uses this rail.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.isDefault","typeLabel":"boolean"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account's status on one rail in one direction. Only `ready` can be quoted.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.status","typeLabel":"enum\u003cstring>"},"minAmount":{"type":"string","description":"Minimum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no minimum.","uniqueKey":"rails.additionalProperties.source.oneOf.0.minAmount","typeLabel":"string"},"maxAmount":{"type":"string","description":"Maximum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no maximum; that does not mean unlimited.","uniqueKey":"rails.additionalProperties.source.oneOf.0.maxAmount","typeLabel":"string"},"rejection":{"type":"object","description":"Why this direction was rejected. Present only when `status` is `rejected`.","required":["code","message"],"properties":{"code":{"type":"string","enum":["registeredInV1","taxIdHasActiveAccount","registrationDetailsChanged","invalidRegistrationInfo","invalidAccountNumber","unknownBank","inactiveBank","accountBlocked","holderNameMismatch","railUnavailable","providerRejected","registrationFailed","registrationCanceled"],"description":"Why a rail direction was rejected. New values may be added.\n\n- `registeredInV1`: the bank account is registered with our v1 API. It becomes usable in v2 once we finish migrating existing accounts.\n- `taxIdHasActiveAccount`: the tax ID already has an active account for a different bank account. Use that bank account.\n- `registrationDetailsChanged`: the account is already registered with different details. Register it again with the details it was first registered with.\n- `invalidRegistrationInfo`: the registration info doesn't meet the payment provider's rules. Correct `registrationInfo`, then register the account again.\n- `invalidAccountNumber`: the payment provider says the account number isn't valid. Check it, then register the account again.\n- `unknownBank`: we don't recognize the bank the account number belongs to. Check the account number, then register the account again.\n- `inactiveBank`: the account's bank can't take transfers right now. Register the account again later, or use an account at another bank.\n- `accountBlocked`: the payment provider has blocked the account. Registering it again won't help; use a different account, or contact support.\n- `holderNameMismatch`: the account holder name doesn't match the bank's records. Correct `registrationInfo.accountHolderName`, then register the account again.\n- `railUnavailable`: we can't register accounts on this rail right now. This is on our side; contact support.\n- `providerRejected`: the payment provider rejected the account, for a reason not listed above. Check `accountDetails` and `registrationInfo`, then register it again.\n- `registrationFailed`: we couldn't complete the registration. Register the account again.\n- `registrationCanceled`: the registration was canceled. Register the account again.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Our explanation of `code`, written so you can show it to your customer. The wording may change; branch on `code`.","example":"This tax ID already has an active account for a different bank account. Use that bank account instead.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection.message","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties.source.oneOf.0.rejection","typeLabel":"object"}},"isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.0","typeLabel":"object"},{"type":"null","description":"The account as the source of a transfer on this rail. Null when the rail cannot carry money from this account.","isRequired":true,"uniqueKey":"rails.additionalProperties.source.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rails.additionalProperties.source","typeLabel":"object | null"},"destination":{"oneOf":[{"type":"object","description":"The account as the destination of a transfer on this rail. Null when the rail cannot carry money to this account.","required":["isDefault","status"],"properties":{"isDefault":{"type":"boolean","description":"True when a quote that does not name a rail for this side uses this rail.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.isDefault","typeLabel":"boolean"},"status":{"type":"string","enum":["pending","ready","rejected","disabled"],"description":"The account's status on one rail in one direction. Only `ready` can be quoted.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.status","typeLabel":"enum\u003cstring>"},"minAmount":{"type":"string","description":"Minimum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no minimum.","uniqueKey":"rails.additionalProperties.destination.oneOf.0.minAmount","typeLabel":"string"},"maxAmount":{"type":"string","description":"Maximum amount on this rail, as a decimal string in the rail's `currency`. Absent when we know of no maximum; that does not mean unlimited.","uniqueKey":"rails.additionalProperties.destination.oneOf.0.maxAmount","typeLabel":"string"},"rejection":{"type":"object","description":"Why this direction was rejected. Present only when `status` is `rejected`.","required":["code","message"],"properties":{"code":{"type":"string","enum":["registeredInV1","taxIdHasActiveAccount","registrationDetailsChanged","invalidRegistrationInfo","invalidAccountNumber","unknownBank","inactiveBank","accountBlocked","holderNameMismatch","railUnavailable","providerRejected","registrationFailed","registrationCanceled"],"description":"Why a rail direction was rejected. New values may be added.\n\n- `registeredInV1`: the bank account is registered with our v1 API. It becomes usable in v2 once we finish migrating existing accounts.\n- `taxIdHasActiveAccount`: the tax ID already has an active account for a different bank account. Use that bank account.\n- `registrationDetailsChanged`: the account is already registered with different details. Register it again with the details it was first registered with.\n- `invalidRegistrationInfo`: the registration info doesn't meet the payment provider's rules. Correct `registrationInfo`, then register the account again.\n- `invalidAccountNumber`: the payment provider says the account number isn't valid. Check it, then register the account again.\n- `unknownBank`: we don't recognize the bank the account number belongs to. Check the account number, then register the account again.\n- `inactiveBank`: the account's bank can't take transfers right now. Register the account again later, or use an account at another bank.\n- `accountBlocked`: the payment provider has blocked the account. Registering it again won't help; use a different account, or contact support.\n- `holderNameMismatch`: the account holder name doesn't match the bank's records. Correct `registrationInfo.accountHolderName`, then register the account again.\n- `railUnavailable`: we can't register accounts on this rail right now. This is on our side; contact support.\n- `providerRejected`: the payment provider rejected the account, for a reason not listed above. Check `accountDetails` and `registrationInfo`, then register it again.\n- `registrationFailed`: we couldn't complete the registration. Register the account again.\n- `registrationCanceled`: the registration was canceled. Register the account again.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Our explanation of `code`, written so you can show it to your customer. The wording may change; branch on `code`.","example":"This tax ID already has an active account for a different bank account. Use that bank account instead.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection.message","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties.destination.oneOf.0.rejection","typeLabel":"object"}},"isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.0","typeLabel":"object"},{"type":"null","description":"The account as the destination of a transfer on this rail. Null when the rail cannot carry money to this account.","isRequired":true,"uniqueKey":"rails.additionalProperties.destination.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rails.additionalProperties.destination","typeLabel":"object | null"},"currency":{"type":"string","description":"The fiat currency of this rail. Absent for a wallet rail.","example":"MXN","uniqueKey":"rails.additionalProperties.currency","typeLabel":"string"}},"uniqueKey":"rails.additionalProperties","typeLabel":"object"},"isRequired":true,"uniqueKey":"rails","typeLabel":"object"},"createdAt":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string\u003cdate-time>"}},"example":{"id":"3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70","status":"pending","label":"Operating account","rails":{"spei":{"currency":"MXN","source":{"isDefault":true,"status":"ready"},"destination":{"isDefault":true,"status":"pending"}}},"createdAt":"2026-09-28T17:04:11.482Z"},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3f9a2c1e-5b7d-4e8f-9a01-2b3c4d5e6f70","status":"pending","label":"Operating account","rails":{"spei":{"currency":"MXN","source":{"isDefault":true,"status":"ready"},"destination":{"isDefault":true,"status":"pending"}}},"createdAt":"2026-09-28T17:04:11.482Z"}}},"exampleType":"generated"}},"exampleType":"generated"},"461ca153-82e9-4466-aaba-78108eac9d33":{"description":"`invalid-request`: the body is malformed, has an unknown enum value, a blank `label`, an invalid CLABE, PIX key or wallet address, an unknown `chain`, or an incomplete or conflicting location. `validation-error`: `accountDetails` is missing a field its kind requires or has a field it does not allow, or `registrationInfo` has a field that is not a registration field or has a malformed value. See `errors` for the pointers.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"c06af626-d31c-4f37-bb0a-ede80852d979":{"description":"`unauthorized`: the `Authorization` header is missing, not ASCII, or does not hold a valid API key.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"aacf49f3-af8a-4035-86cf-4af50078ee88":{"description":"`not-found`: your API key cannot act for this organization.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"ca058aa1-fd35-4dee-a3d0-83ab17b115d1":{"description":"`payment-account-unavailable`: another organization holds this account. `payment-account-disabled`: the account is disabled and cannot be registered. `conflict`: the organization holds this account in a different market.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"5a304280-b310-46a3-9dde-1dc09a83ab38":{"description":"`payload-too-large`: the request body is too large.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"916736d4-0b67-47a7-9f49-43f44b92e7e3":{"description":"`registration-info-required`: required registration fields are missing; see `required` and `missing`. `holder-tax-id-mismatch`: `registrationInfo.taxId` does not match the verified tax ID. `unsupported`: this kind of account, or this identifier in this location, cannot be registered.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"1b024419-66c5-4b1f-b101-2b2aea0e8d1b":{"description":"`internal-error`: an unexpected error on our side. Retry with backoff, and quote `instance` to support if it persists.","content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 9457 problem details. Every v2 error uses this body with content type `application/problem+json`. `errors` is present only on `validation-error`. `required` and `missing` are present only on `registration-info-required`.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri","description":"`https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem slug, for example `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on this value.","example":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi>"},"title":{"type":"string","description":"Short summary of the problem type.","example":"Quote expired","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"status":{"type":"integer","description":"The HTTP status code.","example":400,"isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"detail":{"type":"string","description":"Human-readable explanation of this occurrence. Do not parse it.","example":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"instance":{"type":"string","description":"Unique identifier for this occurrence. Quote it to support.","example":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","isRequired":true,"uniqueKey":"instance","typeLabel":"string"},"errors":{"type":"array","description":"Present on `validation-error`. One entry per invalid field.","items":{"type":"object","required":["pointer","detail"],"properties":{"pointer":{"type":"string","description":"JSON Pointer to the field in the request, for example `#/accountDetails/clabe`.","example":"#/accountDetails/clabe","isRequired":true,"uniqueKey":"errors.items.[INDEX].pointer","typeLabel":"string"},"detail":{"type":"string","description":"What is wrong with the field.","example":"This field is required.","isRequired":true,"uniqueKey":"errors.items.[INDEX].detail","typeLabel":"string"}},"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"required":{"type":"array","description":"Present on `registration-info-required`. Every registration field the route requires, as JSON Pointers into the request, for example `#/registrationInfo/taxId`.","items":{"type":"string","uniqueKey":"required.items.[INDEX]","typeLabel":"string"},"uniqueKey":"required","typeLabel":"string[]"},"missing":{"type":"array","description":"Present on `registration-info-required`. The required fields you must still send, as JSON Pointers into the request.","items":{"type":"string","uniqueKey":"missing.items.[INDEX]","typeLabel":"string"},"uniqueKey":"missing","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"https://docs.etherfuse.com/ramp/v2/errors/quote-expired","title":"Quote expired","status":400,"detail":"quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not exist","instance":"tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d","errors":[{"pointer":"#/accountDetails/clabe","detail":"This field is required."}],"required":["\u003cstring>"],"missing":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"e2afb556-03f4-4063-920b-822ee6d2cce7":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"API key sent in the Authorization header, with no `Bearer` prefix.","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"58ef8c25-fe99-4a3a-b3d6-63ae68d90d12":{"url":"https://api.sand.etherfuse.com","description":"Sandbox"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"Authorization","description":"API key sent in the Authorization header, with no `Bearer` prefix.","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"Authorization","type":"string","description":"API key sent in the Authorization header, with no `Bearer` prefix.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"openapi-v2.json"},"subdomain":"etherfuse","siteName":"Etherfuse API","title":"Register payment account - Etherfuse API","navMaps":{"firstHrefInVersion":{"v2 (beta)":{"href":"/v2/api-reference/payment-accounts/register-payment-account","matchLevel":0},"v1 (legacy)":{"href":"/introduction","matchLevel":4}},"firstHrefInLanguage":{}},"lastModified":"2026-10-14T23:35:07.610Z","originalFileLocation":"v2/api-reference/payment-accounts/register-payment-account.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=\"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness. State where the account lives in one of two ways: - Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe). - Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send. Registering does not prove that the customer owns the account. Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization\u0026#x27;s verified identity when we hold it. When a required field is still missing, the request fails with 422 registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422 holder-tax-id-mismatch). You can send any registration field, including ones this route does not require; we check each value\u0026#x27;s format and ignore the fields the route does not use. A name that is not a registration field returns 400 validation-error. Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready. Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409 payment-account-unavailable.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Etherfuse 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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_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/etherfuse/2PYR-_ECBzhTGa_z/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Register payment account - Etherfuse API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness. State where the account lives in one of two ways: - Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe). - Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send. Registering does not prove that the customer owns the account. Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization\u0026#x27;s verified identity when we hold it. When a required field is still missing, the request fails with 422 registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422 holder-tax-id-mismatch). You can send any registration field, including ones this route does not require; we check each value\u0026#x27;s format and ignore the fields the route does not use. A name that is not a registration field returns 400 validation-error. Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready. Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409 payment-account-unavailable.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Etherfuse API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://etherfuse.mintlify.app/_mintlify/api/og/v2?division=Payment+Accounts\u0026amp;title=Register+payment+account\u0026amp;description=Registers+a+bank+account+or+wallet+for+the+organization+in+the+route+and+returns+it+with+its+per-rail+readiness.%0A%0AState+where+the+account+lives+in+one+of+two+wa\u0026amp;theme=a63046a1b6875a84019a21bc\u0026amp;signature=86ea9a4a14e3abf1dc4218d66163fa67ac3c4b0e760f9ccf302c4cc6142c1bc6\">\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=\"Register payment account - Etherfuse API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness. State where the account lives in one of two ways: - Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe). - Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send. Registering does not prove that the customer owns the account. Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization\u0026#x27;s verified identity when we hold it. When a required field is still missing, the request fails with 422 registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422 holder-tax-id-mismatch). You can send any registration field, including ones this route does not require; we check each value\u0026#x27;s format and ignore the fields the route does not use. A name that is not a registration field returns 400 validation-error. Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready. Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409 payment-account-unavailable.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://etherfuse.mintlify.app/_mintlify/api/og/v2?division=Payment+Accounts\u0026amp;title=Register+payment+account\u0026amp;description=Registers+a+bank+account+or+wallet+for+the+organization+in+the+route+and+returns+it+with+its+per-rail+readiness.%0A%0AState+where+the+account+lives+in+one+of+two+wa\u0026amp;theme=a63046a1b6875a84019a21bc\u0026amp;signature=86ea9a4a14e3abf1dc4218d66163fa67ac3c4b0e760f9ccf302c4cc6142c1bc6\">\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/etherfuse/2PYR-_ECBzhTGa_z/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Etherfuse API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#141414\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2/api-reference/payment-accounts/register-payment-account.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.etherfuse.com/#organization\",\"name\":\"Etherfuse API\",\"url\":\"https://docs.etherfuse.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/etherfuse/XRSchVFGUgreQatD/img/logo-black.svg?fit=max\u0026auto=format\u0026n=XRSchVFGUgreQatD\u0026q=85\u0026s=92cf84eca27df4a19f7b032da398d110\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.etherfuse.com#website\",\"name\":\"Etherfuse API\",\"url\":\"https://docs.etherfuse.com\",\"publisher\":{\"@id\":\"https://docs.etherfuse.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account#webpage\",\"url\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account\",\"name\":\"Register payment account\",\"description\":\"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness. State where the account lives in one of two ways: - Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe). - Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send. Registering does not prove that the customer owns the account. Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization's verified identity when we hold it. When a required field is still missing, the request fails with 422 registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422 holder-tax-id-mismatch). You can send any registration field, including ones this route does not require; we check each value's format and ignore the fields the route does not use. A name that is not a registration field returns 400 validation-error. Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready. Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409 payment-account-unavailable.\",\"dateModified\":\"2026-10-14T23:35:07.610Z\",\"isPartOf\":{\"@id\":\"https://docs.etherfuse.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Etherfuse API\",\"item\":\"https://docs.etherfuse.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Register payment account\",\"item\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account#apireference\",\"headline\":\"Register payment account\",\"name\":\"Register payment account\",\"description\":\"Registers a bank account or wallet for the organization in the route and returns it with its per-rail readiness. State where the account lives in one of two ways: - Bank account: set kind to bank, send country and currency (for example MX and MXN), and describe the account in accountDetails (for example a clabe). - Wallet: set kind to wallet and send accountDetails of kind address with its chain. Do not send country or currency for a wallet. A wallet requires no registrationInfo, and we ignore any you send. Registering does not prove that the customer owns the account. Registration info. A bank account route requires holder fields such as accountHolderName and taxId. We fill each one from the organization's verified identity when we hold it. When a required field is still missing, the request fails with 422 registration-info-required, and the problem lists every required field in required and the ones still needed in missing, as JSON Pointers into the request (for example #/registrationInfo/taxId). Send the missing fields in registrationInfo and retry. A supplied taxId must match the verified one (422 holder-tax-id-mismatch). You can send any registration field, including ones this route does not require; we check each value's format and ignore the fields the route does not use. A name that is not a registration field returns 400 validation-error. Readiness. A new account starts pending, and so does each rail direction. We register it with the payment provider, then move each direction to ready or rejected. Subscribe to paymentAccountUpdated, or read the account again, and quote a direction once it is ready. Registering an account again. If the organization already holds the account, you get it back with 200. When a direction was rejected, we register the account with the provider again using the registrationInfo you send, and those directions go back to pending. Otherwise we change nothing. If another organization holds it, the request fails with 409 payment-account-unavailable.\",\"url\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account\",\"mainEntityOfPage\":{\"@id\":\"https://docs.etherfuse.com/v2/api-reference/payment-accounts/register-payment-account#webpage\"},\"dateModified\":\"2026-10-14T23:35:07.610Z\",\"publisher\":{\"@id\":\"https://docs.etherfuse.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.etherfuse.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Etherfuse API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Etherfuse API","nav":{"global":null,"versions":[{"version":"v2 (beta)","default":true,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/v2"}]},{"tab":"API Reference","pages":[{"title":"Introduction","href":"/v2/api-reference/introduction"},{"title":"API Authentication","href":"/v2/authentication"},{"title":"Errors","href":"/v2/errors"},{"title":"Pagination","href":"/v2/pagination"},{"title":"Idempotency","href":"/v2/idempotency"},{"group":"User Authentication","icon":"key","pages":[{"openapi":"openapi-v2.json POST /auth/launch","title":"Launch a user into the app","href":"/v2/api-reference/authentication/launch-a-user-into-the-app"},{"openapi":"openapi-v2.json GET /auth/launch","title":"Launch a user via postMessage","href":"/v2/api-reference/authentication/launch-a-user-via-postmessage"},{"title":"Exchange a partner JWT","openapi":"openapi-v2.json POST /auth/token","description":"OAuth 2.0 token endpoint ([RFC 6749 §3.2](https://www.rfc-editor.org/rfc/rfc6749#section-3.2)). Exchanges a partner-signed JWT for an Etherfuse access/refresh token pair, or refreshes an existing session.\n\nCall this from your backend to provision a user ahead of a launch, or to prefetch a `refresh_token` that speeds up the launch redirect. Your backend signs a JWT with the key behind your registered JWKS and posts it here. To drop a user straight into the app in a browser, use [POST /auth/launch](/v2/api-reference/authentication/launch-a-user-into-the-app) instead.\n\n## Grant types\n\n- `urn:ietf:params:oauth:grant-type:jwt-bearer` ([RFC 7523](https://www.rfc-editor.org/rfc/rfc7523)). Put the partner JWT in `assertion`.\n- `refresh_token` ([RFC 6749 §6](https://www.rfc-editor.org/rfc/rfc6749#section-6)). Put a prior `refresh_token` in `refresh_token`.\n\n## The JWT\n\nSign it with the key behind your registered JWKS (see [Sign a user JWT](/v2/guides/jwt-authentication#sign-a-user-jwt) for full detail). Claims:\n\n- **`iss`**: your registered issuer.\n- **`sub`**: the person signing in; a UUID is _strongly recommended_ (for an individual customer it's the same value as their organization's `id`, and for a business member it's their `memberId`). Must name a person, never a business: a business org id is rejected with `invalid_grant`, and a `sub` can't be reused as a business org id ([POST /organization](/v2/api-reference/organizations/create-organization) returns 409). A non-UUID `sub` still signs in, but can't be addressed through the Ramp API.\n- **`aud`**: the token endpoint URL, `https://api.etherfuse.com/auth/token` (`https://api.sand.etherfuse.com/auth/token` in sandbox).\n- **`scope`**: required. Names the flow the user may complete (see [User Launch Flows](/v2/guides/user-launch-flows#scopes)); an unrecognized scope is rejected with `invalid_scope`.\n- **`jti`** / **`nonce`**: a fresh value, unique per token, for replay protection. You can send it as `jti` (the standard JWT ID) or `nonce` (the standard OIDC claim).\n- **`exp`, `iat`**: required; keep tokens short-lived.\n- **`email`, `name`**: required; populate the user's profile. `picture` is optional.\n\nThis endpoint is unauthenticated: the signed JWT (or refresh token) is the credential. Do **not** send an API key.","href":"/v2/api-reference/authentication/exchange-a-partner-jwt"}]},{"group":"Payment Accounts","icon":"building-columns","pages":[{"title":"Register payment account","openapi":"openapi-v2.json POST /organization/{organizationId}/payment_account","href":"/v2/api-reference/payment-accounts/register-payment-account"},{"title":"Get registration requirements","openapi":"openapi-v2.json GET /organization/{organizationId}/payment_account/requirements","description":"Returns what you need to send to register an account of this kind for the organization in the route: the `accountDetails` fields for the identifier kind, and the `registrationInfo` fields the route requires. `registrationInfo.missing` lists the required fields we hold no verified value for, so you ask the customer only for those. Pass the same `kind`, `country`, `currency` and `accountDetails.kind` you would send to register.","href":"/v2/api-reference/payment-accounts/get-registration-requirements"},{"title":"Get payment account","openapi":"openapi-v2.json GET /organization/{organizationId}/payment_account/{id}","href":"/v2/api-reference/payment-accounts/get-payment-account"},{"title":"Update payment account","openapi":"openapi-v2.json PATCH /organization/{organizationId}/payment_account/{id}","href":"/v2/api-reference/payment-accounts/update-payment-account"},{"title":"List payment accounts","openapi":"openapi-v2.json GET /organization/{organizationId}/payment_accounts","href":"/v2/api-reference/payment-accounts/list-payment-accounts"}]},{"group":"Quotes","icon":"tag","pages":[{"title":"Create quote","openapi":"openapi-v2.json POST /organization/{organizationId}/quote","href":"/v2/api-reference/quotes/create-quote"}]},{"group":"Orders","icon":"receipt","pages":[{"title":"Create order","openapi":"openapi-v2.json POST /organization/{organizationId}/order","href":"/v2/api-reference/orders/create-order"},{"title":"Get order","openapi":"openapi-v2.json GET /organization/{organizationId}/order/{id}","href":"/v2/api-reference/orders/get-order"},{"title":"List orders","openapi":"openapi-v2.json GET /orders","href":"/v2/api-reference/orders/list-orders"},{"title":"Cancel order","openapi":"openapi-v2.json POST /organization/{organizationId}/order/{id}/cancel","href":"/v2/api-reference/orders/cancel-order"},{"title":"Refresh funding instructions","openapi":"openapi-v2.json POST /organization/{organizationId}/order/{id}/funding_instructions/refresh","href":"/v2/api-reference/orders/refresh-funding-instructions"},{"title":"Prepare claim","openapi":"openapi-v2.json POST /organization/{organizationId}/order/{id}/claim","href":"/v2/api-reference/orders/prepare-claim"},{"title":"Submit authorization","openapi":"openapi-v2.json POST /organization/{organizationId}/order/{id}/authorization","href":"/v2/api-reference/orders/submit-authorization"}]},{"group":"Webhook Subscriptions","icon":"bell","pages":[{"title":"Create webhook subscription","openapi":"openapi-v2.json POST /webhook_subscription","href":"/v2/api-reference/webhook-subscriptions/create-webhook-subscription"},{"title":"Get webhook subscription","openapi":"openapi-v2.json GET /webhook_subscription/{id}","href":"/v2/api-reference/webhook-subscriptions/get-webhook-subscription"},{"title":"Delete webhook subscription","openapi":"openapi-v2.json DELETE /webhook_subscription/{id}","href":"/v2/api-reference/webhook-subscriptions/delete-webhook-subscription"},{"title":"List webhook subscriptions","openapi":"openapi-v2.json GET /webhook_subscriptions","href":"/v2/api-reference/webhook-subscriptions/list-webhook-subscriptions"}]},{"group":"Webhook Events","icon":"tower-broadcast","pages":[{"title":"orderUpdated","openapi":"openapi-v2.json webhook orderUpdated","href":"/v2/api-reference/webhook-events/orderupdated"},{"title":"paymentAccountUpdated","openapi":"openapi-v2.json webhook paymentAccountUpdated","href":"/v2/api-reference/webhook-events/paymentaccountupdated"},{"title":"kycUpdated","openapi":"openapi-v2.json webhook kycUpdated","href":"/v2/api-reference/webhooks/kycupdated"},{"title":"kybUpdated","openapi":"openapi-v2.json webhook kybUpdated","href":"/v2/api-reference/webhook-events/kybupdated"}]},{"group":"Organizations","icon":"building","pages":[{"title":"Get your organization","openapi":"openapi-v2.json GET /me","href":"/v2/api-reference/organizations/get-me"},{"title":"Set your default partner fee","openapi":"openapi-v2.json PATCH /me","href":"/v2/api-reference/organizations/update-me"},{"title":"List customer organizations","openapi":"openapi-v2.json GET /organizations","href":"/v2/api-reference/organizations/list-organizations"},{"title":"Create customer organization","openapi":"openapi-v2.json POST /organization","href":"/v2/api-reference/organizations/create-organization"},{"title":"Get organization","openapi":"openapi-v2.json GET /organization/{organizationId}","href":"/v2/api-reference/organizations/get-organization"},{"title":"Rename organization","openapi":"openapi-v2.json PATCH /organization/{organizationId}","href":"/v2/api-reference/organizations/update-organization"}]},{"group":"Members","icon":"users","pages":[{"title":"Add organization member","openapi":"openapi-v2.json POST /organization/{organizationId}/member","href":"/v2/api-reference/members/add-organization-member"},{"title":"List organization members","openapi":"openapi-v2.json GET /organization/{organizationId}/members","href":"/v2/api-reference/members/list-organization-members"},{"title":"Remove organization member","openapi":"openapi-v2.json DELETE /organization/{organizationId}/member/{memberId}","href":"/v2/api-reference/members/remove-organization-member"},{"title":"Revoke organization invite","openapi":"openapi-v2.json DELETE /organization/{organizationId}/member_invite/{email}","href":"/v2/api-reference/members/revoke-organization-invite"},{"title":"List a member's organizations","openapi":"openapi-v2.json GET /member/{memberId}/organizations","href":"/v2/api-reference/members/list-member-organizations"}]},{"group":"KYC","icon":"id-card","pages":[{"title":"Get KYC status","openapi":"openapi-v2.json GET /organization/{organizationId}/kyc","href":"/v2/api-reference/kyc/get-kyc-status"},{"title":"Submit verification data","openapi":"openapi-v2.json POST /organization/{organizationId}/verification","href":"/v2/api-reference/kyc/submit-verification-data"},{"title":"Upload verification documents","openapi":"openapi-v2.json POST /organization/{organizationId}/verification/documents","href":"/v2/api-reference/kyc/upload-verification-documents"},{"title":"Submit a verification questionnaire","openapi":"openapi-v2.json POST /organization/{organizationId}/verification/questionnaire","href":"/v2/api-reference/kyc/submit-a-verification-questionnaire"},{"title":"Import a verified session","openapi":"openapi-v2.json POST /organization/{organizationId}/verification/import","href":"/v2/api-reference/kyc/import-a-verified-session"},{"title":"List occupation categories","openapi":"openapi-v2.json GET /verification/occupations","href":"/v2/api-reference/kyc/list-occupation-categories"}]},{"group":"KYB","icon":"briefcase","pages":[{"title":"Get KYB status","openapi":"openapi-v2.json GET /organization/{organizationId}/kyb","href":"/v2/api-reference/kyb/get-kyb-status"}]},{"group":"Assets","icon":"coins","pages":[{"title":"List supported assets","openapi":"openapi-v2.json GET /supported_assets","href":"/v2/api-reference/assets/list-supported-assets"},{"title":"Get payment account balances","openapi":"openapi-v2.json GET /organization/{organizationId}/payment_account/{id}/balances","href":"/v2/api-reference/assets/get-payment-account-balances"}]},{"group":"Statements","icon":"file-invoice-dollar","pages":[{"title":"List partner statements","openapi":"openapi-v2.json GET /partner_statements","href":"/v2/api-reference/statements/list-partner-statements"},{"title":"Download statement CSV","openapi":"openapi-v2.json GET /partner_statement/{year}-{month}/csv","href":"/v2/api-reference/statements/download-statement-csv"},{"title":"Download statement PDF","openapi":"openapi-v2.json GET /partner_statement/{year}-{month}/pdf","href":"/v2/api-reference/statements/download-statement-pdf"}]},{"group":"Sandbox","icon":"flask","pages":[{"title":"Simulate fiat received","openapi":"openapi-v2.json POST /organization/{organizationId}/order/{id}/fiat_received","href":"/v2/api-reference/sandbox/simulate-fiat-received"}]},{"group":"Lookup API","icon":"magnifying-glass","pages":[{"title":"List exchange rates","openapi":"openapi-v2.json GET /lookup/exchange_rate","href":"/v2/api-reference/lookup/list-exchange-rates"},{"title":"Get exchange rate","openapi":"openapi-v2.json GET /lookup/exchange_rate/usd_to_{currency}","href":"/v2/api-reference/lookup/get-exchange-rate"},{"title":"List stablebonds","openapi":"openapi-v2.json GET /lookup/stablebonds","href":"/v2/api-reference/lookup/list-stablebonds"},{"title":"Get stablebond","openapi":"openapi-v2.json GET /lookup/stablebond/{identifier}","href":"/v2/api-reference/lookup/get-stablebond"},{"title":"List token costs","openapi":"openapi-v2.json GET /lookup/tokens/cost","href":"/v2/api-reference/lookup/list-token-costs"},{"title":"Get token cost","openapi":"openapi-v2.json GET /lookup/tokens/cost/{identifier}","href":"/v2/api-reference/lookup/get-token-cost"},{"title":"List country codes","openapi":"openapi-v2.json GET /lookup/country-codes","href":"/v2/api-reference/lookup/list-country-codes"},{"title":"List restricted countries","openapi":"openapi-v2.json GET /lookup/restricted-countries","href":"/v2/api-reference/lookup/list-restricted-countries"}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},{"version":"v1 (legacy)","pages":[{"title":"v1 (legacy)","href":"/introduction"}]}]},"basePath":"","title":"Register payment account - Etherfuse API","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","Page-Buji1S4J.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}