Charge a customer’s saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused.
The card must have been saved on an earlier checkout. See Charge a saved card.
This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received.
Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.
The amount to collect, as a decimal string (for example "29.00"). Must be greater than zero. This is the amount before the processing fee: when your account passes the fee to the customer, the card is charged more than this and the response amount shows the total.
The currency of amount, in ISO 4217 format (for example USD). Your account must be able to collect card payments in this currency, or the request is refused with PAYMENT_METHOD_NOT_ENABLED.
The saved card to charge, by its pm_ id. Omit to charge the customer's default saved card, which is the first card they saved. A card belonging to a different customer is refused with SAVED_PAYMENT_METHOD_NOT_FOUND.
Current status of the payment. created: the charge exists and no attempt has succeeded yet. processing: an attempt is in flight and is being verified. succeeded: the payment is confirmed and settled in full. accepted: an underpayment or overpayment was accepted as final settlement. failed: the payment failed and no funds were captured. expired: the payment window elapsed before any payment arrived. cancelled: cancelled before completion. refunded: the full amount was returned to the customer. partially_refunded: part of the amount was returned to the customer. auto_refunded: we automatically returned the full amount to the customer. underpaid: the customer paid less than the amount owed. overpaid: the customer paid more than the amount owed.
Why this payment exists. purchase: a one-time purchase. subscription_create: the first cycle of a new subscription. subscription_cycle: a subscription renewal. subscription_update: an off-cycle charge from a mid-cycle plan change (proration).
The processing fee on this payment, in the currency it was charged in. Prefer this over fee_usd when the payment was not collected in USD: fee_usd is a conversion of the same fee, this is the amount actually taken. null on a payment that carries no processing fee. See Fees.
What the platform took out of this sale, beside the gross it was taken from, in the base currency of the sale. null when the charge carried no platform fee, and on a charge that split the sale with transfer_data.amount instead. See Platform fees.
The seller's contracted share of this sale, in the base currency of the sale. Null on a charge that carries no split, and on one that split the sale with platform_fee instead.
Who Bachs's processing fee actually came from on this charge, read back from the ledger posting rather than a flag decided in advance. merchant: the fee came out of the charge. platform: the platform's own balance covered it. On a destination charge this never reads platform; the fee always comes from the charge there. See Processing fees.
How the payment was collected, usually named by rail and currency together, such as USD_CARD, NGN_CARD, NGN_BANK_TRANSFER, MOMO_GHS, or CRYPTO. A payment requested with a general method name can return BANK_TRANSFER or MOBILE_MONEY, so accept both forms for the same rail; null means the payment never reached a provider.
Who paid and how, read from the attempt that succeeded. Returned on a single payment and on the collection.succeeded webhook, not on the payment list. null on payments taken before this field existed, and on payment methods that tell us nothing about the payer.
The shape is keyed by type. For bank_transfer, the bank_transfer object carries sender_name, sender_bank, sender_bank_code, sender_account_number (the full account the money came from, which you need to send money back to the sender), session_id (the interbank reference for the transfer) and narration. Which of those are present depends on what the sending bank passed on, so treat each as optional. It also carries a virtual_account object naming the account number the money landed in: id, account_number, bank_name, type (permanent for an account you keep, one_time for a number created for a single checkout) and expires_at.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Bachs","description":"Payments and billing infrastructure for internet businesses. Accept payments globally through hosted or overlay checkout, run subscriptions and free trials, and settle in your currency. REST API with a full sandbox.","colors":{"primary":"#5266eb","light":"#8fb6fb","dark":"#5266eb"},"logo":{"light":"https://mintcdn.com/bachs/8QOZkInmSDP5Ad7N/logo.png?fit=max\u0026auto=format\u0026n=8QOZkInmSDP5Ad7N\u0026q=85\u0026s=9d4369b7a7ceeb9d196f647822f4ea01","dark":"https://mintcdn.com/bachs/8QOZkInmSDP5Ad7N/logo-dark.png?fit=max\u0026auto=format\u0026n=8QOZkInmSDP5Ad7N\u0026q=85\u0026s=a6ad42659c02e7126806019cafab7bae"},"favicon":"https://mintcdn.com/bachs/OmvT4wSHNg_ay0Sy/favicon.png?fit=max\u0026auto=format\u0026n=OmvT4wSHNg_ay0Sy\u0026q=85\u0026s=fa1681d092d772a654316ae4012045fb","api":{"openapi":"docs/openapi/openapi.json","playground":{"display":"interactive"},"examples":{"defaults":"all","languages":["bash","javascript","python","go"],"prefill":true,"autogenerate":true}},"appearance":{"default":"dark","strict":false},"background":{"color":{"light":"#fbfcfd","dark":"#1e1e2a"}},"navbar":{"links":[{"href":"https://cal.com/bolu-dada/bachs","label":"Book a Demo"}],"primary":{"type":"button","label":"Get Started","href":"https://app.bachs.io/signup"}},"footer":{"socials":{"x":"https://x.com/bachs_hq","website":"https://bachs.io"},"links":[{"header":"Bachs","items":[{"label":"Dashboard","href":"https://app.bachs.io"},{"label":"llms.txt","href":"https://docs.bachs.io/llms.txt"},{"label":"Support","href":"mailto:support@bachs.io"}]}]},"seo":{"metatags":{"google-site-verification":"xCFt-c27YambrzzvRTU4CiqeElNFKGVJZw_8o9IgpdA"}},"fonts":{"heading":{"family":"Geist","weight":600},"body":{"family":"Geist"}},"styling":{"codeblocks":"dark","latex":true},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"variables":{"api-url":"https://api.bachs.io"},"markdown":{"instructions":["Money is always a decimal string at the currency's precision (for example \"29.00\"), paired with an ISO 4217 currency field. Never use minor units.","Build against the sandbox first: base URL https://sandbox-api.bachs.io with sk_sandbox_ keys. Production is https://api.bachs.io with sk_live_ keys; going live is a key swap.","Treat webhooks (for example collection.succeeded) as the source of truth for fulfilment, never client-side events or redirects.","Subscriptions are created by completing a checkout for a recurring product. There is no direct create-subscription endpoint.","IDs carry resource prefixes (cust_, prod_, sub_, chk_, inv_, ref_) and timestamps are ISO 8601 UTC."]},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"bachs","hasAudioNarration":false,"actualSubdomain":"bachs","customDomains":["docs.bachs.io"],"gitSource":{"type":"github","owner":"bachsdev","repo":"bachs-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{},"buildId":"6af329033cb52e19ebcd1d76","clientVersion":"0.0.4094","searchFilterCounts":[{"language":"default","tag":"API reference","count":98},{"language":"default","tag":"Developers","count":60},{"language":"default","tag":"Webhooks","count":46},{"language":"default","tag":"Connect (Sub accounts)","count":37},{"language":"default","tag":"Get started","count":31},{"language":"default","tag":"Events","count":29},{"language":"default","tag":"Payments","count":26},{"language":"default","tag":"Payouts","count":16},{"language":"default","tag":"Subscriptions","count":14},{"language":"default","tag":"Endpoint API","count":14}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"editor-metadata","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":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@font-face{font-family:\"Geist Pixel\";src:url(\"/fonts/GeistPixel-Square.woff2\") format(\"woff2\");font-weight:400;font-display:swap}code,pre,kbd,samp,.font-mono{font-family:\"Geist Mono\", ui-monospace, Consolas, monospace}.pixel{font-family:\"Geist Pixel\", \"Geist Mono\", monospace;font-weight:400;letter-spacing:0.01em}#navbar img{height:24px;width:auto}.section-cover{border-radius:1rem;width:100%;max-width:600px;height:auto;display:block}.home-hero{background:#5266eb url(\"/images/home/pixels.svg\") center / cover no-repeat;color:#fff;border-radius:1.5rem}.home-hero h1,.home-hero p{color:#fff}.home-btn{display:inline-block;background:#1e1e2a;color:#fff!important;font-weight:600;border-radius:0.6rem;padding:0.8rem 1.3rem;text-decoration:none!important}.home-btn:hover{background:#0b1a6e}.home-btn-ghost{background:rgba(255, 255, 255, 0.14);border:1px solid rgba(255, 255, 255, 0.4)}.home-btn-ghost:hover{background:rgba(255, 255, 255, 0.24)}body:has(.home) #header{display:none}.home{max-width:1160px;margin:0 auto;padding:1.5rem 1.5rem 5rem}.home>h2{margin:3.5rem 0 1.25rem;font-size:1.75rem;font-weight:600;letter-spacing:-0.01em;color:#1e1e2a}.dark .home>h2{color:#f4f5f9}.home{overflow-x:clip}.home-hero{display:grid;grid-template-columns:1fr 1fr;gap:2rem;align-items:center;padding:3.5rem 3rem;overflow:hidden}.home-eyebrow{font-family:\"Geist Mono\", monospace;font-size:0.8rem;letter-spacing:0.12em;text-transform:uppercase;opacity:0.8;margin:0 0 1rem}.home-hero h1{font-size:3rem;line-height:1.08;font-weight:600;letter-spacing:-0.02em;margin:0 0 1.25rem}.home-hero h1 .pixel{font-size:0.92em}.home-copy>p:not(.home-eyebrow){font-size:1.125rem;line-height:1.6;opacity:0.92;margin:0 0 1.75rem;max-width:34rem}.home-actions{display:flex;gap:0.75rem;flex-wrap:wrap}.home-collage{position:relative;height:400px}.shot{position:absolute;border-radius:12px;box-shadow:0 24px 60px rgba(11, 26, 110, 0.45);background:#fff center / cover no-repeat}.shot-checkout{right:0;bottom:0;width:80%;aspect-ratio:1200 / 788;background-image:url(\"/images/home/hero-checkout.webp\")}.shot-event{right:-3%;top:0;width:34%;aspect-ratio:620 / 941;opacity:0.78;background-image:url(\"/images/home/hero-event.webp\")}.shot-balance{left:0;top:5%;width:44%;aspect-ratio:900 / 725;opacity:0.78;background-image:url(\"/images/home/hero-balance.webp\")}@media (min-width: 1280px){body:not(:has(.home)) #content-container{max-width:1080px}}.shot-row{display:grid;grid-template-columns:1fr 1.5fr;gap:2.5rem;align-items:center}.shot-row>div>:first-child{margin-top:0}.mdx-content img[src*=\"images/product/\"]{max-width:820px;margin-left:auto;margin-right:auto}.shot-row img{margin:0;width:100%;height:auto!important;aspect-ratio:auto!important}.shot-row [data-as=\"p\"],.build [data-as=\"p\"]{display:block;margin:0 0 1rem}.card.rounded-2xl{border-radius:0.6rem}.card .px-6.py-5{padding:1rem 1.25rem}.card h2.not-prose{color:#5266eb;font-weight:500;font-size:0.95rem}.dark .card h2.not-prose{color:#8f9cf7}.card .prose{font-size:0.875rem;line-height:1.45}@media (max-width: 760px){.shot-row{grid-template-columns:minmax(0, 1fr)}}.home-tasks,.home-products{display:grid;grid-template-columns:repeat(4, 1fr);gap:2rem}.home-tasks{margin-top:3rem}.home-tasks h3,.home-products h3{font-size:0.95rem;font-weight:600;margin:0 0 0.75rem;color:#1e1e2a}.dark .home-tasks h3,.dark .home-products h3{color:#f4f5f9}.home-tasks a{display:block;margin:0 0 0.55rem;color:#5266eb;font-weight:500;text-decoration:none}.dark .home-tasks a{color:#8f9cf7}.home-products a{display:block;margin:0 0 1rem;text-decoration:none}.home-products strong{display:block;font-weight:600;color:#5266eb}.dark .home-products strong{color:#8f9cf7}.home-products span{display:block;font-size:0.9rem;line-height:1.45;color:#62647b}.dark .home-products span{color:#b4b8cc}.home-tasks a:hover,.home-products a:hover strong{text-decoration:underline}.build{display:grid;grid-template-columns:1fr 1.5fr;gap:2rem;align-items:start;border:1px solid rgba(112, 115, 147, 0.2);border-radius:1.25rem;padding:1.75rem;background:#f4f5f9}.dark .build{background:rgba(255, 255, 255, 0.03);border-color:rgba(255, 255, 255, 0.1)}.build h3{margin:0 0 0.75rem;font-size:1.25rem}.build>div:first-child p{color:#62647b}.dark .build>div:first-child p{color:#b4b8cc}.build>div:first-child p a{color:#5266eb;font-weight:600}.build .code-group,.build .code-block{margin:0!important}@media (max-width: 760px){.home-hero,.build{grid-template-columns:1fr}.home-tasks,.home-products{grid-template-columns:1fr 1fr}.home-hero{padding:2rem 1.5rem}.home-hero h1{font-size:2.1rem}.home{padding:0.5rem 1rem 4rem}.home-collage{height:auto}.shot-balance,.shot-event{display:none}.shot-checkout{position:relative;width:100%}}.project-modal-overlay{display:none}.project-modal-overlay:target{display:flex;position:fixed;top:var(--scroll-mt, 6rem);right:0;bottom:0;left:0;align-items:center;justify-content:center;z-index:999;padding:24px;pointer-events:none}.project-modal-box{width:100%;max-width:560px;max-height:100%;overflow-y:auto;border-radius:1rem;padding:2rem 1.5rem 1.5rem;position:relative;box-shadow:0 20px 50px rgba(0, 0, 0, 0.25);pointer-events:auto;scrollbar-width:thin;scrollbar-color:rgba(0, 0, 0, 0.25) transparent}.dark .project-modal-box{box-shadow:0 20px 50px rgba(0, 0, 0, 0.5);scrollbar-color:rgba(255, 255, 255, 0.25) transparent}.project-modal-box::-webkit-scrollbar{width:8px}.project-modal-box::-webkit-scrollbar-track{background:transparent}.project-modal-box::-webkit-scrollbar-thumb{background:rgba(0, 0, 0, 0.2);border-radius:9999px}.dark .project-modal-box::-webkit-scrollbar-thumb{background:rgba(255, 255, 255, 0.2)}.project-modal-close{position:absolute;top:0.75rem;right:0.75rem;width:1.75rem;height:1.75rem;display:flex;align-items:center;justify-content:center;border-radius:9999px;font-size:1.25rem;line-height:1;text-decoration:none}.project-modal-close:hover{background:rgba(128, 128, 128, 0.15)}.project-modal-box .prose{--tw-prose-body: inherit}.project-modal-box .prose>*:first-child{margin-top:0}.project-modal-box .prose>*:last-child{margin-bottom:0}"},{"filePath":"figures.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2JL7SUc.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa0ZL7SUc.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2ZL7SUc.woff2) format('woff2');\n unicode-range: U+1F00-1FFF;\n}\n/* greek */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1pL7SUc.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa2pL7SUc.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa25L7SUc.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/inter/v20/UcC73FwrK3iLTeHuS_nVMrMxCp50SjIa1ZL7.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n.pshot{--ink: #1a1a27;--body: #2f2f42;--cap: #72728c;--line: rgba(167, 167, 184, .32);--fill: #f0f0f3;--tint: #f3f3fb;--accent: #4c5fd5;--green: #188554;position:relative;padding:4px 0 28px;font:400 13.5px/1.45 Inter, system-ui, sans-serif;color:var(--body)}.pshot *{box-sizing:border-box;margin:0}.pshot b{font-weight:600;color:var(--ink)}.pshot .card{background:#fff;border:1px solid var(--line);border-radius:12px;overflow:hidden}.pshot .float{position:absolute;z-index:1;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 22px 44px -16px rgba(15, 18, 40, .38), 0 2px 6px rgba(15, 18, 40, .08)}.pshot .pad{padding:18px 20px}.pshot .h{font-size:17px;font-weight:600;color:var(--ink);letter-spacing:-.01em}.pshot .cap{color:var(--cap);font-size:12.5px}.pshot .row{display:flex;align-items:center;justify-content:space-between;gap:12px}.pshot .btn{display:inline-block;padding:8px 18px;border-radius:999px;background:var(--accent);color:#fff;font-weight:500}.pshot .btn.off{background:#b9c1f6}.pshot .chip{display:inline-block;padding:2px 9px;border-radius:999px;background:var(--fill);font-size:12px;font-weight:500}.pshot .tag{display:inline-block;padding:1px 7px;border-radius:5px;background:var(--accent);color:#fff;font-size:10.5px;font-weight:600;letter-spacing:.05em}.pshot .win-bar{display:flex;align-items:center;gap:6px;padding:9px 12px;border-bottom:1px solid var(--line);background:#fafafc}.pshot .win-bar i{width:8px;height:8px;border-radius:50%;background:#dcdde6}.pshot .win-url{margin:0 auto;padding:2px 40px;border-radius:6px;background:var(--fill);font-size:11px;color:var(--cap)}.pshot .split2{display:grid;grid-template-columns:1fr 1.15fr}.pshot .summary{background:var(--tint);padding:22px 20px 26px}.pshot .price{font-size:26px;font-weight:600;color:var(--ink);letter-spacing:-.02em;margin-top:2px}.pshot .picker{display:inline-flex;align-items:center;gap:6px;margin-top:14px;padding:6px 10px;border:1px solid var(--line);border-radius:9px;background:#fff;font-weight:500;color:var(--ink)}.pshot .totals{margin-top:18px;border-top:1px solid var(--line)}.pshot .totals .row{padding:9px 0;border-bottom:1px solid var(--line)}.pshot .methods{padding:18px 18px 20px}.pshot .expires{display:table;margin:0 0 12px auto;padding:3px 10px;border-radius:999px;background:#fff4e5;color:#a8640b;font-size:12px;font-weight:500}.pshot .mlist{border:1px solid var(--line);border-radius:12px;overflow:hidden}.pshot .m{display:flex;align-items:center;gap:10px;padding:11px 12px;border-top:1px solid var(--line);color:var(--ink)}.pshot .m:first-child{border-top:0}.pshot .m.on{flex-wrap:wrap;box-shadow:inset 0 0 0 1.5px var(--accent);border-radius:12px}.pshot .radio{flex:none;width:15px;height:15px;border-radius:50%;border:1.5px solid #b9b9c8}.pshot .on .radio{border:5px solid var(--accent)}.pshot .m .note{flex-basis:100%;padding:9px 11px;border:1px solid var(--line);border-radius:9px;color:var(--cap);font-size:12.5px}.pshot .m .btn{flex-basis:100%;text-align:center}.pshot .secure{margin-top:12px;text-align:center;color:var(--cap);font-size:12px}.pshot .menu{padding:5px}.pshot .menu div{display:flex;align-items:center;gap:9px;padding:6px 10px;border-radius:7px;color:var(--ink);font-weight:500}.pshot .menu .sel{background:var(--fill)}.pshot .flag{width:18px;height:12px;border-radius:2px;flex:none}.pshot .tabs{display:flex;gap:20px;margin-top:14px;border-bottom:1px solid var(--line);font-weight:500;color:#3d3f52}.pshot .tabs span{padding-bottom:9px}.pshot .tabs .sel{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent)}.pshot .list{margin-top:14px;border:1px solid var(--line);border-radius:10px;overflow:hidden}.pshot .item{display:flex;align-items:center;gap:12px;padding:10px 14px;border-top:1px solid var(--line)}.pshot .item:first-child{border-top:0}.pshot .item.done{background:#f7f7fb}.pshot .num{flex:none;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:12px;border:1px solid #dcdde8;color:var(--cap);background:#fff}.pshot .done .num{border-color:#8f9cf7;background:#eef0fe;color:var(--accent)}.pshot .item .grow{flex:1}.pshot .item small{display:block;color:var(--cap);font-size:12px}.pshot .ok{color:var(--green);font-weight:500;font-size:12.5px}.pshot .bar{height:4px;border-radius:4px;background:#e6e7ef;margin-top:8px}.pshot .bar i{display:block;height:100%;border-radius:4px;background:var(--accent)}.pshot .field{margin-top:12px}.pshot .input{margin-top:5px;padding:8px 11px;border:1px solid var(--line);border-radius:8px;color:var(--ink)}.pshot .group{margin-top:10px;font-size:12px;font-weight:600;color:var(--ink)}.pshot .check{display:flex;align-items:center;gap:8px;margin-top:6px}.pshot .box{flex:none;width:15px;height:15px;border-radius:4px;border:1.5px solid #c3c6dd}.pshot .box.on{border:0;background:var(--accent) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 8.5l2.5 2.5L12 5.5' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\") center / 13px no-repeat}.pshot .kv .row{padding:9px 0;border-top:1px solid var(--line)}.pshot .pills{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}.pshot code{font:12px \"Geist Mono\", ui-monospace, monospace;color:var(--ink)}@media (max-width: 760px){.pshot{padding-bottom:8px!important}.pshot .card,.pshot .term,.pshot .float{width:100%!important}.pshot .float{position:static;margin-top:12px;box-shadow:none}.pshot .spacer{display:none}}[role=\"tabpanel\"]:has(.pshot){overflow:visible}.pshot .opts{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.pshot .opt{padding:6px 12px;border:1px solid var(--line);border-radius:9px}.pshot .opt.sel{border-color:transparent;box-shadow:inset 0 0 0 1.5px var(--accent);color:var(--accent);font-weight:500}.pshot .select{display:flex;justify-content:space-between;margin-top:5px;padding:8px 11px;border:1px solid var(--line);border-radius:6px;color:var(--ink)}.pshot .select::after{content:\"\\2304\";color:var(--cap)}.pshot .toggle{flex:none;width:30px;height:17px;border-radius:999px;background:#d9d9e2;position:relative}.pshot .toggle::after{content:\"\";position:absolute;left:2px;top:2px;width:13px;height:13px;border-radius:50%;background:#fff}.pshot .choice{display:flex;align-items:center;gap:10px;margin-top:8px;padding:10px 12px;border:1px solid var(--line);border-radius:10px}.pshot .choice.on{border-color:transparent;box-shadow:inset 0 0 0 1.5px var(--accent)}.pshot .choice small{display:block;color:var(--cap);font-size:12px}.pshot .center{text-align:center;margin-top:14px}.pshot .item .grow.cap{white-space:nowrap}.pshot .toggle.on{background:var(--accent)}.pshot .toggle.on::after{left:15px}.pshot .toggle.dim{opacity:.45}.pshot table{width:100%;border-collapse:collapse}.pshot th{text-align:left;font-weight:400;color:var(--cap);font-size:12px;padding:7px 10px;border-bottom:1px solid var(--line)}.pshot td{padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}.pshot tr:last-child td{border-bottom:0}.pshot .badge{padding:2px 7px;border-radius:6px;font-size:11.5px;font-weight:500;background:#e8f6ee;color:var(--green)}.pshot .badge.red{background:#fdecec;color:#c8323c}.pshot .filters{display:flex;gap:6px;margin-top:12px}.pshot .filters span{padding:6px 10px;border:1px solid var(--line);border-radius:8px;color:var(--cap);font-size:12.5px}.pshot .grid3{display:grid;grid-template-columns:repeat(3, 1fr);gap:10px;margin-top:12px}.pshot .grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}.pshot .mini{border:1px solid var(--line);border-radius:10px;padding:11px 12px}.pshot .mini .t{font-size:12px;font-weight:500;color:var(--ink);text-decoration:underline dotted #b9b9c8;text-underline-offset:3px}.pshot .bars{display:flex;align-items:flex-end;gap:6px;height:74px;margin-top:10px}.pshot .bars i{flex:1;border-radius:4px 4px 0 0;background:#c9cef8}.pshot .bars i:last-child{background:var(--accent)}.pshot .dot{display:inline-block;width:9px;height:6px;border-radius:3px;margin-right:6px}.pshot .dim-page{background:#e9eaf0}.pshot .sandbox{padding:7px 14px;background:#fff7e0;color:#8a5a00;font-size:11.5px;text-align:center}.pshot .drag{color:#b4b6c6;letter-spacing:-2px;margin-right:4px}.pshot .x{margin-left:auto;color:var(--cap)}.pshot .plus{margin-left:auto;color:var(--accent);font-size:16px}.pshot .badge,.pshot code{white-space:nowrap}.pshot .badge.blue{background:#eef0fe;color:var(--accent)}.pshot .btn.red{background:#b42318}.pshot .label{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--cap)}.pshot .btn,.pshot .nowrap{white-space:nowrap}.pshot .code{margin-top:6px;padding:10px 12px;border-radius:8px;background:var(--fill);font:11.5px/1.55 \"Geist Mono\", ui-monospace, monospace;color:#8a2a2a;white-space:pre;overflow:hidden}.pshot .side{padding:7px 10px;border-radius:7px;color:var(--body)}.pshot .side.on{background:var(--fill);color:var(--ink);font-weight:500}.pshot.narrow{max-width:620px}.pshot .badge.grey{background:var(--fill);color:var(--cap)}.pshot .notice{margin-top:10px;padding:10px 12px;border-radius:9px;background:#fff4e5;color:#8a5a00;font-size:12.5px}.pshot.diag{max-width:820px;margin:0 auto;padding-bottom:8px}.pshot .term{border-radius:12px;background:#16172a;color:#e9eaf5;overflow:hidden}.pshot .tbar{padding:8px 14px;font-size:12px;color:#a9acc6;background:rgba(255, 255, 255, .04)}.pshot .term pre{margin:0;padding:12px 14px;font:11.5px/1.6 \"Geist Mono\", ui-monospace, monospace;white-space:pre;color:#e9eaf5;overflow:hidden}.pshot .badge.amber{background:#fff4e5;color:#a8640b}.pshot .steps4{display:flex;gap:6px;margin-top:12px}.pshot .steps4 i{flex:1;height:3px;border-radius:2px;background:#e6e7ef}.pshot .steps4 i.on{background:var(--accent)}.pshot .fbox{margin-top:12px;padding:9px 12px;border:1px solid var(--line);border-radius:10px}.pshot .tick{width:44px;height:44px;margin:16px auto 8px;border-radius:50%;border:2px solid var(--accent);color:var(--accent);display:grid;place-items:center;font-size:20px}.pshot .tl{margin-top:12px;padding:8px 12px;border-radius:10px;background:var(--fill)}.pshot .tl div{display:flex;align-items:center;gap:10px;padding:5px 0}.pshot .tl .grow{flex:1}.pshot .tl i{width:8px;height:8px;border-radius:50%;background:#cfd0dc}.pshot .tl .d i{background:#376c47}.pshot .tl .c i{background:#fff;box-shadow:0 0 0 2px #376c47}"}],"page":{"pagePath":"api-reference/payments/create-a-charge","slug":"/api-reference/payments/create-a-charge","pageMetadata":{"title":"Create a charge","description":"Charge a customer's saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused.\n\nThe card must have been saved on an earlier checkout. See [Charge a saved card](/guides/payments/charge-a-saved-card).\n\nThis always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from `status`. The payment is usually `processing`, and the result reaches you as a `collection.succeeded` or `collection.failed` webhook. A card refused while the request is still open comes back already `failed`. A `201` is not payment received.\n\nSend an `Idempotency-Key` header. Without one, a retry after a timeout charges the customer twice.","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/charges","href":"/api-reference/payments/create-a-charge","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n a: \"a\",\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Charge a customer’s saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The card must have been saved on an earlier checkout. See \", _jsx(_components.a, {\n href: \"/guides/payments/charge-a-saved-card\",\n children: \"Charge a saved card\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from \", _jsx(_components.code, {\n children: \"status\"\n }), \". The payment is usually \", _jsx(_components.code, {\n children: \"processing\"\n }), \", and the result reaches you as a \", _jsx(_components.code, {\n children: \"collection.succeeded\"\n }), \" or \", _jsx(_components.code, {\n children: \"collection.failed\"\n }), \" webhook. A card refused while the request is still open comes back already \", _jsx(_components.code, {\n children: \"failed\"\n }), \". A \", _jsx(_components.code, {\n children: \"201\"\n }), \" is not payment received.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" header. Without one, a retry after a timeout charges the customer twice.\"]\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":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Create a charge","description":"Charge a customer's saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused.\n\nThe card must have been saved on an earlier checkout. See [Charge a saved card](/guides/payments/charge-a-saved-card).\n\nThis always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from `status`. The payment is usually `processing`, and the result reaches you as a `collection.succeeded` or `collection.failed` webhook. A card refused while the request is still open comes back already `failed`. A `201` is not payment received.\n\nSend an `Idempotency-Key` header. Without one, a retry after a timeout charges the customer twice.","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/charges","href":"/api-reference/payments/create-a-charge","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["Payments"],"summary":"Create a charge","description":"Charge a customer's saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused.\n\nThe card must have been saved on an earlier checkout. See [Charge a saved card](/guides/payments/charge-a-saved-card).\n\nThis always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from `status`. The payment is usually `processing`, and the result reaches you as a `collection.succeeded` or `collection.failed` webhook. A card refused while the request is still open comes back already `failed`. A `201` is not payment received.\n\nSend an `Idempotency-Key` header. Without one, a retry after a timeout charges the customer twice.","operationId":"createCharge","security":["f48726d7-594c-46c5-98ad-e31d96d6adf1"],"requestBody":"8c9988a8-746d-4fd4-b154-262e296b008e","responses":{"201":"7312e7e0-b25f-4e3a-83ea-7098ebfbd2b3","400":"b2d51c62-bf8a-4520-bea1-b41c1c9cc4b9","401":"a08730a6-f09b-42ce-b97a-6cc94ab9fe72","403":"e1054f6f-f440-4996-9b47-ff59d4717119","404":"d571a3f3-19a9-41ff-9a71-7b25cc50e12e","429":"417b1e8b-58ee-416a-b78f-7b39428fa879","500":"395d1136-fc2c-4e64-9e2c-2cdf93d2e82c"},"method":"post","type":"path","servers":["e2ecbd97-018b-40aa-946f-f32ad71132ed","2dbe01e0-3ef9-4eb7-9ea8-006c3f1e276a"],"path":"/v1/charges","baseUrlOptions":["https://api.bachs.io","https://sandbox-api.bachs.io"],"title":"Create a charge","codeSamples":[],"requestExampleLanguages":["bash","javascript","python","go"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated","prefillPlaygroundWithExample":true,"prefillPlaygroundExamples":[{"body.customer":"cust_1a2b3c4d5e6f","body.amount":"29.00","body.currency":"USD","body.description.oneOf.0":"April usage","body.reference.oneOf.0":"INV-2026-04-881"}]},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["customer","amount","currency"],"properties":{"customer":{"type":"string","description":"The customer to charge, by their `cust_` id. They must already have a saved card, or the request is refused with `NO_SAVED_PAYMENT_METHOD`.","isRequired":true,"uniqueKey":"customer","typeLabel":"string"},"amount":{"type":"string","description":"The amount to collect, as a decimal string (for example `\"29.00\"`). Must be greater than zero. This is the amount before the processing fee: when your account passes the fee to the customer, the card is charged more than this and the response `amount` shows the total.","isRequired":true,"uniqueKey":"amount","typeLabel":"string"},"currency":{"type":"string","description":"The currency of `amount`, in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format (for example `USD`). Your account must be able to collect card payments in this currency, or the request is refused with `PAYMENT_METHOD_NOT_ENABLED`.","isRequired":true,"uniqueKey":"currency","typeLabel":"string"},"payment_method":{"oneOf":[{"type":"string","description":"The saved card to charge, by its `pm_` id. Omit to charge the customer's default saved card, which is the first card they saved. A card belonging to a different customer is refused with `SAVED_PAYMENT_METHOD_NOT_FOUND`.","uniqueKey":"payment_method.oneOf.0","typeLabel":"string"},{"type":"null","description":"The saved card to charge, by its `pm_` id. Omit to charge the customer's default saved card, which is the first card they saved. A card belonging to a different customer is refused with `SAVED_PAYMENT_METHOD_NOT_FOUND`.","uniqueKey":"payment_method.oneOf.1","typeLabel":"null"}],"uniqueKey":"payment_method","typeLabel":"string | null"},"description":{"oneOf":[{"type":"string","maxLength":255,"description":"What the charge is for. Returned as `narration` on the payment, and shown on your dashboard.","uniqueKey":"description.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":255,"description":"What the charge is for. Returned as `narration` on the payment, and shown on your dashboard.","uniqueKey":"description.oneOf.1","typeLabel":"null"}],"uniqueKey":"description","typeLabel":"string | null"},"reference":{"oneOf":[{"type":"string","maxLength":128,"description":"Your own identifier for this charge, returned unchanged on the payment so you can match it to your records.","uniqueKey":"reference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":128,"description":"Your own identifier for this charge, returned unchanged on the payment so you can match it to your records.","uniqueKey":"reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"reference","typeLabel":"string | null"},"metadata":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Key-value pairs you attach to the charge and get back on the payment and its webhooks.","uniqueKey":"metadata.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Key-value pairs you attach to the charge and get back on the payment and its webhooks.","uniqueKey":"metadata.oneOf.1","typeLabel":"null"}],"uniqueKey":"metadata","typeLabel":"object | null"}},"uniqueKey":"","typeLabel":"object"},"example":{"customer":"cust_1a2b3c4d5e6f","amount":"29.00","currency":"USD","description":"April usage","reference":"INV-2026-04-881"},"examples":{"Example":{"title":"Example","value":{"customer":"cust_1a2b3c4d5e6f","amount":"29.00","currency":"USD","description":"April usage","reference":"INV-2026-04-881"}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"7312e7e0-b25f-4e3a-83ea-7098ebfbd2b3":{"description":"Success - Charge created and submitted to the card","content":{"application/json":{"schema":{"type":"object","description":"Detailed payment response for API integrations.","properties":{"payment_id":{"type":"string","description":"Unique identifier for the payment.","example":"pay_1a2b3c4d5e","isRequired":true,"uniqueKey":"payment_id","typeLabel":"string"},"status":{"type":"string","description":"Current status of the payment. `created`: the charge exists and no attempt has succeeded yet. `processing`: an attempt is in flight and is being verified. `succeeded`: the payment is confirmed and settled in full. `accepted`: an underpayment or overpayment was accepted as final settlement. `failed`: the payment failed and no funds were captured. `expired`: the payment window elapsed before any payment arrived. `cancelled`: cancelled before completion. `refunded`: the full amount was returned to the customer. `partially_refunded`: part of the amount was returned to the customer. `auto_refunded`: we automatically returned the full amount to the customer. `underpaid`: the customer paid less than the amount owed. `overpaid`: the customer paid more than the amount owed.","enum":["created","processing","succeeded","accepted","failed","expired","cancelled","refunded","partially_refunded","auto_refunded","underpaid","overpaid"],"x-enum-descriptions":{"created":"Charge created and awaiting payment.","processing":"Payment received and being verified.","succeeded":"Payment confirmed and fully settled.","accepted":"Payment accepted by the processor, pending final confirmation.","failed":"Payment failed; no funds captured.","expired":"Charge expired before payment was received.","cancelled":"Charge cancelled before completion.","refunded":"Full refund issued.","partially_refunded":"Partial refund issued.","auto_refunded":"Full refund issued automatically.","underpaid":"Payment received was less than the requested amount.","overpaid":"Payment received exceeded the requested amount."},"example":"succeeded","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"amount":{"type":"string","description":"Requested amount in `currency`.","example":"10.00","isRequired":true,"uniqueKey":"amount","typeLabel":"string"},"currency":{"type":"string","description":"Payment currency code.","example":"USD","isRequired":true,"uniqueKey":"currency","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp.","example":"2026-04-27T12:00:00Z","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp.","example":"2026-04-27T12:00:05Z","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"reference":{"oneOf":[{"type":"string","description":"Checkout reference when available.","example":"order_9876","uniqueKey":"reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Checkout reference when available.","example":"order_9876","uniqueKey":"reference.oneOf.1","typeLabel":"null"}],"uniqueKey":"reference","typeLabel":"string | null"},"billing_reason":{"type":"string","enum":["purchase","subscription_create","subscription_cycle","subscription_update"],"description":"Why this payment exists. `purchase`: a one-time purchase. `subscription_create`: the first cycle of a new subscription. `subscription_cycle`: a subscription renewal. `subscription_update`: an off-cycle charge from a mid-cycle plan change (proration).","example":"purchase","uniqueKey":"billing_reason","typeLabel":"enum\u003cstring>"},"checkout_id":{"oneOf":[{"type":"string","description":"Checkout identifier, when linked.","example":"chk_8T9u0V1w2X3y4Z5a","uniqueKey":"checkout_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Checkout identifier, when linked.","example":"chk_8T9u0V1w2X3y4Z5a","uniqueKey":"checkout_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"checkout_id","typeLabel":"string | null"},"is_refundable":{"oneOf":[{"type":"boolean","description":"Whether this payment can currently be refunded.","example":true,"uniqueKey":"is_refundable.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether this payment can currently be refunded.","example":true,"uniqueKey":"is_refundable.oneOf.1","typeLabel":"null"}],"uniqueKey":"is_refundable","typeLabel":"boolean | null"},"amount_paid":{"oneOf":[{"type":"string","description":"Amount received so far.","example":"10.00","uniqueKey":"amount_paid.oneOf.0","typeLabel":"string"},{"type":"null","description":"Amount received so far.","example":"10.00","uniqueKey":"amount_paid.oneOf.1","typeLabel":"null"}],"uniqueKey":"amount_paid","typeLabel":"string | null"},"amount_remaining":{"oneOf":[{"type":"string","description":"Remaining amount still expected.","example":"0.00","uniqueKey":"amount_remaining.oneOf.0","typeLabel":"string"},{"type":"null","description":"Remaining amount still expected.","example":"0.00","uniqueKey":"amount_remaining.oneOf.1","typeLabel":"null"}],"uniqueKey":"amount_remaining","typeLabel":"string | null"},"fee_usd":{"oneOf":[{"type":"string","description":"Processing fee for this payment, converted to USD and expressed as a decimal string. `null` until the payment settles.","example":"0.59","uniqueKey":"fee_usd.oneOf.0","typeLabel":"string"},{"type":"null","description":"Processing fee for this payment, converted to USD and expressed as a decimal string. `null` until the payment settles.","example":"0.59","uniqueKey":"fee_usd.oneOf.1","typeLabel":"null"}],"uniqueKey":"fee_usd","typeLabel":"string | null"},"fees":{"oneOf":[{"type":"object","description":"The processing fee on this payment, in the currency it was charged in. Prefer this over `fee_usd` when the payment was not collected in USD: `fee_usd` is a conversion of the same fee, this is the amount actually taken. `null` on a payment that carries no processing fee. See [Fees](/for-you/fees).","required":["amount","currency"],"properties":{"amount":{"type":"string","description":"The fee, as a decimal string in `currency`.","example":"8.73","isRequired":true,"uniqueKey":"fees.oneOf.0.amount","typeLabel":"string"},"currency":{"type":"string","description":"The currency the fee was charged in, as an [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) code. This is the currency the payment was collected in, which is not always the currency it settles to.","example":"USD","isRequired":true,"uniqueKey":"fees.oneOf.0.currency","typeLabel":"string"}},"uniqueKey":"fees.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"fees.oneOf.1","typeLabel":"null"}],"uniqueKey":"fees","typeLabel":"object | null"},"merchant_bears_cost":{"oneOf":[{"type":"boolean","description":"Whether merchant bears processing cost.","example":true,"uniqueKey":"merchant_bears_cost.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Whether merchant bears processing cost.","example":true,"uniqueKey":"merchant_bears_cost.oneOf.1","typeLabel":"null"}],"uniqueKey":"merchant_bears_cost","typeLabel":"boolean | null"},"platform_fee":{"oneOf":[{"type":"string","description":"What the platform took out of this sale, beside the gross it was taken from, in the base currency of the sale. `null` when the charge carried no platform fee, and on a charge that split the sale with `transfer_data.amount` instead. See [Platform fees](/connect/platform-fees).","example":null,"uniqueKey":"platform_fee.oneOf.0","typeLabel":"string"},{"type":"null","description":"What the platform took out of this sale, beside the gross it was taken from, in the base currency of the sale. `null` when the charge carried no platform fee, and on a charge that split the sale with `transfer_data.amount` instead. See [Platform fees](/connect/platform-fees).","example":null,"uniqueKey":"platform_fee.oneOf.1","typeLabel":"null"}],"uniqueKey":"platform_fee","typeLabel":"string | null"},"destination_amount":{"oneOf":[{"type":"string","description":"The seller's contracted share of this sale, in the base currency of the sale. Null on a charge that carries no split, and on one that split the sale with `platform_fee` instead.","example":null,"uniqueKey":"destination_amount.oneOf.0","typeLabel":"string"},{"type":"null","description":"The seller's contracted share of this sale, in the base currency of the sale. Null on a charge that carries no split, and on one that split the sale with `platform_fee` instead.","example":null,"uniqueKey":"destination_amount.oneOf.1","typeLabel":"null"}],"uniqueKey":"destination_amount","typeLabel":"string | null"},"fee_paid_by":{"oneOf":[{"type":"string","enum":["merchant","platform"],"description":"Who Bachs's processing fee actually came from on this charge, read back from the ledger posting rather than a flag decided in advance. `merchant`: the fee came out of the charge. `platform`: the platform's own balance covered it. On a destination charge this never reads `platform`; the fee always comes from the charge there. See [Processing fees](/connect/processing-fees).","example":"merchant","uniqueKey":"fee_paid_by.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["merchant","platform"],"description":"Who Bachs's processing fee actually came from on this charge, read back from the ledger posting rather than a flag decided in advance. `merchant`: the fee came out of the charge. `platform`: the platform's own balance covered it. On a destination charge this never reads `platform`; the fee always comes from the charge there. See [Processing fees](/connect/processing-fees).","example":"merchant","uniqueKey":"fee_paid_by.oneOf.1","typeLabel":"null"}],"uniqueKey":"fee_paid_by","typeLabel":"enum\u003cstring> | null"},"payment_method":{"oneOf":[{"type":"string","description":"How the payment was collected, usually named by rail and currency together, such as `USD_CARD`, `NGN_CARD`, `NGN_BANK_TRANSFER`, `MOMO_GHS`, or `CRYPTO`. A payment requested with a general method name can return `BANK_TRANSFER` or `MOBILE_MONEY`, so accept both forms for the same rail; `null` means the payment never reached a provider.","example":"NGN_BANK_TRANSFER","uniqueKey":"payment_method.oneOf.0","typeLabel":"string"},{"type":"null","description":"How the payment was collected, usually named by rail and currency together, such as `USD_CARD`, `NGN_CARD`, `NGN_BANK_TRANSFER`, `MOMO_GHS`, or `CRYPTO`. A payment requested with a general method name can return `BANK_TRANSFER` or `MOBILE_MONEY`, so accept both forms for the same rail; `null` means the payment never reached a provider.","example":"NGN_BANK_TRANSFER","uniqueKey":"payment_method.oneOf.1","typeLabel":"null"}],"uniqueKey":"payment_method","typeLabel":"string | null"},"channel":{"oneOf":[{"type":"string","description":"Origin channel (for example `api`).","example":"checkout","uniqueKey":"channel.oneOf.0","typeLabel":"string"},{"type":"null","description":"Origin channel (for example `api`).","example":"checkout","uniqueKey":"channel.oneOf.1","typeLabel":"null"}],"uniqueKey":"channel","typeLabel":"string | null"},"narration":{"oneOf":[{"type":"string","description":"payment description/narration.","example":"Pro plan","uniqueKey":"narration.oneOf.0","typeLabel":"string"},{"type":"null","description":"payment description/narration.","example":"Pro plan","uniqueKey":"narration.oneOf.1","typeLabel":"null"}],"uniqueKey":"narration","typeLabel":"string | null"},"meta":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Public metadata stored for this payment.","example":{"order_id":"ORD-9876"},"uniqueKey":"meta.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Public metadata stored for this payment.","example":{"order_id":"ORD-9876"},"uniqueKey":"meta.oneOf.1","typeLabel":"null"}],"uniqueKey":"meta","typeLabel":"object | null"},"message":{"oneOf":[{"type":"string","description":"Human-readable payment message derived from status.","example":"Successful","uniqueKey":"message.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable payment message derived from status.","example":"Successful","uniqueKey":"message.oneOf.1","typeLabel":"null"}],"uniqueKey":"message","typeLabel":"string | null"},"customer":{"oneOf":[{"type":"object","description":"Customer information when available.","properties":{"name":{"oneOf":[{"type":"string","description":"Full name of the customer associated with this payment, when captured.","uniqueKey":"customer.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Full name of the customer associated with this payment, when captured.","uniqueKey":"customer.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.name","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","description":"Customer email address associated with this payment, when captured.","uniqueKey":"customer.oneOf.0.email.oneOf.0","typeLabel":"string"},{"type":"null","description":"Customer email address associated with this payment, when captured.","uniqueKey":"customer.oneOf.0.email.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer.oneOf.0.email","typeLabel":"string | null"}},"uniqueKey":"customer.oneOf.0","typeLabel":"object"},{"type":"null","description":"Customer information when available.","properties":{"name":{"oneOf":[{"type":"string","description":"Full name of the customer associated with this payment, when captured."},{"type":"null","description":"Full name of the customer associated with this payment, when captured."}]},"email":{"oneOf":[{"type":"string","description":"Customer email address associated with this payment, when captured."},{"type":"null","description":"Customer email address associated with this payment, when captured."}]}},"uniqueKey":"customer.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer","typeLabel":"object | null"},"line_items":{"oneOf":[{"type":"array","description":"The line items this payment covers.","items":{"type":"object","description":"A product line item purchased in this payment.","properties":{"product_id":{"type":"string","description":"Product identifier.","example":"prod_abc123","isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].product_id","typeLabel":"string"},"product_name":{"type":"string","description":"Product display name.","example":"Premium Plan","isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].product_name","typeLabel":"string"},"quantity":{"type":"integer","description":"Number of units purchased.","example":1,"isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].quantity","typeLabel":"integer"},"unit_amount":{"type":"string","description":"Price per unit in `currency`.","example":"50.00","isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].unit_amount","typeLabel":"string"},"currency":{"type":"string","description":"Currency code for this line item.","example":"USD","isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].currency","typeLabel":"string"},"line_total":{"type":"string","description":"Total for this line item (`unit_amount` × `quantity`).","example":"50.00","isRequired":true,"uniqueKey":"line_items.oneOf.0.items.[INDEX].line_total","typeLabel":"string"}},"required":["product_id","product_name","quantity","unit_amount","currency","line_total"],"uniqueKey":"line_items.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"line_items.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"The line items this payment covers.","items":{"type":"object","description":"A product line item purchased in this payment.","properties":{"product_id":{"type":"string","description":"Product identifier.","example":"prod_abc123"},"product_name":{"type":"string","description":"Product display name.","example":"Premium Plan"},"quantity":{"type":"integer","description":"Number of units purchased.","example":1},"unit_amount":{"type":"string","description":"Price per unit in `currency`.","example":"50.00"},"currency":{"type":"string","description":"Currency code for this line item.","example":"USD"},"line_total":{"type":"string","description":"Total for this line item (`unit_amount` × `quantity`).","example":"50.00"}},"required":["product_id","product_name","quantity","unit_amount","currency","line_total"]},"uniqueKey":"line_items.oneOf.1","typeLabel":"null"}],"uniqueKey":"line_items","typeLabel":"object[] | null"},"subscription_id":{"oneOf":[{"type":"string","description":"The subscription this payment belongs to, or `null` for a one-time purchase.","example":null,"uniqueKey":"subscription_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The subscription this payment belongs to, or `null` for a one-time purchase.","example":null,"uniqueKey":"subscription_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"subscription_id","typeLabel":"string | null"},"invoice":{"oneOf":[{"type":"object","description":"The invoice this payment collected. Present only for subscription payments; `null` for one-time purchases.","required":["invoice_id"],"properties":{"invoice_id":{"type":"string","description":"The invoice's identifier.","example":"inv_9a8b7c6d5e","isRequired":true,"uniqueKey":"invoice.oneOf.0.invoice_id","typeLabel":"string"},"number":{"oneOf":[{"type":"string","description":"Human-facing invoice number, if assigned.","example":"inv_9a8b7c6d5e","uniqueKey":"invoice.oneOf.0.number.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-facing invoice number, if assigned.","example":"inv_9a8b7c6d5e","uniqueKey":"invoice.oneOf.0.number.oneOf.1","typeLabel":"null"}],"uniqueKey":"invoice.oneOf.0.number","typeLabel":"string | null"},"subscription_id":{"oneOf":[{"type":"string","description":"The subscription the invoice belongs to.","example":"sub_1a2b3c4d5e","uniqueKey":"invoice.oneOf.0.subscription_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"The subscription the invoice belongs to.","example":"sub_1a2b3c4d5e","uniqueKey":"invoice.oneOf.0.subscription_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"invoice.oneOf.0.subscription_id","typeLabel":"string | null"},"period_start":{"type":"string","format":"date-time","description":"Start of the billing period, UTC.","example":"2026-04-01T00:00:00Z","uniqueKey":"invoice.oneOf.0.period_start","typeLabel":"string\u003cdate-time>"},"period_end":{"type":"string","format":"date-time","description":"End of the billing period, UTC.","example":"2026-05-01T00:00:00Z","uniqueKey":"invoice.oneOf.0.period_end","typeLabel":"string\u003cdate-time>"},"kind":{"type":"string","enum":["cycle","proration"],"description":"`cycle`: a regular subscription-period invoice. `proration`: an off-cycle mid-cycle change.","example":"cycle","uniqueKey":"invoice.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"uniqueKey":"invoice.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"invoice.oneOf.1","typeLabel":"null"}],"uniqueKey":"invoice","typeLabel":"object | null"},"refunds":{"oneOf":[{"type":"array","description":"IDs of any refunds issued for this payment. `null` if no refund has been created.","items":{"type":"string","uniqueKey":"refunds.oneOf.0.items.[INDEX]","typeLabel":"string"},"example":["ref_1a2b3c4d5e"],"uniqueKey":"refunds.oneOf.0","typeLabel":"string[]"},{"type":"null","description":"IDs of any refunds issued for this payment. `null` if no refund has been created.","items":{"type":"string"},"example":["ref_1a2b3c4d5e"],"uniqueKey":"refunds.oneOf.1","typeLabel":"null"}],"uniqueKey":"refunds","typeLabel":"string[] | null"},"status_history":{"oneOf":[{"type":"array","description":"Chronological list of status changes for this payment.","items":{"type":"object","properties":{"status":{"type":"string","description":"Status at this point in time.","example":"succeeded","uniqueKey":"status_history.oneOf.0.items.[INDEX].status","typeLabel":"string"},"occurred_at":{"type":"string","format":"date-time","description":"When this status change occurred.","example":"2026-01-24T14:35:00.000Z","uniqueKey":"status_history.oneOf.0.items.[INDEX].occurred_at","typeLabel":"string\u003cdate-time>"},"reason":{"oneOf":[{"type":"string","description":"Human-readable reason for the status change, if available.","uniqueKey":"status_history.oneOf.0.items.[INDEX].reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable reason for the status change, if available.","uniqueKey":"status_history.oneOf.0.items.[INDEX].reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"status_history.oneOf.0.items.[INDEX].reason","typeLabel":"string | null"}},"uniqueKey":"status_history.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"status_history.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Chronological list of status changes for this payment.","items":{"type":"object","properties":{"status":{"type":"string","description":"Status at this point in time.","example":"succeeded"},"occurred_at":{"type":"string","format":"date-time","description":"When this status change occurred.","example":"2026-01-24T14:35:00.000Z"},"reason":{"oneOf":[{"type":"string","description":"Human-readable reason for the status change, if available."},{"type":"null","description":"Human-readable reason for the status change, if available."}]}}},"uniqueKey":"status_history.oneOf.1","typeLabel":"null"}],"uniqueKey":"status_history","typeLabel":"object[] | null"},"payment_method_details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Who paid and how, read from the attempt that succeeded. Returned on a single payment and on the `collection.succeeded` webhook, not on the payment list. `null` on payments taken before this field existed, and on payment methods that tell us nothing about the payer.\n\nThe shape is keyed by `type`. For `bank_transfer`, the `bank_transfer` object carries `sender_name`, `sender_bank`, `sender_bank_code`, `sender_account_number` (the full account the money came from, which you need to send money back to the sender), `session_id` (the interbank reference for the transfer) and `narration`. Which of those are present depends on what the sending bank passed on, so treat each as optional. It also carries a `virtual_account` object naming the account number the money landed in: `id`, `account_number`, `bank_name`, `type` (`permanent` for an account you keep, `one_time` for a number created for a single checkout) and `expires_at`.","example":{"type":"bank_transfer","bank_transfer":{"sender_name":"JANE ADEYEMI","sender_bank":"Guaranty Trust Bank","sender_account_number":"2294879124","session_id":"000013260922104115000821734502","virtual_account":{"id":"va_8Hs2kQ4mZpXv","account_number":"9902847361","bank_name":"Globus Bank","type":"permanent","expires_at":null}}},"uniqueKey":"payment_method_details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Who paid and how, read from the attempt that succeeded. Returned on a single payment and on the `collection.succeeded` webhook, not on the payment list. `null` on payments taken before this field existed, and on payment methods that tell us nothing about the payer.\n\nThe shape is keyed by `type`. For `bank_transfer`, the `bank_transfer` object carries `sender_name`, `sender_bank`, `sender_bank_code`, `sender_account_number` (the full account the money came from, which you need to send money back to the sender), `session_id` (the interbank reference for the transfer) and `narration`. Which of those are present depends on what the sending bank passed on, so treat each as optional. It also carries a `virtual_account` object naming the account number the money landed in: `id`, `account_number`, `bank_name`, `type` (`permanent` for an account you keep, `one_time` for a number created for a single checkout) and `expires_at`.","example":{"type":"bank_transfer","bank_transfer":{"sender_name":"JANE ADEYEMI","sender_bank":"Guaranty Trust Bank","sender_account_number":"2294879124","session_id":"000013260922104115000821734502","virtual_account":{"id":"va_8Hs2kQ4mZpXv","account_number":"9902847361","bank_name":"Globus Bank","type":"permanent","expires_at":null}}},"uniqueKey":"payment_method_details.oneOf.1","typeLabel":"null"}],"uniqueKey":"payment_method_details","typeLabel":"object | null"},"completed_at":{"oneOf":[{"type":"string","format":"date-time","description":"Completion timestamp when available.","example":"2026-04-27T12:00:05Z","uniqueKey":"completed_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Completion timestamp when available.","example":"2026-04-27T12:00:05Z","uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"completed_at","typeLabel":"string\u003cdate-time> | null"}},"required":["payment_id","status","amount","currency","created_at","updated_at"],"uniqueKey":"","typeLabel":"object"},"example":{"payment_id":"ch_389305e973a841cc","status":"processing","amount":"30.85","amount_paid":"0.00","amount_remaining":"30.85","currency":"USD","fees":{"amount":"1.85","currency":"USD"},"payment_method":"CARD","checkout_id":null,"narration":"April usage","reference":"INV-2026-04-881","billing_reason":"purchase","customer":{"name":"Jane Doe","email":"jane@example.com"},"created_at":"2026-04-27T12:05:00.000Z","updated_at":"2026-04-27T12:05:00.000Z"},"examples":{"Example":{"title":"Example","value":{"payment_id":"ch_389305e973a841cc","status":"processing","amount":"30.85","amount_paid":"0.00","amount_remaining":"30.85","currency":"USD","fees":{"amount":"1.85","currency":"USD"},"payment_method":"CARD","checkout_id":null,"narration":"April usage","reference":"INV-2026-04-881","billing_reason":"purchase","customer":{"name":"Jane Doe","email":"jane@example.com"},"created_at":"2026-04-27T12:05:00.000Z","updated_at":"2026-04-27T12:05:00.000Z"}}},"exampleType":"examples"}},"exampleType":"examples"},"b2d51c62-bf8a-4520-bea1-b41c1c9cc4b9":{"description":"Bad Request - Validation errors or invalid request format. Check the `details` object for field-specific validation errors. Common causes: missing required fields, invalid data types, values outside allowed ranges, or invalid formats.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"Invalid request parameters","error_code":"VALIDATION_ERROR","errors":[{"field":"amount","message":"Amount must be a positive decimal string","type":"value_error"}]},"examples":{"Example":{"title":"Example","value":{"detail":"Invalid request parameters","error_code":"VALIDATION_ERROR","errors":[{"field":"amount","message":"Amount must be a positive decimal string","type":"value_error"}]}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window","schema":{"type":"integer","example":95}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}}},"exampleType":"examples"},"a08730a6-f09b-42ce-b97a-6cc94ab9fe72":{"description":"Unauthorized - Invalid, missing, or expired API key. Verify your API key is correctly formatted and included in the Authorization header as `Bearer sk_sandbox_...` or `Bearer sk_live_...`. Check that your key hasn't been revoked.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"Invalid API key","error_code":"UNAUTHORIZED"},"examples":{"Example":{"title":"Example","value":{"detail":"Invalid API key","error_code":"UNAUTHORIZED"}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window","schema":{"type":"integer","example":95}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}}},"exampleType":"examples"},"e1054f6f-f440-4996-9b47-ff59d4717119":{"description":"Forbidden - API key does not have permission for the requested resource. Verify you're using the correct account's API key and that you're not trying to access another account's data.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"API key does not have permission for this operation","error_code":"FORBIDDEN"},"examples":{"Example":{"title":"Example","value":{"detail":"API key does not have permission for this operation","error_code":"FORBIDDEN"}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window","schema":{"type":"integer","example":95}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}}},"exampleType":"examples"},"d571a3f3-19a9-41ff-9a71-7b25cc50e12e":{"description":"Not Found - The requested resource does not exist. Verify the resource ID is correct and that it belongs to your account.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"Resource not found","error_code":"NOT_FOUND"},"examples":{"Example":{"title":"Example","value":{"detail":"Resource not found","error_code":"NOT_FOUND"}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window","schema":{"type":"integer","example":95}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}}},"exampleType":"examples"},"417b1e8b-58ee-416a-b78f-7b39428fa879":{"description":"Too Many Requests - Rate limit exceeded. Standard tier allows 100 requests per minute per API key. Wait a few seconds before retrying. Check X-RateLimit-Reset header for when the window resets.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"Rate limit exceeded. Please retry after a few seconds.","error_code":"TOO_MANY_REQUESTS"},"examples":{"Example":{"title":"Example","value":{"detail":"Rate limit exceeded. Please retry after a few seconds.","error_code":"TOO_MANY_REQUESTS"}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window (will be 0)","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}},"Retry-After":{"description":"Number of seconds to wait before retrying","schema":{"type":"integer","example":30}}},"exampleType":"examples"},"395d1136-fc2c-4e64-9e2c-2cdf93d2e82c":{"description":"Internal Server Error - An unexpected error occurred while processing the request. Retry with exponential backoff. If the issue persists, contact support with your request context.","content":{"application/json":{"schema":{"type":"object","description":"Standard error response format used across all API endpoints","properties":{"detail":{"type":"string","description":"Human-readable error message explaining what went wrong.","example":"Invalid request parameters","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_code":{"type":"string","description":"Machine-readable error code. Use this to handle errors programmatically. Common codes: VALIDATION_ERROR, UNAUTHORIZED, FORBIDDEN, NOT_FOUND, CONFLICT, TOO_MANY_REQUESTS, INTERNAL_SERVER_ERROR, BAD_GATEWAY, SERVICE_UNAVAILABLE.","example":"VALIDATION_ERROR","isRequired":true,"uniqueKey":"error_code","typeLabel":"string"},"errors":{"type":"array","description":"Optional field-level details on some validation errors. Other validation responses contain only detail and error_code. Entry fields depend on the validation source.","items":{"type":"object","properties":{"field":{"type":"string","description":"The field that failed validation.","example":"amount","isRequired":true,"uniqueKey":"errors.items.[INDEX].field","typeLabel":"string"},"message":{"type":"string","description":"Description of the validation failure.","example":"Amount must be a positive decimal string","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"type":{"type":"string","description":"Error type identifier.","example":"value_error","uniqueKey":"errors.items.[INDEX].type","typeLabel":"string"},"code":{"type":"string","description":"Optional requirement-field rejection code. Some validation entries provide code instead of type.","example":"currency_not_supported","uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"}},"required":["field","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"doc_url":{"type":"string","description":"Optional link to documentation for this error; some errors omit it.","example":"https://docs.bachs.io/api-reference/error-reference#general","uniqueKey":"doc_url","typeLabel":"string"}},"required":["detail","error_code"],"uniqueKey":"","typeLabel":"object"},"example":{"detail":"An unexpected error occurred. Please try again later.","error_code":"INTERNAL_SERVER_ERROR"},"examples":{"Example":{"title":"Example","value":{"detail":"An unexpected error occurred. Please try again later.","error_code":"INTERNAL_SERVER_ERROR"}}},"exampleType":"examples"}},"headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed per minute","schema":{"type":"integer","example":100}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window","schema":{"type":"integer","example":95}},"X-RateLimit-Reset":{"description":"Unix timestamp when the rate limit window resets","schema":{"type":"integer","example":1706102400}}},"exampleType":"examples"}},"security":{"f48726d7-594c-46c5-98ad-e31d96d6adf1":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Bearer token authentication. Pass your API key as `Authorization: Bearer sk_...`. See [Authentication](/authentication) for keys, scopes, and sandbox vs production.","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"e2ecbd97-018b-40aa-946f-f32ad71132ed":{"url":"https://api.bachs.io","description":"Production"},"2dbe01e0-3ef9-4eb7-9ea8-006c3f1e276a":{"url":"https://sandbox-api.bachs.io","description":"Sandbox"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Bearer token authentication. Pass your API key as `Authorization: Bearer sk_...`. See [Authentication](/authentication) for keys, scopes, and sandbox vs production.","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer token authentication. Pass your API key as `Authorization: Bearer sk_...`. See [Authentication](/authentication) for keys, scopes, and sandbox vs production.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"docs/openapi/openapi.json"},"subdomain":"bachs","siteName":"Bachs","title":"Create a charge - Bachs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-10T13:27:29.514Z","originalFileLocation":"api-reference/payments/create-a-charge.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=\"dark\"}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=\"Charge a customer\u0026#x27;s saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused. The card must have been saved on an earlier checkout. See Charge a saved card. This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received. Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bachs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_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/bachs/G65YpENXbxC-6e23/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a charge - Bachs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Charge a customer\u0026#x27;s saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused. The card must have been saved on an earlier checkout. See Charge a saved card. This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received. Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bachs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.bachs.io/api-reference/payments/create-a-charge\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://bachs.mintlify.site/_mintlify/api/og/v2?division=Payments\u0026amp;title=Create+a+charge\u0026amp;description=Charge+a+customer%27s+saved+card+off-session%2C+meaning+with+nobody+on+a+payment+page.+Use+this+for+money+a+customer+agreed+to+once+and+you+collect+later%2C+such+as+a\u0026amp;theme=6365cd32178e755cedc188f0\u0026amp;signature=f1f312821ee650f3a5a139cdc1a01fa337e9879f0bfb72b41d89b58e3eed7051\">\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=\"Create a charge - Bachs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Charge a customer\u0026#x27;s saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused. The card must have been saved on an earlier checkout. See Charge a saved card. This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received. Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://bachs.mintlify.site/_mintlify/api/og/v2?division=Payments\u0026amp;title=Create+a+charge\u0026amp;description=Charge+a+customer%27s+saved+card+off-session%2C+meaning+with+nobody+on+a+payment+page.+Use+this+for+money+a+customer+agreed+to+once+and+you+collect+later%2C+such+as+a\u0026amp;theme=6365cd32178e755cedc188f0\u0026amp;signature=f1f312821ee650f3a5a139cdc1a01fa337e9879f0bfb72b41d89b58e3eed7051\">\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/bachs/G65YpENXbxC-6e23/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bachs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5266eb\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"xCFt-c27YambrzzvRTU4CiqeElNFKGVJZw_8o9IgpdA\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.bachs.io/api-reference/payments/create-a-charge\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/payments/create-a-charge.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.bachs.io/#organization\",\"name\":\"Bachs\",\"url\":\"https://docs.bachs.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/bachs/8QOZkInmSDP5Ad7N/logo.png?fit=max\u0026auto=format\u0026n=8QOZkInmSDP5Ad7N\u0026q=85\u0026s=9d4369b7a7ceeb9d196f647822f4ea01\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.bachs.io#website\",\"name\":\"Bachs\",\"url\":\"https://docs.bachs.io\",\"publisher\":{\"@id\":\"https://docs.bachs.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.bachs.io/api-reference/payments/create-a-charge#webpage\",\"url\":\"https://docs.bachs.io/api-reference/payments/create-a-charge\",\"name\":\"Create a charge\",\"description\":\"Charge a customer's saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused. The card must have been saved on an earlier checkout. See Charge a saved card. This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received. Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.\",\"dateModified\":\"2026-11-10T13:27:29.514Z\",\"isPartOf\":{\"@id\":\"https://docs.bachs.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.bachs.io/api-reference/payments/create-a-charge#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.bachs.io/api-reference/payments/create-a-charge#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Payments\",\"item\":\"https://docs.bachs.io/api-reference/payments/object\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a charge\",\"item\":\"https://docs.bachs.io/api-reference/payments/create-a-charge\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.bachs.io/api-reference/payments/create-a-charge#apireference\",\"headline\":\"Create a charge\",\"name\":\"Create a charge\",\"description\":\"Charge a customer's saved card off-session, meaning with nobody on a payment page. Use this for money a customer agreed to once and you collect later, such as a usage invoice or a top-up. An off-session charge cannot ask the customer to authenticate, so a card whose issuer demands it is refused. The card must have been saved on an earlier checkout. See Charge a saved card. This always answers with a payment, never an error, when the card is refused: a refusal is an outcome you read from status. The payment is usually processing, and the result reaches you as a collection.succeeded or collection.failed webhook. A card refused while the request is still open comes back already failed. A 201 is not payment received. Send an Idempotency-Key header. Without one, a retry after a timeout charges the customer twice.\",\"url\":\"https://docs.bachs.io/api-reference/payments/create-a-charge\",\"mainEntityOfPage\":{\"@id\":\"https://docs.bachs.io/api-reference/payments/create-a-charge#webpage\"},\"dateModified\":\"2026-11-10T13:27:29.514Z\",\"publisher\":{\"@id\":\"https://docs.bachs.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.bachs.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bachs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Bachs","nav":{"global":null,"tabs":[{"tab":"Get started","pages":[{"title":"Get started","href":"/get-started"}]},{"tab":"Payments","pages":[{"title":"Payments","href":"/guides/payments/overview"}]},{"tab":"Billing","pages":[{"title":"Billing","href":"/guides/billing/overview"}]},{"tab":"Payouts","pages":[{"title":"Payouts","href":"/guides/payouts/overview"}]},{"tab":"Connect (Sub accounts)","pages":[{"title":"Connect (Sub accounts)","href":"/connect/overview"}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developers/overview"}]},{"tab":"API reference","groups":[{"group":"General","pages":[{"title":"Introduction","mode":"wide","href":"/api-reference/overview"},{"title":"API Standards","mode":"wide","href":"/api-reference/api-standards"},{"title":"Permissions","mode":"wide","href":"/api-reference/permissions"},{"title":"Success responses","mode":"wide","href":"/api-reference/success-responses"},{"title":"Error Reference","mode":"wide","href":"/api-reference/error-reference"},{"title":"Errors","mode":"wide","href":"/errors"},{"title":"Pagination","mode":"wide","href":"/guides/pagination"},{"title":"Idempotency","mode":"wide","href":"/guides/idempotency"}]},{"group":"Checkout Sessions","pages":[{"title":"The checkout session object","mode":"wide","href":"/api-reference/checkout-sessions/object"},{"title":"Create a checkout session","deprecated":null,"version":null,"sidebarTitle":"Create checkout session","openapi":"/docs/openapi/openapi.json post /v1/checkout-sessions","href":"/api-reference/payments/create-checkout-session"},{"title":"Retrieve a checkout session","deprecated":null,"version":null,"sidebarTitle":"Get checkout session","openapi":"/docs/openapi/openapi.json get /v1/checkout-sessions/{checkout_id}","href":"/api-reference/checkout-sessions/get-checkout-session"}]},{"group":"Connected Accounts","pages":[{"title":"Create an account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts","href":"/api-reference/accounts/create-an-account"},{"title":"List accounts","deprecated":null,"version":null,"sidebarTitle":"List connected accounts","openapi":"/docs/openapi/openapi.json get /v1/accounts","href":"/api-reference/organizations/list-connected-accounts"},{"title":"Get an account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/accounts/{account_id}","href":"/api-reference/accounts/get-an-account"},{"title":"Update an account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}","href":"/api-reference/accounts/update-an-account"},{"title":"Create an account link","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/account-links","href":"/api-reference/accounts/create-an-account-link"},{"title":"Create a login link","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/login_links","href":"/api-reference/accounts/create-a-login-link"},{"title":"Send a dashboard invite","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/dashboard_invite","href":"/api-reference/accounts/send-a-dashboard-invite"},{"title":"Attach a company document","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/documents","href":"/api-reference/connected-accounts/attach-a-company-document"},{"title":"List capabilities","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/accounts/{account_id}/capabilities","href":"/api-reference/accounts/list-capabilities"}]},{"group":"Products","pages":[{"title":"The product object","mode":"wide","href":"/api-reference/products/object"},{"title":"Create a product","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/products","href":"/api-reference/products/create-a-product"},{"title":"Retrieve a product","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/products/{product_id}","href":"/api-reference/products/retrieve-a-product"},{"title":"Update a product","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json patch /v1/products/{product_id}","href":"/api-reference/products/update-a-product"},{"title":"List products","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/products","href":"/api-reference/products/list-products"},{"title":"Archive a product","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/products/{product_id}/archive","href":"/api-reference/products/archive-a-product"},{"title":"Unarchive a product","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/products/{product_id}/unarchive","href":"/api-reference/products/unarchive-a-product"}]},{"group":"Subscriptions","pages":[{"title":"The subscription object","mode":"wide","href":"/api-reference/subscriptions/object"},{"title":"List subscriptions","deprecated":null,"version":null,"sidebarTitle":"List subscriptions","openapi":"/docs/openapi/openapi.json get /v1/subscriptions","href":"/api-reference/subscriptions/list-subscriptions"},{"title":"Retrieve a subscription","deprecated":null,"version":null,"sidebarTitle":"Get subscription","openapi":"/docs/openapi/openapi.json get /v1/subscriptions/{subscription_id}","href":"/api-reference/subscriptions/get-subscription"},{"title":"Update a subscription","deprecated":null,"version":null,"sidebarTitle":"Update subscription","openapi":"/docs/openapi/openapi.json patch /v1/subscriptions/{subscription_id}","href":"/api-reference/subscriptions/update-subscription"},{"title":"Cancel a subscription","deprecated":null,"version":null,"sidebarTitle":"Cancel subscription","openapi":"/docs/openapi/openapi.json delete /v1/subscriptions/{subscription_id}","href":"/api-reference/subscriptions/cancel-subscription"}]},{"group":"Customers","pages":[{"title":"The customer object","mode":"wide","href":"/api-reference/customers/object"},{"title":"Create a customer","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/customers","href":"/api-reference/customers/create-a-customer"},{"title":"Retrieve a customer","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/customers/{customer_id}","href":"/api-reference/customers/retrieve-a-customer"},{"title":"Update a customer","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json patch /v1/customers/{customer_id}","href":"/api-reference/customers/update-a-customer"},{"title":"List customers","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/customers","href":"/api-reference/customers/list-customers"}]},{"group":"Customer sessions","pages":[{"title":"The customer session object","mode":"wide","href":"/api-reference/customer-sessions/object"},{"title":"Create a customer portal session","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/customers/{customer_id}/portal-sessions","href":"/api-reference/customer-sessions/create-a-customer-portal-session"}]},{"group":"Payments","pages":[{"title":"The payment object","mode":"wide","href":"/api-reference/payments/object"},{"title":"List payments","deprecated":null,"version":null,"sidebarTitle":"List payments","openapi":"/docs/openapi/openapi.json get /v1/payments","href":"/api-reference/payments/list-payments"},{"title":"Retrieve a payment","description":"Retrieve a single payment by its charge ID, with the full object: amount, status, the customer, fees, the products paid for, refunds, and status history.","deprecated":null,"version":null,"sidebarTitle":"Get payment","openapi":"/docs/openapi/openapi.json get /v1/payments/{payment_id}","href":"/api-reference/payments/get-payment"},{"title":"Create a charge","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/charges","href":"/api-reference/payments/create-a-charge"}]},{"group":"Refunds","pages":[{"title":"The refund object","mode":"wide","description":"A refund returns money to a customer for a payment you already collected. Refunds settle asynchronously and are reported through the refund.* webhook events.","href":"/api-reference/refunds/object"},{"title":"Create a refund","deprecated":null,"version":null,"sidebarTitle":"Create refund","openapi":"/docs/openapi/openapi.json post /v1/refunds","href":"/api-reference/refunds/create-refund"},{"title":"List refunds","deprecated":null,"version":null,"sidebarTitle":"List refunds","openapi":"/docs/openapi/openapi.json get /v1/refunds","href":"/api-reference/refunds/list-refunds"},{"title":"Retrieve a refund","deprecated":null,"version":null,"sidebarTitle":"Get refund","openapi":"/docs/openapi/openapi.json get /v1/refunds/{refund_id}","href":"/api-reference/refunds/get-refund"},{"title":"Retrieve a refund by charge","deprecated":null,"version":null,"sidebarTitle":"Get refund by charge","openapi":"/docs/openapi/openapi.json get /v1/refunds/by-charge/{payment_id}","href":"/api-reference/refunds/get-refund-by-charge"}]},{"group":"Disputes","pages":[{"title":"Get Dispute","deprecated":null,"version":null,"sidebarTitle":"Get dispute","openapi":"/docs/openapi/openapi.json get /v1/disputes/{dispute_id}","href":"/api-reference/disputes/get-dispute"},{"title":"List Disputes","deprecated":null,"version":null,"sidebarTitle":"List disputes","openapi":"/docs/openapi/openapi.json get /v1/disputes","href":"/api-reference/disputes/list-disputes"},{"title":"Submit Dispute","deprecated":null,"version":null,"sidebarTitle":"Submit dispute","openapi":"/docs/openapi/openapi.json post /v1/disputes/{dispute_id}/submit","href":"/api-reference/disputes/submit-dispute"},{"title":"Update Dispute Evidence","deprecated":null,"version":null,"sidebarTitle":"Update dispute evidence","openapi":"/docs/openapi/openapi.json patch /v1/disputes/{dispute_id}/evidence","href":"/api-reference/disputes/update-dispute-evidence"},{"title":"Upload Dispute Document","deprecated":null,"version":null,"sidebarTitle":"Upload dispute document","openapi":"/docs/openapi/openapi.json post /v1/disputes/uploads","href":"/api-reference/disputes/upload-dispute-document"}]},{"group":"Conversions","hidden":true,"pages":[{"title":"Create Conversion Quote","deprecated":null,"version":null,"sidebarTitle":"Create conversion quote","openapi":"/docs/openapi/openapi.json post /v1/conversions/quotes","href":"/api-reference/conversions/create-conversion-quote"},{"title":"Execute Conversion","deprecated":null,"version":null,"sidebarTitle":"Execute conversion","openapi":"/docs/openapi/openapi.json post /v1/conversions","href":"/api-reference/conversions/execute-conversion"},{"title":"Get Conversion","deprecated":null,"version":null,"sidebarTitle":"Get conversion","openapi":"/docs/openapi/openapi.json get /v1/conversions/{conversion_id}","href":"/api-reference/conversions/get-conversion"},{"title":"List Conversions","deprecated":null,"version":null,"sidebarTitle":"List conversions","openapi":"/docs/openapi/openapi.json get /v1/conversions","href":"/api-reference/conversions/list-conversions"}]},{"group":"Payouts","pages":[{"title":"The payout object","mode":"wide","href":"/api-reference/payouts/object"},{"title":"Create Payout","deprecated":null,"version":null,"sidebarTitle":"Create payout","openapi":"/docs/openapi/openapi.json post /v1/payouts","href":"/api-reference/payouts/create-payout"},{"title":"Create Payout Quote","deprecated":null,"version":null,"sidebarTitle":"Create payout quote","openapi":"/docs/openapi/openapi.json post /v1/payouts/quotes","href":"/api-reference/payouts/create-payout-quote"},{"title":"Get Payout","deprecated":null,"version":null,"sidebarTitle":"Get payout","openapi":"/docs/openapi/openapi.json get /v1/payouts/{withdrawal_id}","href":"/api-reference/payouts/get-payout"},{"title":"List Payouts","deprecated":null,"version":null,"sidebarTitle":"List payouts","openapi":"/docs/openapi/openapi.json get /v1/payouts","href":"/api-reference/payouts/list-payouts"}]},{"group":"Payout Destinations","pages":[{"title":"The payout destination object","mode":"wide","href":"/api-reference/payout-destinations/object"},{"title":"Create Payout Destination","deprecated":null,"version":null,"sidebarTitle":"Create payout destination","openapi":"/docs/openapi/openapi.json post /v1/payouts/destinations","href":"/api-reference/payouts/create-payout-destination"},{"title":"List Payout Destinations","deprecated":null,"version":null,"sidebarTitle":"List payout destinations","openapi":"/docs/openapi/openapi.json get /v1/payouts/destinations","href":"/api-reference/payouts/list-payout-destinations"},{"title":"Get Payout Destination","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/payouts/destinations/{destination_id}","href":"/api-reference/payouts/get-payout-destination"},{"title":"Update Payout Destination","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json patch /v1/payouts/destinations/{destination_id}","href":"/api-reference/payouts/update-payout-destination"},{"title":"Delete Payout Destination","deprecated":null,"version":null,"sidebarTitle":"Delete payout destination","openapi":"/docs/openapi/openapi.json delete /v1/payouts/destinations/{destination_id}","href":"/api-reference/payouts/delete-payout-destination"}]},{"group":"Balance","pages":[{"title":"The balance object","mode":"wide","href":"/api-reference/balance/object"},{"title":"Retrieve balances","deprecated":null,"version":null,"sidebarTitle":"Get balances","openapi":"/docs/openapi/openapi.json get /v1/balances","href":"/api-reference/accounts/get-balances"},{"title":"Get payout schedule","deprecated":null,"version":null,"sidebarTitle":"Get payout schedule","openapi":"/docs/openapi/openapi.json get /v1/balance_settings","href":"/api-reference/payouts/get-payout-schedule"},{"title":"Update payout schedule","deprecated":null,"version":null,"sidebarTitle":"Update payout schedule","openapi":"/docs/openapi/openapi.json post /v1/balance_settings","href":"/api-reference/payouts/update-payout-schedule"}]},{"group":"Virtual accounts","pages":[{"title":"The virtual account object","mode":"wide","href":"/api-reference/virtual-accounts/object"},{"title":"Create a virtual account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/virtual-accounts","href":"/api-reference/virtual-accounts/create-a-virtual-account"},{"title":"Get a virtual account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/virtual-accounts","href":"/api-reference/virtual-accounts/get-a-virtual-account"}]},{"group":"Your account","pages":[{"title":"Get your own account","deprecated":null,"version":null,"sidebarTitle":"Get my organization","openapi":"/docs/openapi/openapi.json get /v1/accounts/me","href":"/api-reference/organizations/get-my-organization"},{"title":"Get checkout settings","deprecated":null,"version":null,"sidebarTitle":"Get checkout settings","openapi":"/docs/openapi/openapi.json get /v1/accounts/checkout/settings","href":"/api-reference/organizations/get-checkout-settings"},{"title":"Update checkout settings","deprecated":null,"version":null,"sidebarTitle":"Update checkout settings","openapi":"/docs/openapi/openapi.json put /v1/accounts/checkout/settings","href":"/api-reference/organizations/update-checkout-settings"}]},{"group":"Files","pages":[{"title":"Upload a compliance file","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/files","href":"/api-reference/files/upload-a-compliance-file"}]},{"group":"Media","pages":[{"title":"Upload a file","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/utilities/uploads","href":"/api-reference/media/upload-a-file"},{"title":"Retrieve an upload","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/utilities/uploads/{upload_id}","href":"/api-reference/media/retrieve-an-upload"},{"title":"Delete an upload","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json delete /v1/utilities/uploads/{upload_id}","href":"/api-reference/media/delete-an-upload"}]},{"group":"Product Groups","hidden":true,"pages":[{"title":"Create Product Group","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/product-groups","href":"/api-reference/product-groups/create-product-group"},{"title":"List Product Groups","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/product-groups","href":"/api-reference/product-groups/list-product-groups"},{"title":"Get Product Group","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/product-groups/{group_id}","href":"/api-reference/product-groups/get-product-group"},{"title":"Update Product Group","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json patch /v1/product-groups/{group_id}","href":"/api-reference/product-groups/update-product-group"},{"title":"Delete Product Group","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json delete /v1/product-groups/{group_id}","href":"/api-reference/product-groups/delete-product-group"}]},{"group":"Misc","pages":[{"title":"List payment methods","deprecated":null,"version":null,"sidebarTitle":"List payment methods","openapi":"/docs/openapi/openapi.json get /v1/payment-methods","href":"/api-reference/payments/list-payment-methods"},{"title":"List payment rails","deprecated":null,"version":null,"sidebarTitle":"List payment rails","openapi":"/docs/openapi/openapi.json get /v1/payment-methods/rails","href":"/api-reference/payments/list-payment-rails"},{"title":"List payout supported currencies","deprecated":null,"version":null,"sidebarTitle":"List payout supported currencies","openapi":"/docs/openapi/openapi.json get /v1/currencies/payout-supported","href":"/api-reference/payments/list-payout-supported-currencies"},{"title":"List supported currencies","deprecated":null,"version":null,"sidebarTitle":"List supported currencies","openapi":"/docs/openapi/openapi.json get /v1/currencies/supported","href":"/api-reference/payments/list-supported-currencies"}]},{"group":"Transfers","pages":[{"title":"Create a transfer","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/transfers","href":"/api-reference/transfers/create-a-transfer"},{"title":"List transfers","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/transfers","href":"/api-reference/transfers/list-transfers"},{"title":"Get a transfer","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/transfers/{transfer_id}","href":"/api-reference/transfers/get-a-transfer"}]},{"group":"Persons","pages":[{"title":"List persons","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/accounts/{account_id}/persons","href":"/api-reference/persons/list-persons"},{"title":"Add a person","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/persons","href":"/api-reference/persons/add-a-person"},{"title":"Read a person","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/accounts/{account_id}/persons/{person_id}","href":"/api-reference/persons/read-a-person"},{"title":"Update a person","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/persons/{person_id}","href":"/api-reference/persons/update-a-person"},{"title":"Attach a document to a person","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/accounts/{account_id}/persons/{person_id}/documents","href":"/api-reference/persons/attach-a-document-to-a-person"},{"title":"Remove a person","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json delete /v1/accounts/{account_id}/persons/{person_id}","href":"/api-reference/persons/remove-a-person"}]},{"group":"Platform Fees","pages":[{"title":"List platform fees","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/platform_fees","href":"/api-reference/platform-fees/list-platform-fees"},{"title":"Get a platform fee","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/platform_fees/{fee_id}","href":"/api-reference/platform-fees/get-a-platform-fee"}]},{"group":"Reference","pages":[{"title":"List banks","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/reference/banks","href":"/api-reference/reference/list-banks"},{"title":"List mobile money providers","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/reference/momo","href":"/api-reference/reference/list-mobile-money-providers"},{"title":"List business structures","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/reference/business-structures","href":"/api-reference/reference/list-business-structures"},{"title":"List product categories","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json get /v1/reference/product-categories","href":"/api-reference/reference/list-product-categories"},{"title":"Resolve a bank account","deprecated":null,"version":null,"openapi":"/docs/openapi/openapi.json post /v1/misc/bank-accounts/resolve","href":"/api-reference/misc/resolve-a-bank-account"}]}]}]},"basePath":"","title":"Create a charge - Bachs","buildId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","deploymentId":"dpl_42LwxxU1kGN114H4XzwGYXa9ZDah","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C-hEh3I2.js","utils-CnF4QiUD.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C7PVNbel.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-8ytevL2A.js","snippetPresets-BT1alx3v.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-BLXC0i_W.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CyLIGI9_.js","shallow-DC0lGVIW.js","getApiPlaygroundDisplay-CgDQ85tN.js","CodeSnippet-6-I-Gpv9.js","CodeSnippets-BAk1kDdu.js","Page-C945cI-W.js","getPastedJson-B276RuWN.js","icon-BqP8etTm.js","MethodPill-DM6sbxG1.js","DuplicateIcon-PyJglOaE.js","createIcon-CMeOMAc_.js","DynamicMarkdown-BoyYAA8K.js","SectionHeading-DAYv3gvZ.js","axios-vUo_bRtp.js","Markdown-BhTTmazV.js","clsx-CR-RHrVC.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CBUH0-zX.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BmARFYNC.js"]}