{"openapi":"3.1.0","info":{"title":"Open Border API","version":"v1","description":"Open Border is the merchant-of-record layer for cross-border commerce. You collect the card in\nthe browser with one script, then create the charge from your server with a typed SDK. Open\nBorder handles entity routing, tax and duty, and settlement. All money fields are integer minor\nunits (for example, cents) with an explicit currency.\n\nCore checkout integration is two packages and two keys: **OpenBorder CDN JS** in the browser\nand the **OpenBorder Node SDK** on your server. Set up your account first, then wire up each\npackage.\n\n### Package links\n\n- [Node SDK (`@open-border/node`)](https://www.npmjs.com/package/@open-border/node)\n- [Medusa plugin (`@open-border/medusa-payment-openborder`)](https://www.npmjs.com/package/@open-border/medusa-payment-openborder)\n- [Checkout JS (`@open-border/js`)](https://www.npmjs.com/package/@open-border/js)\n- [Domain types (`@open-border/domain`)](https://www.npmjs.com/package/@open-border/domain)\n- [CDN checkout bundle](https://unpkg.com/@open-border/js/dist/openborder.global.js)\n\nGitHub Packages uses the `@openborder/*` scope at `https://npm.pkg.github.com` and requires\nregistry authentication. Public npm installs use `@open-border/*` and do not need a token.\n\n## Setup\n\n### Generate your API keys\n\nOpen the merchant dashboard, go to **Developers**, and choose **Create API key**. Pick the\nenvironment (Test or Production); you get a paired key set:\n\n- A **secret key** (`sk_test_…` / `sk_live_…`), shown once — copy it immediately and keep it in\n  your server environment (for example `OB_SECRET_KEY`). It is never displayed again.\n- Its **publishable key** (`pk_test_…` / `pk_live_…`), which is public and stays visible on the\n  key at any time. This is the one you use in the browser.\n\nTest keys work right away. Production keys unlock after KYB approval and a signed merchant\nagreement. You can rotate or revoke a key from the same screen; rotating replaces both halves at\nonce, so update both ends when you do.\n\nTest keys only reach test rails and live keys only reach live rails — the two never mix.\n\n### Set your checkout branding\n\nBranding is optional and needs no code. In the dashboard under **Developers → Checkout\nbranding**, set your logo, primary and accent colors, and the pay-button label. The browser\nembed reads this automatically through your publishable key, so the card form matches your store\nthe next time it loads. Leave it unset to use the default theme.\n\n## OpenBorder CDN JS\n\nThe browser drop-in, published as `@open-border/js`. It renders the card field, collects the\ncard directly (your server never sees card data), applies your dashboard branding, and returns a\npayment method token. It authenticates with the publishable key and never charges.\n\n### Install\n\nLoad it straight from the CDN — no build step:\n\n```html\n<script src=\"https://unpkg.com/@open-border/js\"></script>\n```\n\nOr install it if you bundle with a framework:\n\n```bash\nnpm install @open-border/js\n```\n\n### Mount the checkout\n\nCreate a client with your publishable key and mount it into any element. The `currency` you pass\nselects the acquiring entity.\n\n```html\n<div id=\"checkout\"></div>\n<script src=\"https://unpkg.com/@open-border/js\"></script>\n<script>\n  const ob = OpenBorder('pk_test_...');\n  ob.mount('#checkout', {\n    currency: 'USD',\n    amount: 4200,\n    billingDetails: { name: 'Ada Lovelace', email: 'buyer@example.com' },\n    onSuccess: ({ paymentMethodId, entity }) => {\n      // Hand the token to your server to create the charge.\n      fetch('/charge', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({ paymentMethodId }),\n      });\n    },\n    onError: (message) => console.error(message),\n  });\n</script>\n```\n\n### Options\n\n`OpenBorder(publishableKey, { apiBaseUrl })` takes the publishable key and an optional\n`apiBaseUrl` (it defaults to the host matching your key rail). `mount(target, options)` accepts:\n\n| Option | Required | Description |\n| --- | --- | --- |\n| `currency` | yes | Charge currency; selects the entity. One of USD, GBP, EUR, CAD, AUD. |\n| `amount` | no | Integer minor units. Display-only — labels the pay button; the charged amount is set server-side. |\n| `billingDetails` | no | Buyer `name`, `email`, and `address`, forwarded to the card for AVS. |\n| `onSuccess` | yes | Called with `{ paymentMethodId, entity }`. Send the token to your server. |\n| `onError` | no | Called with a safe, human-readable message on failure. |\n| `submitLabel` | no | Overrides the pay-button label. |\n\n`mount` returns `{ unmount }`. To change the currency after mounting, call `unmount()` and mount\nagain with the new currency — a payment method token is bound to one entity and cannot be reused\nacross currencies.\n\n## OpenBorder Node SDK\n\nThe typed server client, published as `@open-border/node`. It holds your secret key and turns\nthe payment method token from the browser into a charge. Never import it into browser code.\n\n### Install\n\n```bash\nnpm install @open-border/node\n```\n\n### Create the client\n\n```js\nimport { OpenBorderClient } from '@open-border/node';\n\nconst ob = new OpenBorderClient({ apiKey: process.env.OB_SECRET_KEY });\n```\n\nThe client targets the host matching your key rail (test keys use the sandbox, live keys use\nproduction). Pass `baseUrl` to override it.\n\n### Quote tax & duty, then create the charge\n\nTake the `paymentMethodId` your front end posted and create the charge in three steps: classify\nthe products to HS tariff codes, quote tax & duty for the ship-to destination, then create the\npayment intent with the quote attached. Money-mutating calls require a per-request idempotency\nkey (see Idempotency below).\n\n```js\nimport { OpenBorderClient, OpenBorderApiError } from '@open-border/node';\nimport { randomUUID } from 'node:crypto';\n\nconst ob = new OpenBorderClient({ apiKey: process.env.OB_SECRET_KEY });\n\nasync function charge(paymentMethodId) {\n  const address = { line1: '1 Market St', city: 'San Francisco', postal_code: '94105', country: 'US' };\n\n  // 1. Classify the products to HS tariff codes (cached per merchant, so\n  //    re-classifying the same product is cheap).\n  const { classifications } = await ob.createClassification({\n    destination_country: address.country,\n    products: [{ sku: 'HOODIE-M', title: 'Classic Hoodie', description: 'Cotton pullover hoodie' }],\n  });\n  const lineItems = [{\n    sku: 'HOODIE-M',\n    description: 'Classic Hoodie',\n    quantity: 1,\n    unit_amount: 4200, // integer minor units\n    hs_code: classifications[0].hs_code,\n  }];\n\n  // 2. Quote tax & duty for the ship-to destination.\n  const quote = await ob.createTaxQuote({\n    destination_country: address.country,\n    destination_postal_code: address.postal_code,\n    currency: 'USD',\n    shipping_amount: 500,\n    line_items: lineItems,\n  });\n\n  // 3. Create the charge with the quote attached. tax_quote_id fixes the charged\n  //    total (subtotal + shipping + tax + duty); omit it to charge subtotal +\n  //    shipping only (no tax/duty).\n  try {\n    const intent = await ob.createPaymentIntent(\n      {\n        tax_quote_id: quote.id,\n        amount: 4200, // merchandise subtotal, integer minor units\n        currency: 'USD',\n        shipping_amount: 500,\n        payment_method: paymentMethodId,\n        customer: { email: 'buyer@example.com' },\n        billing_address: address,\n        shipping_address: address,\n        line_items: lineItems,\n        merchant_reference: 'order_1042',\n      },\n      { idempotencyKey: randomUUID() },\n    );\n    return intent; // intent.status is 'succeeded' once the charge clears\n  } catch (err) {\n    if (err instanceof OpenBorderApiError) {\n      // Typed and safe: err.code, err.status, err.message — no provider details leak.\n    }\n    throw err;\n  }\n}\n```\n\n### Other operations\n\n| Method | Purpose |\n| --- | --- |\n| `createPaymentIntent(input, { idempotencyKey })` | Create a charge from a payment method token. |\n| `getPaymentIntent(id)` | Fetch a payment intent and its status. |\n| `capturePaymentIntent(input, { idempotencyKey })` | Capture a manual-capture authorization. |\n| `cancelPaymentIntent(input, { idempotencyKey })` | Cancel a manual-capture authorization. |\n| `createRefund(input, { idempotencyKey })` | Refund a captured payment, in full or part. |\n| `createTaxQuote(input)` | Estimate tax and duty before charging. |\n| `createClassification(input)` | Classify products to HS tariff codes. |\n| `getCheckoutConfig(input)` | Resolve the entity and publishable key server-side. |\n\nThe four money-mutating methods take a required `{ idempotencyKey }`; the read and quote calls do\nnot.\n\n### Errors\n\nAny non-2xx response is thrown as an `OpenBorderApiError` with a stable `code`, the HTTP `status`,\nand a safe `message`. A transport failure is thrown with code `network_error`. Provider errors\nare never leaked.\n\n## Idempotency\n\nEvery money-mutating request takes an idempotency key — the `idempotencyKey` option on the SDK,\nor the `Idempotency-Key` header if you call the API directly. Use a unique key per distinct\nrequest: a retry with the same key replays the first response, and the same key with a different\nbody is rejected. This makes a network retry safe and prevents a double charge.\n\n## Sandbox & test mode\n\nThere are two environments:\n\n- **Sandbox (test mode):** `https://api-demo.openborderpayments.com`\n- **Production (live mode):** `https://api.openborderpayments.com`\n\nBoth client packages pick the environment from the key you pass: a live key (`sk_live_…` /\n`pk_live_…`) targets production, and any other (test) key targets the sandbox. Override the\nhost explicitly with `baseUrl` (Node SDK) or `apiBaseUrl` (browser embed), for example to hit\na locally running API.\n\nTest and live are strictly gated: a test key only reaches test rails and a live key only\nreaches live rails — they never mix. With a test key, pay using card `4242 4242 4242 4242`,\nany future expiry, and any CVC. Develop and integrate against the sandbox with your test keys,\nthen switch to your live keys for production.\n\n## Amounts and currency\n\nMoney is always an integer in the currency minor unit, so `4200` in `USD` is $42.00. There is no\nimplicit conversion. Each supported currency (USD, GBP, EUR, CAD, AUD) settles to its own entity,\nselected by the charge currency; tax and duty follow the shipping destination.\n\n## Payouts\n\nOpen Border pays your settled balance to your bank weekly, per settlement currency — a USD\nbalance pays to your USD account, a EUR balance to your EUR account, with no conversion between\nthem. Each payout is your available balance for that currency: captured sales minus the platform\nfee, the rolling reserve (released back to your balance on a 90-day schedule), refunds and\nchargebacks, and any tax withheld under your tax policy. Balances under the per-currency minimum\n(the equivalent of $100) roll into the next week.\n\nAdd a bank account for each currency you sell in from the dashboard **Payouts** page. Details\nare passed directly to our payout partner; Open Border stores only a masked reference. Saving an\naccount for a currency that already has one replaces it.\n\nTrack payouts on the same page, or subscribe a webhook endpoint (dashboard **Webhooks** page) to\nthe payout lifecycle events:\n\n- `payout.created` — the weekly run disbursed your balance to your bank.\n- `payout.in_transit` — the transfer left our payout partner.\n- `payout.paid` — confirmed received by your bank.\n- `payout.failed` — the transfer failed (for example, a closed account); the funds return to\n  your available balance and pay out in a later cycle once the cause is fixed.\n\n## Calling the API directly\n\nYou do not need the SDK. Send your secret key as `Authorization: Bearer sk_test_…` (or the\n`X-API-Key` header) to any endpoint below. Each one is documented in the sections that follow."},"servers":[{"url":"https://api.openborderpayments.com","description":"Production (live mode)"},{"url":"https://api-demo.openborderpayments.com","description":"Sandbox (test mode)"}],"tags":[{"name":"Tax & Duty","description":"Classify products to HS tariff codes, then estimate tax & duty before charging."},{"name":"Payment Intents","description":"Create and confirm a charge, then capture or cancel a manual-capture authorization."},{"name":"Refunds","description":"Refund a captured payment, in full or part."},{"name":"Disputes","description":"Contest and track provider-driven chargebacks."},{"name":"Payment Methods","description":"Cards work out of the box. Wallet payment methods — **Apple Pay** and **Google Pay** —\nrender as a one-tap button above the card form in the checkout drop-in, and additionally\nrequire the domain serving your checkout page to be registered:\n\n1. Register the exact hostname with `POST /v1/payment_method_domains` — a bare, HTTPS-served\n   hostname such as `shop.example.com` (no scheme, path, or port). Subdomains register\n   separately, and `localhost` is not eligible — use a public HTTPS tunnel during\n   development and register the tunnel domain on your test rail.\n2. The registration fans out across every Open Border entity payment account on your API\n   key’s rail and returns each entity’s per-wallet activation (`apple_pay`, `google_pay`).\n   No file hosting or Apple/Google developer account is needed — validation happens\n   server-side.\n3. The wallet button appears automatically once the acquiring entity for the charge currency\n   is `active`: Apple Pay in Safari with a card enrolled in Apple Wallet, Google Pay in\n   Chrome with a saved card. Everyone else sees the card form unchanged.\n4. If a wallet reports `inactive`, fix whatever its `error_message` describes and retry with\n   `POST /v1/payment_method_domains/validate`.\n\nA wallet authorization produces an ordinary payment method token (`pm_…`) and flows through\nthe same server-side charge as a card: your backend attaches it to\n`POST /v1/payment_intents`. The amount the wallet sheet shows the buyer is the total you\nmount the checkout with — always the full landed cost (subtotal + shipping + tax + duty),\nnever the subtotal."}],"security":[{"apiKey":[]},{"apiKeyHeader":[]}],"paths":{"/v1/classifications":{"post":{"operationId":"classifyProducts","summary":"Classify products to HS tariff codes","description":"Classify one or more products to their HS (Harmonized System) tariff codes. Each result carries the `hs_code`, a category, a normalized description, and a confidence in [0, 1]. Pass a known `hs_code` to validate/normalize it instead of classifying from text. Classifications are cached per merchant, so re-classifying the same product is cheap. A request carries at most 25 products and 32 KiB of aggregate raw JSON. Send `application/json` or an `application/*+json` structured media type. The returned `hs_code` is then required on each tax-quote line item.","tags":["Tax & Duty"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifyProductsRequest"},"examples":{"from_text":{"summary":"Classify two products from their titles","value":{"destination_country":"GB","products":[{"sku":"BAG-100","title":"Leather Handbag","description":"Women's leather handbag"},{"sku":"LAPTOP-PRO","title":"Professional Laptop"}]}},"known_hs_code":{"summary":"Validate/normalize a known HS code","value":{"products":[{"sku":"BAG-100","title":"Leather Handbag","hs_code":"420221"}]}}}},"application/*+json":{"schema":{"$ref":"#/components/schemas/ClassifyProductsRequest"},"examples":{"from_text":{"summary":"Classify two products from their titles","value":{"destination_country":"GB","products":[{"sku":"BAG-100","title":"Leather Handbag","description":"Women's leather handbag"},{"sku":"LAPTOP-PRO","title":"Professional Laptop"}]}},"known_hs_code":{"summary":"Validate/normalize a known HS code","value":{"products":[{"sku":"BAG-100","title":"Leather Handbag","hs_code":"420221"}]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Classification"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request exceeds the outer JSON parser payload ceiling (`validation_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Unsupported JSON media type, charset, or content encoding; expected `application/json` or `application/*+json` with a supported charset and encoding (`validation_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/tax_quotes":{"post":{"operationId":"createTaxQuote","summary":"Create a tax & duty quote","description":"Estimate tax and duty for a basket shipping to a destination country, before charging. Each line item carries an `hs_code` (from POST /v1/classifications); the itemized breakdown (subtotal, shipping, tax, duty, total) is returned with a quote `id` valid for 30 minutes. Shipping, when supplied, is taxed by the provider and added to the total. Minor-unit amount fields and the checked quote total are capped at 99,999,999; each line quantity is capped at 10,000. A quote accepts at most 25 line items and 32 KiB of aggregate raw JSON. Send `application/json` or an `application/*+json` structured media type. Pass that `id` as `tax_quote_id` when creating a payment intent — the quote is reloaded and revalidated at charge time, so a stale or mismatched quote is rejected rather than silently re-priced.","tags":["Tax & Duty"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTaxQuoteRequest"},"examples":{"us_usd":{"summary":"obmor_us (USD) — ship to GB (cross-border)","value":{"destination_country":"GB","currency":"USD","shipping_amount":1500,"line_items":[{"description":"Premium Widget","quantity":2,"unit_amount":2500,"sku":"WIDGET-001","hs_code":"847990"}]}},"gb_gbp":{"summary":"obmor_uk — ship to GB (GBP)","value":{"destination_country":"GB","currency":"GBP","shipping_amount":1500,"line_items":[{"description":"Leather Handbag","quantity":1,"unit_amount":8900,"sku":"BAG-100","hs_code":"420221"}]}},"de_eur":{"summary":"obmor_eu — ship to DE (EUR)","value":{"destination_country":"DE","currency":"EUR","shipping_amount":1500,"line_items":[{"description":"Professional Laptop","quantity":1,"unit_amount":24500,"sku":"LAPTOP-PRO","hs_code":"847130"}]}},"ca_cad":{"summary":"obmor_ca — ship to CA (CAD)","value":{"destination_country":"CA","currency":"CAD","shipping_amount":1500,"line_items":[{"description":"Mountain Bike","quantity":1,"unit_amount":15900,"sku":"BIKE-7","hs_code":"871200"}]}},"au_aud":{"summary":"obmor_au — ship to AU (AUD)","value":{"destination_country":"AU","currency":"AUD","shipping_amount":1500,"line_items":[{"description":"Premium Surfboard","quantity":1,"unit_amount":12900,"sku":"SURF-3","hs_code":"950629"}]}}}},"application/*+json":{"schema":{"$ref":"#/components/schemas/CreateTaxQuoteRequest"},"examples":{"us_usd":{"summary":"obmor_us (USD) — ship to GB (cross-border)","value":{"destination_country":"GB","currency":"USD","shipping_amount":1500,"line_items":[{"description":"Premium Widget","quantity":2,"unit_amount":2500,"sku":"WIDGET-001","hs_code":"847990"}]}},"gb_gbp":{"summary":"obmor_uk — ship to GB (GBP)","value":{"destination_country":"GB","currency":"GBP","shipping_amount":1500,"line_items":[{"description":"Leather Handbag","quantity":1,"unit_amount":8900,"sku":"BAG-100","hs_code":"420221"}]}},"de_eur":{"summary":"obmor_eu — ship to DE (EUR)","value":{"destination_country":"DE","currency":"EUR","shipping_amount":1500,"line_items":[{"description":"Professional Laptop","quantity":1,"unit_amount":24500,"sku":"LAPTOP-PRO","hs_code":"847130"}]}},"ca_cad":{"summary":"obmor_ca — ship to CA (CAD)","value":{"destination_country":"CA","currency":"CAD","shipping_amount":1500,"line_items":[{"description":"Mountain Bike","quantity":1,"unit_amount":15900,"sku":"BIKE-7","hs_code":"871200"}]}},"au_aud":{"summary":"obmor_au — ship to AU (AUD)","value":{"destination_country":"AU","currency":"AUD","shipping_amount":1500,"line_items":[{"description":"Premium Surfboard","quantity":1,"unit_amount":12900,"sku":"SURF-3","hs_code":"950629"}]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxQuote"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Request exceeds the outer JSON parser payload ceiling (`validation_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Unsupported JSON media type, charset, or content encoding; expected `application/json` or `application/*+json` with a supported charset and encoding (`validation_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/checkout/config":{"post":{"operationId":"getCheckoutConfig","summary":"Resolve the publishable key + entity for a currency","description":"Resolve the charge/product currency to the Open Border legal entity, its settlement currency, and the entity’s **publishable** key. Call this before collecting card details: tokenize the card on the returned publishable key so the resulting payment method token belongs to the same account the charge runs on (payment method tokens are account-scoped). The publishable key matches the API key’s rail (test vs live). Each supported currency maps to exactly one entity.","tags":["Checkout"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutConfigRequest"},"examples":{"us_usd":{"summary":"Resolve obmor_us from USD","value":{"currency":"USD"}},"gb_gbp":{"summary":"Resolve obmor_uk from GBP","value":{"currency":"GBP"}},"de_eur":{"summary":"Resolve obmor_eu from EUR","value":{"currency":"EUR"}},"ca_cad":{"summary":"Resolve obmor_ca from CAD","value":{"currency":"CAD"}},"au_aud":{"summary":"Resolve obmor_au from AUD","value":{"currency":"AUD"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutConfig"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/checkout/browser_config":{"post":{"operationId":"getBrowserCheckoutConfig","summary":"Resolve checkout config + branding for the embeddable element (publishable key)","description":"The browser-facing sibling of `/v1/checkout/config`, authenticated with a **publishable** key (`pk_…`) as the Bearer token instead of a secret key — safe to call from a storefront page. It returns the resolved entity, the entity’s **publishable** key, the settlement currency, and the merchant’s resolved checkout **branding** (their configured theme, or the base theme when unset), so the embeddable drop-in can render branded before tokenizing the card. Read-only and non-money: a publishable key can never create a charge. The merchant is resolved from the publishable key; the rail (test vs live) matches it.","tags":["Checkout"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserCheckoutConfigRequest"},"examples":{"us_usd":{"summary":"Resolve obmor_us + branding from USD","value":{"currency":"USD"}},"gb_gbp":{"summary":"Resolve obmor_uk + branding from GBP","value":{"currency":"GBP"}},"de_eur":{"summary":"Resolve obmor_eu + branding from EUR","value":{"currency":"EUR"}},"ca_cad":{"summary":"Resolve obmor_ca + branding from CAD","value":{"currency":"CAD"}},"au_aud":{"summary":"Resolve obmor_au + branding from AUD","value":{"currency":"AUD"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserCheckoutConfig"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/payment_method_domains":{"post":{"operationId":"registerPaymentMethodDomain","summary":"Register the checkout domain for wallet payment methods","description":"Register the domain that hosts your checkout so wallet payment methods (Apple Pay, Google Pay) can render there. Registration fans out across every Open Border entity’s payment account on the API key’s rail and returns each entity’s per-wallet activation (`apple_pay`, `google_pay`); the wallet button renders once the acquiring entity for the charge currency is `active`. No file hosting or Apple/Google account is needed — validation is handled server-side. Subdomains register separately (`shop.example.com` is not covered by `example.com`). Merchants have **one** domain: re-posting the same domain refreshes its activation, while posting a different domain while one exists returns `payment_method_domain_exists` (409).","tags":["Payment Methods"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterPaymentMethodDomainRequest"},"examples":{"storefront":{"summary":"Register the storefront checkout domain","value":{"domain":"shop.example.com"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodDomain"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"operationId":"listPaymentMethodDomains","summary":"List the registered checkout domain and its wallet activation","description":"Read the merchant’s registered checkout domain on the API key’s rail, with each Open Border entity’s per-wallet (`apple_pay`, `google_pay`) activation status. `data` is empty when no domain has been registered yet.","tags":["Payment Methods"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodDomainList"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/payment_method_domains/validate":{"post":{"operationId":"validatePaymentMethodDomains","summary":"Re-run wallet validation for the registered domain","description":"Retry wallet activation for every entity where any wallet (`apple_pay`, `google_pay`) is still `inactive` (fully active entities are left untouched) and return the refreshed per-entity statuses. Use this after fixing whatever the `error_message` reported. Returns `not_found` when no domain is registered on this rail.","tags":["Payment Methods"],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodDomain"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No payment method domain is registered (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/payment_intents":{"post":{"operationId":"createPaymentIntent","summary":"Create and confirm (or authorize) a payment intent","description":"Create and confirm a charge. The acquiring entity is resolved from the charge/product `currency`; the billing address is retained for AVS/audit only and does not route. `amount` is the merchandise subtotal in minor units. Pass an optional `tax_quote_id` to apply a previously issued quote — it fixes the charged total (subtotal + shipping + tax + duty) and client-supplied tax/duty are never trusted; omit it to charge subtotal + shipping only (no tax/duty). Shipping address is the tax/duty destination. Minor-unit amount fields and the final checked charge are capped at 99,999,999; each line quantity is capped at 10,000. With `capture_method` `automatic` (the default) the charge is captured immediately and the intent becomes `succeeded`; with `manual` the funds are only authorized (intent becomes `authorized`) to be captured or canceled later. Send a unique `Idempotency-Key`; a retry with the same key replays the first response. A retry is stopped with `idempotency_recovery_required` when the original checkout may have reached the provider and is too old to retry safely.","tags":["Payment Intents"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentIntentRequest"},"examples":{"us_usd_automatic_no_tax":{"summary":"obmor_us — automatic capture (USD), no tax/duty.","value":{"amount":5000,"currency":"USD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com","name":"Test Buyer"},"billing_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"shipping_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"line_items":[{"description":"Premium Widget","quantity":2,"unit_amount":2500,"sku":"WIDGET-001","hs_code":"847990"}],"merchant_reference":"order-us-automatic-001"}},"gb_gbp_automatic_no_tax":{"summary":"obmor_uk — automatic capture (GBP), no tax/duty.","value":{"amount":8900,"currency":"GBP","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.co.uk","name":"Test Buyer"},"billing_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"shipping_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"line_items":[{"description":"Leather Handbag","quantity":1,"unit_amount":8900,"sku":"BAG-100","hs_code":"420221"}],"merchant_reference":"order-gb-automatic-001"}},"de_eur_automatic_no_tax":{"summary":"obmor_eu — automatic capture (EUR), no tax/duty.","value":{"amount":24500,"currency":"EUR","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.de","name":"Test Buyer"},"billing_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"shipping_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"line_items":[{"description":"Professional Laptop","quantity":1,"unit_amount":24500,"sku":"LAPTOP-PRO","hs_code":"847130"}],"merchant_reference":"order-de-automatic-001"}},"ca_cad_automatic_no_tax":{"summary":"obmor_ca — automatic capture (CAD), no tax/duty.","value":{"amount":15900,"currency":"CAD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.ca","name":"Test Buyer"},"billing_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"shipping_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"line_items":[{"description":"Mountain Bike","quantity":1,"unit_amount":15900,"sku":"BIKE-7","hs_code":"871200"}],"merchant_reference":"order-ca-automatic-001"}},"au_aud_automatic_no_tax":{"summary":"obmor_au — automatic capture (AUD), no tax/duty.","value":{"amount":12900,"currency":"AUD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com.au","name":"Test Buyer"},"billing_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"shipping_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"line_items":[{"description":"Premium Surfboard","quantity":1,"unit_amount":12900,"sku":"SURF-3","hs_code":"950629"}],"merchant_reference":"order-au-automatic-001"}},"us_usd_manual_no_tax":{"summary":"obmor_us — manual capture (USD), no tax/duty.","value":{"amount":5000,"currency":"USD","capture_method":"manual","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com","name":"Test Buyer"},"billing_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"shipping_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"line_items":[{"description":"Premium Widget","quantity":2,"unit_amount":2500,"sku":"WIDGET-001","hs_code":"847990"}],"merchant_reference":"order-us-manual-001"}},"gb_gbp_manual_no_tax":{"summary":"obmor_uk — manual capture (GBP), no tax/duty.","value":{"amount":8900,"currency":"GBP","capture_method":"manual","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.co.uk","name":"Test Buyer"},"billing_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"shipping_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"line_items":[{"description":"Leather Handbag","quantity":1,"unit_amount":8900,"sku":"BAG-100","hs_code":"420221"}],"merchant_reference":"order-gb-manual-001"}},"de_eur_manual_no_tax":{"summary":"obmor_eu — manual capture (EUR), no tax/duty.","value":{"amount":24500,"currency":"EUR","capture_method":"manual","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.de","name":"Test Buyer"},"billing_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"shipping_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"line_items":[{"description":"Professional Laptop","quantity":1,"unit_amount":24500,"sku":"LAPTOP-PRO","hs_code":"847130"}],"merchant_reference":"order-de-manual-001"}},"ca_cad_manual_no_tax":{"summary":"obmor_ca — manual capture (CAD), no tax/duty.","value":{"amount":15900,"currency":"CAD","capture_method":"manual","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.ca","name":"Test Buyer"},"billing_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"shipping_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"line_items":[{"description":"Mountain Bike","quantity":1,"unit_amount":15900,"sku":"BIKE-7","hs_code":"871200"}],"merchant_reference":"order-ca-manual-001"}},"au_aud_manual_no_tax":{"summary":"obmor_au — manual capture (AUD), no tax/duty.","value":{"amount":12900,"currency":"AUD","capture_method":"manual","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com.au","name":"Test Buyer"},"billing_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"shipping_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"line_items":[{"description":"Premium Surfboard","quantity":1,"unit_amount":12900,"sku":"SURF-3","hs_code":"950629"}],"merchant_reference":"order-au-manual-001"}},"us_usd_automatic_tax":{"summary":"obmor_us — automatic capture (USD) with tax/duty. Replace tax_quote_id with the id from a createTaxQuote call.","value":{"tax_quote_id":"00000000-0000-4000-8000-000000000000","amount":5000,"currency":"USD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com","name":"Test Buyer"},"billing_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"shipping_address":{"line1":"1 Market St","city":"San Francisco","state":"CA","postal_code":"94105","country":"US"},"line_items":[{"description":"Premium Widget","quantity":2,"unit_amount":2500,"sku":"WIDGET-001","hs_code":"847990"}],"merchant_reference":"order-us-automatic-001"}},"gb_gbp_automatic_tax":{"summary":"obmor_uk — automatic capture (GBP) with tax/duty. Replace tax_quote_id with the id from a createTaxQuote call.","value":{"tax_quote_id":"00000000-0000-4000-8000-000000000000","amount":8900,"currency":"GBP","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.co.uk","name":"Test Buyer"},"billing_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"shipping_address":{"line1":"10 Downing St","city":"London","postal_code":"SW1A 2AA","country":"GB"},"line_items":[{"description":"Leather Handbag","quantity":1,"unit_amount":8900,"sku":"BAG-100","hs_code":"420221"}],"merchant_reference":"order-gb-automatic-001"}},"de_eur_automatic_tax":{"summary":"obmor_eu — automatic capture (EUR) with tax/duty. Replace tax_quote_id with the id from a createTaxQuote call.","value":{"tax_quote_id":"00000000-0000-4000-8000-000000000000","amount":24500,"currency":"EUR","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.de","name":"Test Buyer"},"billing_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"shipping_address":{"line1":"Unter den Linden 1","city":"Berlin","postal_code":"10117","country":"DE"},"line_items":[{"description":"Professional Laptop","quantity":1,"unit_amount":24500,"sku":"LAPTOP-PRO","hs_code":"847130"}],"merchant_reference":"order-de-automatic-001"}},"ca_cad_automatic_tax":{"summary":"obmor_ca — automatic capture (CAD) with tax/duty. Replace tax_quote_id with the id from a createTaxQuote call.","value":{"tax_quote_id":"00000000-0000-4000-8000-000000000000","amount":15900,"currency":"CAD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.ca","name":"Test Buyer"},"billing_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"shipping_address":{"line1":"1055 W Pender St","city":"Vancouver","state":"BC","postal_code":"V6E 2V6","country":"CA"},"line_items":[{"description":"Mountain Bike","quantity":1,"unit_amount":15900,"sku":"BIKE-7","hs_code":"871200"}],"merchant_reference":"order-ca-automatic-001"}},"au_aud_automatic_tax":{"summary":"obmor_au — automatic capture (AUD) with tax/duty. Replace tax_quote_id with the id from a createTaxQuote call.","value":{"tax_quote_id":"00000000-0000-4000-8000-000000000000","amount":12900,"currency":"AUD","capture_method":"automatic","payment_method":"pm_card_visa","shipping_amount":1500,"customer":{"email":"buyer@example.com.au","name":"Test Buyer"},"billing_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"shipping_address":{"line1":"101 Miller St","city":"North Sydney","state":"NSW","postal_code":"2060","country":"AU"},"line_items":[{"description":"Premium Surfboard","quantity":1,"unit_amount":12900,"sku":"SURF-3","hs_code":"950629"}],"merchant_reference":"order-au-automatic-001"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntent"}}}},"400":{"description":"Validation error, or a missing `Idempotency-Key` (`validation_error`, `idempotency_key_required`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Referenced resource not found (`not_found`, `tax_quote_not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency conflict — key reused with a different body, or a concurrent request with the same key still in flight, or a provider-backed checkout requires operator recovery (`idempotency_key_conflict`, `idempotency_in_progress`, `idempotency_recovery_required`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"recoveryRequired":{"summary":"The original checkout is too old to retry safely","value":{"error":{"code":"idempotency_recovery_required","message":"This payment attempt requires manual review before it can be retried","details":{"requires_manual_review":true}}}}}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/payment_intents/{payment_intent_id}":{"get":{"operationId":"getPaymentIntent","summary":"Retrieve a payment intent status","description":"Read the current Open Border payment-intent status for the authenticated merchant. This route is read-only: it does not require an `Idempotency-Key`, does not return the provider client secret, and returns `not_found` if the id is absent or belongs to another merchant.","tags":["Payment Intents"],"parameters":[{"name":"payment_intent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentStatus"}}}},"400":{"description":"Validation error (`validation_error`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Payment intent not found (`not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/capture":{"post":{"operationId":"capturePaymentIntent","summary":"Capture a manual-capture payment intent","description":"Capture the full authorized amount of a manual-capture payment intent that is in the `authorized` state, settling the funds and moving the intent to `captured`. Only valid for intents created with `capture_method` `manual`; partial capture is not supported. Send a unique `Idempotency-Key`; a retry with the same key replays the first response.","tags":["Payment Intents"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapturePaymentIntentRequest"},"examples":{"capture":{"summary":"Capture an authorized intent. Replace payment_intent_id with a real id.","value":{"payment_intent_id":"11111111-1111-4111-8111-111111111111"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentAction"}}}},"400":{"description":"Validation error, or a missing `Idempotency-Key` (`validation_error`, `idempotency_key_required`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Referenced resource not found (`not_found`, `tax_quote_not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency conflict — key reused with a different body, or a concurrent request with the same key still in flight (`idempotency_key_conflict`, `idempotency_in_progress`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Illegal state transition (`invalid_state_transition`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cancel":{"post":{"operationId":"cancelPaymentIntent","summary":"Cancel an uncaptured (authorized) payment intent","description":"Release the authorization on an uncaptured payment intent that is in the `authorized` state, moving it to `canceled`. The funds are never captured, and a canceled intent can no longer be captured or refunded. Send a unique `Idempotency-Key`; a retry with the same key replays the first response.","tags":["Payment Intents"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelPaymentIntentRequest"},"examples":{"cancel":{"summary":"Cancel an authorized intent. Replace payment_intent_id with a real id.","value":{"payment_intent_id":"11111111-1111-4111-8111-111111111111"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentIntentAction"}}}},"400":{"description":"Validation error, or a missing `Idempotency-Key` (`validation_error`, `idempotency_key_required`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Referenced resource not found (`not_found`, `tax_quote_not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency conflict — key reused with a different body, or a concurrent request with the same key still in flight (`idempotency_key_conflict`, `idempotency_in_progress`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Illegal state transition (`invalid_state_transition`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/refund":{"post":{"operationId":"createRefund","summary":"Refund a payment intent (full or partial)","description":"Refund a captured payment intent, in full or in part. Omit `amount` to refund the entire captured total; supply `amount` in minor units for a partial refund (the sum of refunds may not exceed the captured total). Send a unique `Idempotency-Key`; a retry with the same key replays the first response.","tags":["Refunds"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRefundRequest"},"examples":{"full":{"summary":"Full refund (omit amount). Replace payment_intent_id with a real id.","value":{"payment_intent_id":"11111111-1111-4111-8111-111111111111"}},"partial":{"summary":"Partial refund of 1000 minor units. Replace payment_intent_id with a real id.","value":{"payment_intent_id":"11111111-1111-4111-8111-111111111111","amount":1000,"reason":"customer_request"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refund"}}}},"400":{"description":"Validation error, or a missing `Idempotency-Key` (`validation_error`, `idempotency_key_required`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Referenced resource not found (`not_found`, `tax_quote_not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency conflict — key reused with a different body, or a concurrent request with the same key still in flight (`idempotency_key_conflict`, `idempotency_in_progress`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/disputes/{id}/evidence":{"post":{"operationId":"submitDisputeEvidence","summary":"Submit evidence contesting a dispute","description":"Submit structured, text-only evidence contesting a chargeback. The dispute (referenced by the path `id`) must be awaiting a response; evidence is forwarded to the payment provider and the dispute moves to `under_review`. Disputes themselves are opened and resolved by the provider (delivered via webhooks), not created through the API. Send a unique `Idempotency-Key`; a retry with the same key replays the first response.","tags":["Disputes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitDisputeEvidenceRequest"},"examples":{"shipped_goods":{"summary":"Contest a dispute with proof of delivery. Replace the :id path param with a real dispute id.","value":{"product_description":"Premium Widget, 2-pack","customer_name":"Test Buyer","shipping_carrier":"UPS","shipping_tracking_number":"1Z999AA10123456784","shipping_date":"2026-06-01","uncategorized_text":"Signed proof of delivery attached out of band."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dispute"}}}},"400":{"description":"Validation error, or a missing `Idempotency-Key` (`validation_error`, `idempotency_key_required`, `invalid_amount`, …)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing/invalid key or wrong rail (`unauthorized`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dispute not found (`dispute_not_found`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Idempotency conflict — key reused with a different body, or a concurrent request with the same key still in flight (`idempotency_key_conflict`, `idempotency_in_progress`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Dispute is not accepting evidence (`dispute_not_actionable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Shared API quota exceeded (`rate_limit_exceeded`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"headers":{"Retry-After":{"description":"Whole seconds until this policy may admit another request","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Internal or provider error (`internal_error`, `provider_error`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Shared rate-limit store unavailable while fail-closed (`rate_limit_unavailable`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key sent as `Authorization: Bearer sk_test_… | sk_live_…`. Test keys reach test rails only; live keys reach live rails only and require KYB approval. The two never mix (a live key on non-production rails is rejected with `unauthorized`)."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative to the bearer scheme: the same key sent as `X-API-Key`."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":128},"example":"idem-9bd82b87-9ed4-4dca-b95c-b2a7c86c2eda","description":"Client-supplied key for money-mutating POSTs, unique per distinct request. The first response is stored and replayed on retry; a retried key with a different body is an `idempotency_key_conflict`."}},"schemas":{"ClassifyProductsRequest":{"type":"object","properties":{"destination_country":{"type":"string","minLength":2,"maxLength":2},"products":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"object","properties":{"sku":{"type":"string","minLength":1,"maxLength":128},"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1,"maxLength":500},"hs_code":{"type":"string","minLength":1,"maxLength":32}},"required":["title"],"additionalProperties":false}}},"required":["products"],"additionalProperties":false},"Classification":{"type":"object","properties":{"classifications":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sku":{"type":"string"},"hs_code":{"type":"string","minLength":1},"category":{"type":"string"},"description":{"type":"string"},"confidence":{"type":"number"}},"required":["index","hs_code","category","description","confidence"],"additionalProperties":false}}},"required":["classifications"],"additionalProperties":false},"CreateTaxQuoteRequest":{"type":"object","properties":{"destination_country":{"type":"string","minLength":2,"maxLength":2},"destination_postal_code":{"type":"string","minLength":1,"maxLength":32},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"shipping_amount":{"type":"integer","minimum":0,"maximum":99999999},"line_items":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"object","properties":{"sku":{"type":"string","minLength":1,"maxLength":128},"description":{"type":"string","minLength":1,"maxLength":500},"quantity":{"type":"integer","exclusiveMinimum":0,"maximum":10000},"unit_amount":{"type":"integer","minimum":0,"maximum":99999999},"hs_code":{"type":"string","minLength":1,"maxLength":32}},"required":["description","quantity","unit_amount","hs_code"],"additionalProperties":false}},"customer":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"additionalProperties":false}},"required":["destination_country","currency","line_items"],"additionalProperties":false},"TaxQuote":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"destination_country":{"type":"string","minLength":2,"maxLength":2},"destination_postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"amount_breakdown":{"type":"object","properties":{"subtotal":{"type":"integer","minimum":0,"maximum":99999999},"shipping":{"type":"integer","minimum":0,"maximum":99999999},"tax":{"type":"integer","minimum":0,"maximum":99999999},"duty":{"type":"integer","minimum":0,"maximum":99999999},"total":{"type":"integer","minimum":0,"maximum":99999999},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["subtotal","shipping","tax","duty","total","currency"],"additionalProperties":false},"classifications":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hs_code":{"type":"string"},"confidence":{"type":"number"}},"required":["index","hs_code","confidence"],"additionalProperties":false}},"expires_at":{"type":"string"}},"required":["id","destination_country","destination_postal_code","currency","amount_breakdown","classifications","expires_at"],"additionalProperties":false},"CheckoutConfigRequest":{"type":"object","properties":{"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["currency"],"additionalProperties":false},"CheckoutConfig":{"type":"object","properties":{"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"publishable_key":{"type":"string"},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"country":{"type":"string","minLength":2,"maxLength":2}},"required":["entity","publishable_key","currency","country"],"additionalProperties":false},"BrowserCheckoutConfigRequest":{"type":"object","properties":{"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["currency"],"additionalProperties":false},"BrowserCheckoutConfig":{"type":"object","properties":{"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"publishable_key":{"type":"string"},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"country":{"type":"string","minLength":2,"maxLength":2},"branding":{"type":"object","properties":{"logoUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"primaryColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"accentColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"textColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"backgroundColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"fontFamily":{"type":"string","minLength":1,"maxLength":100},"borderRadius":{"type":"integer","minimum":0,"maximum":40},"buttonLabel":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}]}},"required":["logoUrl","primaryColor","accentColor","textColor","backgroundColor","fontFamily","borderRadius","buttonLabel"],"additionalProperties":false}},"required":["entity","publishable_key","currency","country","branding"],"additionalProperties":false},"RegisterPaymentMethodDomainRequest":{"type":"object","properties":{"domain":{"type":"string","pattern":"^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$","description":"The checkout domain that shows the wallet button, e.g. shop.example.com. Subdomains register separately."}},"required":["domain"],"additionalProperties":false},"PaymentMethodDomain":{"type":"object","properties":{"domain":{"type":"string"},"mode":{"type":"string","enum":["test","live"]},"registrations":{"type":"array","items":{"type":"object","properties":{"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"apple_pay":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"error_message":{"type":"string"}},"required":["status"],"additionalProperties":false},"google_pay":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"error_message":{"type":"string"}},"required":["status"],"additionalProperties":false}},"required":["entity","apple_pay","google_pay"],"additionalProperties":false}}},"required":["domain","mode","registrations"],"additionalProperties":false},"PaymentMethodDomainList":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"mode":{"type":"string","enum":["test","live"]},"registrations":{"type":"array","items":{"type":"object","properties":{"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"apple_pay":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"error_message":{"type":"string"}},"required":["status"],"additionalProperties":false},"google_pay":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"error_message":{"type":"string"}},"required":["status"],"additionalProperties":false}},"required":["entity","apple_pay","google_pay"],"additionalProperties":false}}},"required":["domain","mode","registrations"],"additionalProperties":false}}},"required":["data"],"additionalProperties":false},"CreatePaymentIntentRequest":{"type":"object","properties":{"tax_quote_id":{"description":"Server-issued tax quote id used to price this charge. Optional — when omitted, the charge is priced subtotal + shipping only (no tax/duty).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":99999999},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"shipping_amount":{"type":"integer","minimum":0,"maximum":99999999},"capture_method":{"type":"string","enum":["automatic","manual"]},"payment_method":{"type":"string","pattern":"^pm_.*","description":"Payment method token (pm_…) produced by the Open Border checkout element in the browser, against the resolved entity account."},"customer":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"name":{"type":"string","minLength":1}},"required":["email"],"additionalProperties":false},"billing_address":{"type":"object","properties":{"line1":{"type":"string","minLength":1},"line2":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"state":{"type":"string","minLength":1},"postal_code":{"type":"string","minLength":1},"country":{"type":"string","minLength":2,"maxLength":2}},"required":["line1","country"],"additionalProperties":false},"shipping_address":{"type":"object","properties":{"line1":{"type":"string","minLength":1},"line2":{"type":"string","minLength":1},"city":{"type":"string","minLength":1},"state":{"type":"string","minLength":1},"postal_code":{"type":"string","minLength":1},"country":{"type":"string","minLength":2,"maxLength":2}},"required":["line1","country"],"additionalProperties":false},"line_items":{"minItems":1,"type":"array","items":{"type":"object","properties":{"sku":{"type":"string","minLength":1},"description":{"type":"string","minLength":1},"quantity":{"type":"integer","exclusiveMinimum":0,"maximum":10000},"unit_amount":{"type":"integer","minimum":0,"maximum":99999999},"hs_code":{"type":"string","minLength":1}},"required":["description","quantity","unit_amount","hs_code"],"additionalProperties":false}},"merchant_reference":{"type":"string","minLength":1},"metadata":{"type":"object","propertyNames":{"type":"string","not":{"const":"obmor_merchant_id"}},"additionalProperties":{"type":"string"},"description":"Merchant metadata (maximum 49 entries). The obmor_merchant_id key is reserved for server use.","maxProperties":49}},"required":["amount","currency","payment_method","customer","billing_address","shipping_address","line_items","merchant_reference"],"additionalProperties":false},"PaymentIntent":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","description":"requires_action | authorized | succeeded | captured | canceled | failed"},"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"amount_breakdown":{"type":"object","properties":{"subtotal":{"type":"integer","minimum":0,"maximum":99999999},"shipping":{"type":"integer","minimum":0,"maximum":99999999},"tax":{"type":"integer","minimum":0,"maximum":99999999},"duty":{"type":"integer","minimum":0,"maximum":99999999},"total":{"type":"integer","minimum":0,"maximum":99999999},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["subtotal","shipping","tax","duty","total","currency"],"additionalProperties":false},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","status","entity","amount_breakdown","client_secret"],"additionalProperties":false},"PaymentIntentStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","description":"requires_action | authorized | succeeded | captured | canceled | failed"},"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amount_captured":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["id","status","entity","amount","amount_captured","currency"],"additionalProperties":false},"CapturePaymentIntentRequest":{"type":"object","properties":{"payment_intent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["payment_intent_id"],"additionalProperties":false},"PaymentIntentAction":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","enum":["captured","canceled"]},"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amount_captured":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]}},"required":["id","status","entity","amount","amount_captured","currency"],"additionalProperties":false},"CancelPaymentIntentRequest":{"type":"object","properties":{"payment_intent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["payment_intent_id"],"additionalProperties":false},"CreateRefundRequest":{"type":"object","properties":{"payment_intent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"reason":{"type":"string","minLength":1}},"required":["payment_intent_id"],"additionalProperties":false},"Refund":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"status":{"type":"string","description":"succeeded | pending | failed"},"payment_intent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]}},"required":["id","status","payment_intent_id","amount","currency","entity"],"additionalProperties":false},"SubmitDisputeEvidenceRequest":{"type":"object","properties":{"product_description":{"type":"string","minLength":1},"customer_name":{"type":"string","minLength":1},"customer_email_address":{"type":"string","minLength":1},"customer_purchase_ip":{"type":"string","minLength":1},"billing_address":{"type":"string","minLength":1},"shipping_address":{"type":"string","minLength":1},"shipping_carrier":{"type":"string","minLength":1},"shipping_tracking_number":{"type":"string","minLength":1},"shipping_date":{"type":"string","minLength":1},"service_date":{"type":"string","minLength":1},"access_activity_log":{"type":"string","minLength":1},"refund_policy_disclosure":{"type":"string","minLength":1},"refund_refusal_explanation":{"type":"string","minLength":1},"cancellation_policy_disclosure":{"type":"string","minLength":1},"cancellation_rebuttal":{"type":"string","minLength":1},"duplicate_charge_explanation":{"type":"string","minLength":1},"uncategorized_text":{"type":"string","minLength":1}},"additionalProperties":false},"Dispute":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"mode":{"type":"string","enum":["test","live"]},"status":{"type":"string","description":"needs_response | under_review | won | lost | warning_needs_response | …"},"transaction_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"payment_intent_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["USD","GBP","EUR","CAD","AUD"]},"entity":{"type":"string","enum":["obmor_us","obmor_uk","obmor_eu","obmor_ca","obmor_au"]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"evidence_due_by":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"evidence_submitted_at":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"can_submit_evidence":{"type":"boolean"},"evidence_prefill":{"type":"object","properties":{"product_description":{"anyOf":[{"type":"string"},{"type":"null"}]},"customer_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"customer_email_address":{"anyOf":[{"type":"string"},{"type":"null"}]},"billing_address":{"anyOf":[{"type":"string"},{"type":"null"}]},"shipping_address":{"anyOf":[{"type":"string"},{"type":"null"}]},"billing_address_components":{"anyOf":[{"type":"object","properties":{"line1":{"type":"string"},"line2":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"type":"string"}},"required":["line1","line2","city","state","postal_code","country"],"additionalProperties":false},{"type":"null"}]},"shipping_address_components":{"anyOf":[{"type":"object","properties":{"line1":{"type":"string"},"line2":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"type":"string"}},"required":["line1","line2","city","state","postal_code","country"],"additionalProperties":false},{"type":"null"}]}},"required":["product_description","customer_name","customer_email_address","billing_address","shipping_address","billing_address_components","shipping_address_components"],"additionalProperties":false},"created_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updated_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","mode","status","transaction_id","payment_intent_id","amount","currency","entity","reason","evidence_due_by","evidence_submitted_at","can_submit_evidence","created_at","updated_at"],"additionalProperties":false},"ErrorResponse":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message"],"properties":{"code":{"type":"string","enum":["country_not_supported","currency_mismatch","invalid_amount","invalid_currency","validation_error","unauthorized","rate_limit_exceeded","rate_limit_unavailable","idempotency_key_required","idempotency_key_conflict","idempotency_in_progress","idempotency_recovery_required","not_found","invalid_state_transition","provider_error","internal_error","tax_quote_failed","tax_quote_not_found","tax_quote_expired","tax_quote_mismatch","domestic_not_supported","classification_failed","api_key_expired","api_key_revoked","api_key_conflict","api_key_limit_reached","merchant_not_live","merchant_context_required","domain_trust_required","last_owner_required","merchant_user_email_conflict","invite_token_invalid","insufficient_role","already_member","dispute_not_found","dispute_not_actionable","payment_method_domain_exists","payout_not_found","payout_below_minimum","invoice_not_found","settlement_provider_error","ledger_imbalance","identity_mirror_unavailable"]},"message":{"type":"string"},"details":{}}}}}}}}