{"openapi":"3.1.0","info":{"title":"Xaalis API","version":"0.1.0","description":"Accept Wave & Orange Money payments and send payouts in Senegal. Amounts are integer XOF."},"servers":[{"url":"https://api.xaalis.org"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Merchant key (sk_* or rk_*). Restricted rk_* keys use the same permissions listed by the OAuth alternative."},"oauth2":{"type":"oauth2","description":"Owner-consented merchant access via authorization code with PKCE (S256 required). Request resource=https://mcp.xaalis.org when authorizing and exchanging the code; tokens are bound to that MCP resource and the selected merchant and mode. Account introspection needs no API permission; request openid for that flow. Scopes do not bypass owner consent, merchant status or test/live restrictions.","flows":{"authorizationCode":{"authorizationUrl":"https://api.xaalis.org/dashboard/auth/oauth2/authorize","tokenUrl":"https://api.xaalis.org/dashboard/auth/oauth2/token","refreshUrl":"https://api.xaalis.org/dashboard/auth/oauth2/token","scopes":{"openid":"Identify the consenting owner","offline_access":"Refresh consented access","payments:read":"Read payments and their refunds","payments:write":"Create payments and simulate test payments","refunds:write":"Create full payment refunds","subscriptions:read":"Read subscriptions and invoices","subscriptions:write":"Create and cancel subscriptions; advance test subscriptions","payouts:read":"Read merchant payouts","payouts:write":"Create merchant payouts","balance:read":"Read the merchant balance and payout fee","webhooks:read":"Read webhook delivery history","webhooks:write":"Update the merchant webhook URL","agent_wallets:read":"Read agent wallets, balances, transfers, payouts and key metadata","agent_wallets:write":"Create, fund, reclaim and disable wallets; issue and revoke agent keys"}}}},"agentBearerAuth":{"type":"http","scheme":"bearer","description":"Wallet-scoped agent key: ak_test_... or ak_live_..."},"dashboardSession":{"type":"apiKey","in":"cookie","name":"better-auth.session_token","description":"Better Auth dashboard session cookie; obtain via /dashboard/auth/sign-in/magic-link."},"checkoutSecret":{"type":"apiKey","in":"query","name":"cs","description":"Payment or invoice link client secret from checkout_url; required for hosted checkout routes."}},"headers":{"RateLimitPolicy":{"schema":{"type":"string"},"description":"Present after quota evaluation: structured list of policy labels with q=request allowance and w=rolling-window seconds (IETF draft-ietf-httpapi-ratelimit-headers-11)."},"RateLimit":{"schema":{"type":"string"},"description":"Present after quota evaluation: matching policy labels with r=remaining requests and t=effective-window seconds. Snapshot, not a guarantee; omitted when no quota was evaluated."},"RetryAfter":{"schema":{"type":"string"},"description":"Minimum seconds to wait before retrying. Takes precedence over the quota snapshot."}},"schemas":{"PublicPayment":{"type":"object","properties":{"id":{"type":"string"},"livemode":{"type":"boolean"},"amount":{"type":"integer"},"currency":{"type":"string"},"status":{"type":"string","enum":["requires_payment_method","processing","succeeded","failed","expired","refunded"]},"description":{"type":["string","null"]},"merchant":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"provider":{"type":["string","null"],"enum":["wave","orange_money","mock",null]},"available_providers":{"type":"array","items":{"type":"string","enum":["wave","orange_money"]}},"next_action":{"$ref":"#/components/schemas/NextAction"},"expires_at":{"type":"string"},"return_url":{"type":["string","null"],"description":"Where to send the customer once status is terminal"}},"required":["id","livemode","amount","currency","status","description","merchant","provider","available_providers","next_action","expires_at","return_url"]},"NextAction":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["redirect"]},"url":{"type":"string"}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["qr_code"]},"qrCodeBase64":{"type":"string"},"deeplinks":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","deeplinks"]},{"type":"null"}]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]},"AgentApprovalPin":{"allOf":[{"$ref":"#/components/schemas/AgentPayoutApproval"},{"type":"object","properties":{"recipient":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"}},"required":["phone"]},"purpose":{"type":"string","enum":["agent_approval"]},"wallet_name":{"type":"string"},"business_name":{"type":"string"},"pin_expires_at":{"type":"string"}},"required":["purpose","wallet_name","business_name","pin_expires_at"]}]},"AgentPayoutApproval":{"type":"object","properties":{"object":{"type":"string","enum":["agent_payout_approval"]},"id":{"type":"string"},"wallet_id":{"type":"string"},"livemode":{"type":"boolean"},"status":{"type":"string","enum":["pending","approved","declined","expired"]},"amount":{"type":"integer"},"fee":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"provider":{"type":"string","enum":["wave","orange_money"]},"recipient":{"type":"object","properties":{"phone":{"type":"string","description":"Masked phone; not a provider-confirmed identity"}},"required":["phone"]},"action_id":{"type":"string"},"expires_at":{"type":"string"},"payout_id":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["object","id","wallet_id","livemode","status","amount","fee","currency","provider","recipient","action_id","expires_at","payout_id","created_at"]},"Payout":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["payout"]},"agent_wallet_id":{"type":["string","null"]},"livemode":{"type":"boolean"},"amount":{"type":"integer"},"fee":{"type":"integer"},"currency":{"type":"string"},"provider":{"type":"string","enum":["wave","orange_money","mock"]},"status":{"type":"string","enum":["pending","processing","succeeded","failed"]},"recipient":{"type":"object","properties":{"phone":{"type":"string"},"name":{"type":["string","null"]}},"required":["phone","name"]},"client_reference":{"type":["string","null"]},"failure_reason":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","object","agent_wallet_id","livemode","amount","fee","currency","provider","status","recipient","client_reference","failure_reason","created_at","updated_at"]},"SandboxSignup":{"type":"object","properties":{"object":{"type":"string","enum":["sandbox_signup"]},"merchant":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["merchant"]},"name":{"type":"string"},"email":{"type":"string"},"status":{"type":"string","enum":["pending_review"]}},"required":["id","object","name","email","status"]},"secret_key":{"type":"string"},"webhook_secret":{"type":"string"}},"required":["object","merchant","secret_key","webhook_secret"]},"SandboxSignupInput":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"business_name":{"type":"string","minLength":2,"maxLength":120},"terms_version":{"$ref":"#/components/schemas/MerchantTermsVersion"},"webhook_url":{"type":"string","format":"uri"}},"required":["email","business_name"],"additionalProperties":false},"MerchantTermsVersion":{"type":"string","maxLength":100,"pattern":"^merchant-terms@[0-9]+(?:\\.[0-9]+){1,2}(?:-[A-Za-z0-9.-]+)?$","description":"Version explicitly accepted by the caller; optional until legal publication"},"LiveSignup":{"type":"object","properties":{"object":{"type":"string","enum":["live_signup"]},"merchant":{"type":"object","properties":{"object":{"type":"string","enum":["merchant"]},"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"status":{"type":"string","enum":["pending_review"]}},"required":["object","id","name","email","status"]},"login_email_sent":{"type":"boolean","enum":[true]}},"required":["object","merchant","login_email_sent"]},"LiveSignupInput":{"type":"object","properties":{"email":{"type":"string","maxLength":254,"format":"email"},"business_name":{"type":"string","minLength":2,"maxLength":120},"terms_version":{"$ref":"#/components/schemas/MerchantTermsVersion"},"sandbox_merchant_id":{"type":"string","maxLength":100,"pattern":"^mer_[A-Za-z0-9]+$","description":"Unverified hint only; does not link accounts or copy settings"}},"required":["email","business_name"],"additionalProperties":false},"AgentPayoutList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"AgentWallet":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["agent_wallet"]},"livemode":{"type":"boolean"},"name":{"type":"string"},"status":{"type":"string","enum":["active","disabled"]},"provider":{"type":"string","enum":["wave","orange_money"]},"max_payout_amount":{"type":"integer"},"max_daily_amount":{"type":["integer","null"]},"approval_above_limit":{"type":"boolean"},"approval_max_amount":{"type":["integer","null"]},"allowed_recipient_phones":{"type":"array","items":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"}},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","object","livemode","name","status","provider","max_payout_amount","max_daily_amount","approval_above_limit","approval_max_amount","allowed_recipient_phones","created_at","updated_at"]},"AgentWalletBalance":{"type":"object","properties":{"object":{"type":"string","enum":["agent_wallet_balance"]},"wallet_id":{"type":"string"},"livemode":{"type":"boolean"},"currency":{"type":"string","enum":["XOF"]},"available":{"type":"integer"},"pending_payouts":{"type":"integer"}},"required":["object","wallet_id","livemode","currency","available","pending_payouts"]},"CreateAgentPayout":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"currency":{"type":"string","enum":["XOF"],"default":"XOF"},"recipient":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"name":{"type":"string","maxLength":100}},"required":["phone"]},"action_id":{"type":"string","minLength":1,"maxLength":100,"description":"Stable business action ID, unique within this agent wallet. Reuse it when retrying the same payout."}},"required":["amount","recipient","action_id"]},"AgentWalletPayoutList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"CreateAgentWallet":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"provider":{"type":"string","enum":["wave","orange_money"]},"max_payout_amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Maximum XOF for one payout from this wallet"},"max_daily_amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Optional maximum XOF in new payouts per Dakar calendar day"},"approval_above_limit":{"type":"boolean"},"approval_max_amount":{"type":["integer","null"],"minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"allowed_recipient_phones":{"type":"array","items":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"minItems":1,"maxItems":20}},"required":["name","provider","max_payout_amount","allowed_recipient_phones"]},"AgentWalletList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWallet"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"AgentWalletTransferList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWalletTransfer"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"AgentWalletTransfer":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["agent_wallet_transfer"]},"wallet_id":{"type":"string"},"livemode":{"type":"boolean"},"direction":{"type":"string","enum":["fund","reclaim"]},"amount":{"type":"integer"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"currency":{"type":"string","enum":["XOF"]},"failure_reason":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","object","wallet_id","livemode","direction","amount","status","currency","failure_reason","created_at","updated_at"]},"AgentWalletTransferInput":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"}},"required":["amount"]},"AgentWalletKeyMetadataList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWalletKeyMetadata"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"AgentWalletKeyMetadata":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["agent_wallet_key"]},"wallet_id":{"type":"string"},"display_prefix":{"type":"string"},"created_at":{"type":"string"},"revoked_at":{"type":["string","null"]},"last_used_at":{"type":["string","null"]}},"required":["id","object","wallet_id","display_prefix","created_at","revoked_at","last_used_at"]},"AgentWalletKey":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["agent_wallet_key"]},"wallet_id":{"type":"string"},"display_prefix":{"type":"string"},"secret_key":{"type":"string","description":"Shown only once. Store it securely; it cannot be retrieved later."},"created_at":{"type":"string"}},"required":["id","object","wallet_id","display_prefix","secret_key","created_at"]},"PaymentRefundList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Refund"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"Refund":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["refund"]},"payment_id":{"type":"string"},"amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"status":{"type":"string","enum":["pending","succeeded","needs_review"]},"fee_refunded":{"type":"integer"},"created_at":{"type":"string"}},"required":["id","object","payment_id","amount","currency","status","fee_refunded","created_at"]},"Payment":{"type":"object","properties":{"id":{"type":"string","example":"pay_3k9x0c1v2b3n4m5l6k7j"},"object":{"type":"string","enum":["payment"]},"livemode":{"type":"boolean"},"amount":{"type":"integer"},"currency":{"type":"string"},"fee":{"type":"integer"},"net":{"type":"integer"},"status":{"type":"string","enum":["requires_payment_method","processing","succeeded","failed","expired","refunded"]},"provider":{"type":["string","null"],"enum":["wave","orange_money","mock",null]},"client_reference":{"type":["string","null"]},"description":{"type":["string","null"]},"customer":{"type":"object","properties":{"phone":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["phone","name"]},"checkout_url":{"type":"string","description":"Hosted checkout page — redirect your customer here"},"next_action":{"$ref":"#/components/schemas/NextAction"},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"failure_reason":{"type":["string","null"]},"provider_transaction_id":{"type":["string","null"]},"expires_at":{"type":"string"},"succeeded_at":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","object","livemode","amount","currency","fee","net","status","provider","client_reference","description","customer","checkout_url","next_action","metadata","failure_reason","provider_transaction_id","expires_at","succeeded_at","created_at"]},"CreatePayment":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"currency":{"type":"string","enum":["XOF"],"default":"XOF"},"provider":{"type":"string","enum":["wave","orange_money"],"description":"Skip the hosted method picker and start this provider immediately"},"description":{"type":"string","maxLength":200},"client_reference":{"type":"string","maxLength":100,"description":"Your order id"},"customer":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"name":{"type":"string","maxLength":100}}},"success_url":{"type":"string","format":"uri"},"cancel_url":{"type":"string","format":"uri"},"metadata":{"type":"object","additionalProperties":{"type":"string","maxLength":500}}},"required":["amount"]},"PaymentList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"CreatePayout":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"currency":{"type":"string","enum":["XOF"],"default":"XOF"},"provider":{"type":"string","enum":["wave","orange_money"]},"recipient":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"name":{"type":"string","maxLength":100}},"required":["phone"]},"client_reference":{"type":"string","maxLength":100}},"required":["amount","provider","recipient"]},"PayoutList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"Balance":{"type":"object","properties":{"object":{"type":"string","enum":["balance"]},"livemode":{"type":"boolean"},"currency":{"type":"string"},"available":{"type":"integer"},"pending_payouts":{"type":"integer"},"payout_fee_fixed":{"type":"integer","minimum":0,"description":"Fixed fee in XOF added to a newly created payout amount; automatic settlements deduct it from the available balance first"}},"required":["object","livemode","currency","available","pending_payouts","payout_fee_fixed"]},"ApiAccount":{"allOf":[{"$ref":"#/components/schemas/Account"},{"type":"object","properties":{"scopes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["payments:read","payments:write","refunds:write","subscriptions:read","subscriptions:write","payouts:read","payouts:write","balance:read","webhooks:read","webhooks:write","agent_wallets:read","agent_wallets:write"]},{"type":"string","enum":["*"]}]}}},"required":["scopes"]}]},"Account":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["merchant"]},"name":{"type":"string"},"email":{"type":"string"},"status":{"type":"string","enum":["pending_review","active","suspended","closed"]},"fee_bps":{"type":"integer"},"fee_fixed":{"type":"integer"},"webhook_url":{"type":["string","null"]},"wave_aggregated_merchant_id":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","object","name","email","status","fee_bps","fee_fixed","webhook_url","wave_aggregated_merchant_id","created_at"]},"WebhookDeliveryList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["webhook_delivery"]},"endpoint_id":{"type":["string","null"]},"event_type":{"type":"string"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"attempts":{"type":"integer"},"last_status_code":{"type":["integer","null"]},"last_error":{"type":["string","null"]},"delivered_at":{"type":["string","null"]},"created_at":{"type":"string"},"payload":{"type":"object","additionalProperties":{}}},"required":["id","object","endpoint_id","event_type","status","attempts","last_status_code","last_error","delivered_at","created_at","payload"]},"Subscription":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","enum":["subscription"]},"livemode":{"type":"boolean"},"status":{"type":"string","enum":["active","past_due","canceled","completed"]},"customer":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"name":{"type":"string"},"email":{"type":["string","null"]}},"required":["phone","name","email"]},"amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"interval":{"type":"string","enum":["day","week","month","year"]},"interval_count":{"type":"integer"},"billing_cycles":{"type":["integer","null"]},"cycles_paid":{"type":"integer"},"current_period_start":{"type":"string"},"current_period_end":{"type":"string"},"next_invoice_at":{"type":["string","null"]},"cancel_at_period_end":{"type":"boolean"},"canceled_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"days_until_due":{"type":"integer"},"cancel_after_days":{"type":"integer"},"description":{"type":["string","null"]},"client_reference":{"type":["string","null"]},"metadata":{"type":"object","additionalProperties":{"type":"string"}},"latest_invoice":{"$ref":"#/components/schemas/Invoice"},"created_at":{"type":"string"}},"required":["id","object","livemode","status","customer","amount","currency","interval","interval_count","billing_cycles","cycles_paid","current_period_start","current_period_end","next_invoice_at","cancel_at_period_end","canceled_at","completed_at","days_until_due","cancel_after_days","description","client_reference","metadata","latest_invoice","created_at"]},"Invoice":{"type":["object","null"],"properties":{"id":{"type":"string"},"object":{"type":"string","enum":["invoice"]},"livemode":{"type":"boolean"},"subscription":{"type":"string"},"period_index":{"type":"integer"},"period_start":{"type":"string"},"period_end":{"type":"string"},"amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"status":{"type":"string","enum":["open","paid","void","uncollectible"]},"payment":{"type":["string","null"],"description":"Current payment attempt; a confirmed failed attempt may be replaced"},"hosted_invoice_url":{"type":"string","format":"uri","description":"Stable customer link, payable until grace_ends_at"},"due_at":{"type":"string","description":"Invoice becomes overdue after this time but remains payable during grace"},"grace_ends_at":{"type":"string"},"paid_at":{"type":["string","null"]},"reminders_sent":{"type":"integer"},"created_at":{"type":"string"}},"required":["id","object","livemode","subscription","period_index","period_start","period_end","amount","currency","status","payment","hosted_invoice_url","due_at","grace_ends_at","paid_at","reminders_sent","created_at"]},"CreateSubscription":{"type":"object","properties":{"customer":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"name":{"type":"string","minLength":1,"maxLength":100},"email":{"type":["string","null"],"format":"email"}},"required":["phone","name"]},"amount":{"type":"integer","minimum":100,"maximum":100000000,"example":15000,"description":"Integer XOF"},"currency":{"type":"string","enum":["XOF"],"default":"XOF"},"interval":{"type":"string","enum":["day","week","month","year"]},"interval_count":{"type":"integer","minimum":1,"maximum":12,"default":1},"billing_cycles":{"type":["integer","null"],"minimum":2,"maximum":24,"default":null},"days_until_due":{"type":"integer","minimum":1,"maximum":30,"default":3},"cancel_after_days":{"type":"integer","minimum":1,"maximum":60,"default":14},"description":{"type":"string","maxLength":200},"client_reference":{"type":"string","maxLength":100},"metadata":{"type":"object","additionalProperties":{"type":"string","maxLength":500},"default":{}}},"required":["customer","amount","interval"]},"SubscriptionList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscription"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"CanceledSubscription":{"allOf":[{"$ref":"#/components/schemas/Subscription"},{"type":"object","properties":{"pending_payment":{"type":["object","null"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["requires_payment_method","processing","succeeded","failed","expired","refunded"]}},"required":["id","status"],"description":"A provider payment already in flight may still settle after cancellation"}},"required":["pending_payment"]}]},"CancelSubscription":{"type":"object","properties":{"at_period_end":{"type":"boolean","default":false}}},"InvoiceList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"NotificationPreferences":{"type":"object","properties":{"object":{"type":"string","enum":["notification_preferences"]},"id":{"type":"string"},"preferences":{"type":"object","properties":{"kyc":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"required":["email","whatsapp"],"additionalProperties":false},"payments":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"required":["email","whatsapp"],"additionalProperties":false},"payouts":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"required":["email","whatsapp"],"additionalProperties":false},"security":{"type":"object","properties":{"email":{"type":"boolean","enum":[true]},"whatsapp":{"type":"boolean","enum":[true]}},"required":["email","whatsapp"],"additionalProperties":false}},"required":["kyc","payments","payouts","security"],"additionalProperties":false}},"required":["object","id","preferences"]},"DashboardMerchantList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","properties":{"merchant_id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]}},"required":["merchant_id","name","status","role"]}},"has_more":{"type":"boolean"},"test_mode_enabled":{"type":"boolean","description":"Whether this API deployment accepts dashboard test-mode requests. This is a host capability, not a merchant permission."}},"required":["object","data","has_more","test_mode_enabled"]},"DashboardWhatsAppLinkList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_link"]},"id":{"type":"string"},"status":{"type":"string","enum":["pending_approval","active","suspended","revoked"]},"wa_id":{"type":"string"},"merchant_id":{"type":"string"},"business_name":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]},"livemode":{"type":"boolean"},"activated_at":{"type":["string","null"]},"notifications":{"type":"object","properties":{"payment_succeeded":{"type":"boolean"}},"required":["payment_succeeded"]}},"required":["object","id","status","wa_id","merchant_id","business_name","role","livemode","activated_at","notifications"]}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardWebhookEndpointList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_endpoint"]},"id":{"type":"string"},"merchant_id":{"type":"string"},"mode":{"type":["string","null"],"enum":["test","live",null]},"is_default":{"type":"boolean"},"managed_by":{"type":["string","null"],"enum":["whatsapp",null]},"url":{"type":["string","null"]},"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]}},"payload_policy":{"type":"string","enum":["full","minimal"]},"active":{"type":"boolean"},"created_at":{"type":"string"}},"required":["object","id","merchant_id","mode","is_default","managed_by","url","event_types","payload_policy","active","created_at"]}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardApiKeyList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/DashboardApiKey"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardApiKey":{"type":"object","properties":{"object":{"type":"string","enum":["api_key"]},"id":{"type":"string"},"mode":{"type":"string","enum":["test","live"]},"scopes":{"type":["array","null"],"items":{"type":"string","enum":["payments:read","payments:write","refunds:write","subscriptions:read","subscriptions:write","payouts:read","payouts:write","balance:read","webhooks:read","webhooks:write","agent_wallets:read","agent_wallets:write"]}},"display_prefix":{"type":"string"},"last_used_at":{"type":["string","null"]},"revoked_at":{"type":["string","null"]},"scheduled_revoke_at":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["object","id","mode","scopes","display_prefix","last_used_at","revoked_at","scheduled_revoke_at","created_at"]},"IssuedDashboardApiKey":{"allOf":[{"$ref":"#/components/schemas/DashboardApiKey"},{"type":"object","properties":{"secret_key":{"type":"string","description":"Shown only in this issuance response; never stored or retrievable"}},"required":["secret_key"]}]},"CreateRestrictedApiKey":{"type":"object","properties":{"scopes":{"type":"array","items":{"type":"string","enum":["payments:read","payments:write","refunds:write","subscriptions:read","subscriptions:write","payouts:read","payouts:write","balance:read","webhooks:read","webhooks:write","agent_wallets:read","agent_wallets:write"]},"minItems":1,"maxItems":12}},"required":["scopes"]},"RolledDashboardApiKey":{"allOf":[{"$ref":"#/components/schemas/IssuedDashboardApiKey"},{"type":"object","properties":{"previous_key":{"$ref":"#/components/schemas/DashboardApiKey"}},"required":["previous_key"]}]},"RollDashboardApiKey":{"type":"object","properties":{"grace_hours":{"type":"integer","minimum":1,"maximum":72,"default":24,"description":"Old key remains valid for this many hours after a successful roll"}}},"MerchantOnboarding":{"type":"object","properties":{"object":{"type":"string","enum":["merchant_onboarding"]},"merchant_id":{"type":"string"},"status":{"type":"string","enum":["draft","submitted","approved","rejected"]},"business_name":{"type":["string","null"]},"ninea":{"type":["string","null"]},"rccm":{"type":["string","null"]},"settlement_wallet":{"type":["object","null"],"properties":{"provider":{"type":"string","enum":["wave","orange_money"]},"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"}},"required":["provider","phone"]},"owner_document":{"$ref":"#/components/schemas/KycDocument"},"submitted_at":{"type":["string","null"]},"reviewed_at":{"type":["string","null"]},"review_reason":{"type":["string","null"]},"terms_version":{"type":["string","null"]},"terms_accepted_at":{"type":["string","null"]}},"required":["object","merchant_id","status","business_name","ninea","rccm","settlement_wallet","owner_document","submitted_at","reviewed_at","review_reason","terms_version","terms_accepted_at"]},"KycDocument":{"type":["object","null"],"properties":{"object":{"type":"string","enum":["kyc_document"]},"id":{"type":"string"},"content_type":{"type":"string","enum":["application/pdf","image/jpeg","image/png"]},"size_bytes":{"type":"integer"},"status":{"type":"string","enum":["uploading","ready"]},"created_at":{"type":"string"}},"required":["object","id","content_type","size_bytes","status","created_at"]},"UpdateMerchantOnboarding":{"type":"object","properties":{"business_name":{"type":["string","null"],"minLength":2,"maxLength":160},"ninea":{"type":["string","null"],"minLength":3,"maxLength":32},"rccm":{"type":["string","null"],"minLength":3,"maxLength":64},"settlement_wallet":{"type":["object","null"],"properties":{"provider":{"type":"string","enum":["wave","orange_money"]},"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"}},"required":["provider","phone"]}}},"SettlementSettings":{"type":"object","properties":{"object":{"type":"string","enum":["settlement_settings"]},"merchant_id":{"type":"string"},"livemode":{"type":"boolean"},"enabled":{"type":"boolean"},"min_amount":{"type":"integer"},"schedule":{"type":"string","enum":["18:00 Africa/Dakar"]},"last_run":{"type":["object","null"],"properties":{"id":{"type":"string"},"local_day":{"type":"string"},"status":{"type":"string","enum":["pending","queued","skipped","failed"]},"amount":{"type":["integer","null"]},"payout":{"type":["string","null"]},"payout_status":{"type":["string","null"],"enum":["pending","processing","succeeded","failed",null]},"reason":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","local_day","status","amount","payout","payout_status","reason","created_at"]}},"required":["object","merchant_id","livemode","enabled","min_amount","schedule","last_run"]},"UpdateSettlementSettings":{"type":"object","properties":{"enabled":{"type":"boolean"},"min_amount":{"type":"integer","minimum":1,"maximum":100000000,"description":"Minimum net XOF payout after the configured payout fee"}}},"DashboardPaymentList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardPaymentRefundList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Refund"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardSubscriptionList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscription"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardInvoiceList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardPayoutList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardWebhookDeliveryList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardMemberList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"type":"object","properties":{"user_id":{"type":"string"},"merchant_id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]}},"required":["user_id","merchant_id","email","role"]}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardAgentWalletList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWallet"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardAgentWalletTransferList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWalletTransfer"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardAgentWalletPayoutList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Payout"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"UpdateAgentWalletPolicy":{"type":"object","properties":{"max_payout_amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"max_daily_amount":{"type":["integer","null"],"minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"approval_above_limit":{"type":"boolean"},"approval_max_amount":{"type":["integer","null"],"minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"allowed_recipient_phones":{"type":"array","items":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"minItems":1,"maxItems":20}},"required":["max_payout_amount","max_daily_amount","allowed_recipient_phones"]},"DashboardAgentWalletKeyList":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentWalletKeyMetadata"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"DashboardAgentApprovals":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentPayoutApproval"}},"has_more":{"type":"boolean"}},"required":["object","data","has_more"]},"AgentApprovalDecision":{"allOf":[{"$ref":"#/components/schemas/AgentPayoutApproval"},{"type":"object","properties":{"purpose":{"type":"string","enum":["agent_approval"]},"pin_url":{"type":["string","null"]},"pin_expires_at":{"type":"string"}},"required":["purpose","pin_url","pin_expires_at"]}]}},"parameters":{}},"paths":{"/v1/public/payments/{id}":{"get":{"tags":["Hosted checkout"],"summary":"Customer-safe view of a payment (poll this every 2–3 s while processing)","security":[{"checkoutSecret":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Payment client secret"},"required":true,"description":"Payment client secret","name":"cs","in":"query"}],"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPayment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Merchant suspended, live simulation, or test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"retrieveHostedPayment"}},"/v1/public/payments/{id}/pay":{"post":{"tags":["Hosted checkout"],"summary":"Customer chose a payment method","security":[{"checkoutSecret":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Payment client secret"},"required":true,"description":"Payment client secret","name":"cs","in":"query"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["wave","orange_money"]},"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"receipt_opt_in":{"type":"boolean","description":"Payer checked receipt opt-in for this Wave-restricted phone; wording checkout-receipt-v1"}},"required":["provider"]}}}},"responses":{"200":{"description":"Payment with next_action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPayment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Merchant suspended, live simulation, or test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"chooseHostedPaymentProvider"}},"/v1/public/payments/{id}/simulate":{"post":{"tags":["Hosted checkout"],"summary":"Test mode only — the mock wallet screen calls this","security":[{"checkoutSecret":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Payment client secret"},"required":true,"description":"Payment client secret","name":"cs","in":"query"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"outcome":{"type":"string","enum":["succeeded","failed"]}},"required":["outcome"]}}}},"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPayment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Merchant suspended, live simulation, or test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"simulateHostedPayment"}},"/v1/public/agent-approvals/{token}":{"get":{"security":[],"tags":["Agent approval PIN"],"summary":"Show the exact agent payout to the owner","parameters":[{"schema":{"type":"string","maxLength":120,"description":"Five-minute purpose-bound capability; keep out of logs and analytics"},"required":true,"description":"Five-minute purpose-bound capability; keep out of logs and analytics","name":"token","in":"path"}],"responses":{"200":{"description":"Approval proposal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentApprovalPin"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Incorrect PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Approval unavailable or PIN locked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Unknown or expired link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Approval or policy changed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Retryable reservation failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"getV1PublicAgentApprovalsByToken"}},"/v1/public/agent-approvals/{token}/confirm":{"post":{"security":[],"tags":["Agent approval PIN"],"summary":"Confirm one agent payout with the owner's PIN","parameters":[{"schema":{"type":"string","maxLength":120,"description":"Five-minute purpose-bound capability; keep out of logs and analytics"},"required":true,"description":"Five-minute purpose-bound capability; keep out of logs and analytics","name":"token","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string","pattern":"^\\d{6}$"}},"required":["pin"]}}}},"responses":{"200":{"description":"Admitted or replayed payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Incorrect PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Approval unavailable or PIN locked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Unknown or expired link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Approval or policy changed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Retryable reservation failure","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"postV1PublicAgentApprovalsByTokenConfirm"}},"/v1/public/whatsapp/payout-intents/{token}":{"get":{"tags":["WhatsApp payout PIN"],"summary":"Show one-time WhatsApp payout proposal on the Xaalis PIN page","security":[],"parameters":[{"schema":{"type":"string","description":"Five-minute single-use PIN link token; keep it out of logs and analytics"},"required":true,"description":"Five-minute single-use PIN link token; keep it out of logs and analytics","name":"token","in":"path"}],"responses":{"200":{"description":"Payout proposal","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_intent"]},"id":{"type":"string"},"amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"business_name":{"type":"string"},"recipient":{"type":["object","null"],"properties":{"provider":{"type":"string","enum":["wave","orange_money"]},"phone":{"type":"string"}},"required":["provider","phone"]},"status":{"type":"string","enum":["pending","admitted"]},"expires_at":{"type":"string"}},"required":["object","id","amount","currency","business_name","recipient","status","expires_at"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Incorrect PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Payout disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Unknown or expired link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Daily cap exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"503":{"description":"Reservation unavailable; retry this link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"getV1PublicWhatsappPayoutIntentsByToken"}},"/v1/public/whatsapp/payout-intents/{token}/confirm":{"post":{"tags":["WhatsApp payout PIN"],"summary":"Confirm a WhatsApp payout with the owner PIN","security":[],"parameters":[{"schema":{"type":"string","description":"Five-minute single-use PIN link token; keep it out of logs and analytics"},"required":true,"description":"Five-minute single-use PIN link token; keep it out of logs and analytics","name":"token","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string","pattern":"^\\d{6}$"}},"required":["pin"]}}}},"responses":{"200":{"description":"Admitted or replayed payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Incorrect PIN","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Payout disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Unknown or expired link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Daily cap exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"503":{"description":"Reservation unavailable; retry this link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"postV1PublicWhatsappPayoutIntentsByTokenConfirm"}},"/v1/public/invoices/{id}":{"get":{"tags":["Hosted checkout"],"summary":"Open a stable invoice link","security":[{"checkoutSecret":[]}],"description":"Redirects to the current payment attempt. A confirmed failed attempt may be replaced while the invoice remains payable.","parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"description":"Invoice link secret"},"required":true,"description":"Invoice link secret","name":"cs","in":"query"}],"responses":{"302":{"description":"Redirect to the current hosted checkout payment","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invoice is no longer payable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"openInvoiceLink"}},"/v1/public/exchanges/quotes":{"post":{"tags":["Wallet exchange"],"summary":"Test mode: quote a same-phone Orange Money to Wave exchange or reverse","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","enum":["wave","orange_money"]},"to":{"type":"string","enum":["wave","orange_money"]},"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"},"send_amount":{"type":"number"},"receive_amount":{"type":"number"}},"required":["from","phone"]}}}},"responses":{"201":{"description":"Five-minute quote","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["exchange_quote"]},"id":{"type":"string"},"from":{"type":"string","enum":["wave","orange_money"]},"to":{"type":"string","enum":["wave","orange_money"]},"send_amount":{"type":"integer"},"fee":{"type":"integer"},"receive_amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"expires_at":{"type":"string"}},"required":["object","id","from","to","send_amount","fee","receive_amount","currency","expires_at"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid or reused quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"quoteWalletExchange"}},"/v1/public/exchanges/otp":{"post":{"tags":["Wallet exchange"],"summary":"Test mode: issue a fixed-code OTP challenge without sending SMS","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string","pattern":"^\\+2217[0-9]{8}$","example":"+221771234567"}},"required":["phone"]}}}},"responses":{"200":{"description":"Test OTP","content":{"application/json":{"schema":{"type":"object","properties":{"sent":{"type":"boolean"},"test_code":{"type":"string"},"expires_at":{"type":"string"}},"required":["sent","test_code","expires_at"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid or reused quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"requestWalletExchangeOtp"}},"/v1/public/exchanges":{"post":{"tags":["Wallet exchange"],"summary":"Test mode: create an exchange with one Idempotency-Key","security":[],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255},"required":true,"name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quote":{"type":"string"},"otp":{"type":"string","minLength":6,"maxLength":6}},"required":["quote","otp"]}}}},"responses":{"201":{"description":"Exchange and checkout link","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["exchange"]},"id":{"type":"string"},"status":{"type":"string","enum":["awaiting_payment","paid","payout_processing","completed","expired","refunding","refunded","needs_review"]},"from":{"type":"string","enum":["wave","orange_money"]},"to":{"type":"string","enum":["wave","orange_money"]},"send_amount":{"type":"integer"},"fee":{"type":"integer"},"receive_amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"livemode":{"type":"boolean","enum":[false]},"created_at":{"type":"string"},"checkout_url":{"type":"string"},"cs":{"type":"string"}},"required":["object","id","status","from","to","send_amount","fee","receive_amount","currency","livemode","created_at","checkout_url","cs"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid or reused quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"createWalletExchange"}},"/v1/public/exchanges/{id}":{"get":{"tags":["Wallet exchange"],"summary":"Read the customer-safe exchange status","security":[{"checkoutSecret":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"cs","in":"query"}],"responses":{"200":{"description":"Exchange","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["exchange"]},"id":{"type":"string"},"status":{"type":"string","enum":["awaiting_payment","paid","payout_processing","completed","expired","refunding","refunded","needs_review"]},"from":{"type":"string","enum":["wave","orange_money"]},"to":{"type":"string","enum":["wave","orange_money"]},"send_amount":{"type":"integer"},"fee":{"type":"integer"},"receive_amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"livemode":{"type":"boolean","enum":[false]},"created_at":{"type":"string"}},"required":["object","id","status","from","to","send_amount","fee","receive_amount","currency","livemode","created_at"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid or reused quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"retrieveWalletExchange"}},"/v1/public/exchanges/{id}/simulate":{"post":{"tags":["Wallet exchange"],"summary":"Test mode: confirm or decline the pay-in and process the exchange","security":[{"checkoutSecret":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"cs","in":"query"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"outcome":{"type":"string","enum":["succeeded","failed"]}},"required":["outcome"]}}}},"responses":{"200":{"description":"Exchange","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["exchange"]},"id":{"type":"string"},"status":{"type":"string","enum":["awaiting_payment","paid","payout_processing","completed","expired","refunding","refunded","needs_review"]},"from":{"type":"string","enum":["wave","orange_money"]},"to":{"type":"string","enum":["wave","orange_money"]},"send_amount":{"type":"integer"},"fee":{"type":"integer"},"receive_amount":{"type":"integer"},"currency":{"type":"string","enum":["XOF"]},"livemode":{"type":"boolean","enum":[false]},"created_at":{"type":"string"}},"required":["object","id","status","from","to","send_amount","fee","receive_amount","currency","livemode","created_at"]}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Test mode disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Invalid or reused quote","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"simulateWalletExchange"}},"/v1/sandbox/signups":{"post":{"tags":["Sandbox"],"summary":"Create a test-only merchant account and receive secrets once","security":[],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSignupInput"}}}},"responses":{"201":{"description":"Sandbox credentials, shown once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSignup"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid signup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Test keys disabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or secret unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Permanent sandbox account limit for this email","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Signup rate limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Rate limiter unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"postV1SandboxSignups"}},"/v1/live/signups":{"post":{"tags":["Live registration"],"security":[],"summary":"Register a pending live merchant without issuing keys or moving funds","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveSignupInput"}}}},"responses":{"201":{"description":"Pending registration and sign-in email accepted by the mail transport","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveSignup"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Invalid registration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Changed idempotency request or an existing email registration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Signup quota; retry after the indicated delay","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Sign-in unavailable or delivery unconfirmed; retry the same idempotency key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"postV1LiveSignups"}},"/v1/agent/payouts":{"get":{"tags":["Agent API"],"summary":"List payouts created by this wallet","security":[{"agentBearerAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":100},"required":false,"name":"client_reference","in":"query"}],"responses":{"200":{"description":"Agent payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPayoutList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentPayouts"},"post":{"tags":["Agent API"],"summary":"Request a wallet payout or owner approval","description":"Returns 201 for an admitted payout, or 202 for an approval proposal when the test-only policy enables owner approval above soft limits. Pending, declined and expired approvals reserve nothing. Retrying an owner-admitted action returns its payout, including a failed reservation; inspect the payout status. Ordinary payout admission still returns 422 for insufficient funds. The provider comes from the wallet policy. The recipient must be on the wallet's allowlist. Reuse action_id for retries of the same business payout, even when the Idempotency-Key changes.","security":[{"agentBearerAuth":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentPayout"}}}},"responses":{"201":{"description":"Agent payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"202":{"description":"Waiting for owner approval or terminal approval result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPayoutApproval"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentPayouts"}},"/v1/agent/wallet":{"get":{"tags":["Agent API"],"summary":"Read the wallet policy bound to this agent key","security":[{"agentBearerAuth":[]}],"responses":{"200":{"description":"Agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWallet"}},"/v1/agent/balance":{"get":{"tags":["Agent API"],"summary":"Read this agent wallet's ledger balance","security":[{"agentBearerAuth":[]}],"responses":{"200":{"description":"Agent wallet balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletBalance"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentBalance"}},"/v1/agent/payouts/{id}":{"get":{"tags":["Agent API"],"summary":"Retrieve a payout created by this wallet","security":[{"agentBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentPayoutsById"}},"/v1/agent/approvals/{id}":{"get":{"tags":["Agent API"],"summary":"Read this wallet's owner approval","security":[{"agentBearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent payout approval","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPayoutApproval"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or policy violation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentApprovalsById"}},"/v1/agent-wallets/{id}/payouts":{"get":{"tags":["Agent wallets"],"summary":"List payouts attributed to an agent wallet","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":100},"required":false,"name":"client_reference","in":"query"}],"responses":{"200":{"description":"Wallet payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletPayoutList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWalletsByIdPayouts"}},"/v1/agent-wallets":{"post":{"tags":["Agent wallets"],"summary":"Create a test agent wallet with bounded payout permissions","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentWallet"}}}},"responses":{"201":{"description":"Agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentWallets"},"get":{"tags":["Agent wallets"],"summary":"List your agent wallets","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Agent wallets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWallets"}},"/v1/agent-wallets/{id}":{"get":{"tags":["Agent wallets"],"summary":"Retrieve an agent wallet","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWalletsById"}},"/v1/agent-wallets/{id}/balance":{"get":{"tags":["Agent wallets"],"summary":"Retrieve an agent wallet's ledger balance","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent wallet balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletBalance"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWalletsByIdBalance"}},"/v1/agent-wallets/{id}/transfers":{"get":{"tags":["Agent wallets"],"summary":"List funding and reclaim transfers for an agent wallet","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Wallet transfers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransferList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWalletsByIdTransfers"}},"/v1/agent-wallets/{id}/fund":{"post":{"tags":["Agent wallets"],"summary":"Move merchant balance into a test agent wallet","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransferInput"}}}},"responses":{"201":{"description":"Wallet funding transfer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransfer"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentWalletsByIdFund"}},"/v1/agent-wallets/{id}/reclaim":{"post":{"tags":["Agent wallets"],"summary":"Return available test agent funds to the merchant","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransferInput"}}}},"responses":{"201":{"description":"Wallet reclaim transfer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransfer"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentWalletsByIdReclaim"}},"/v1/agent-wallets/{id}/disable":{"post":{"tags":["Agent wallets"],"summary":"Disable new payouts from an agent wallet","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Disabled agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentWalletsByIdDisable"}},"/v1/agent-wallets/{id}/keys":{"get":{"tags":["Agent wallets"],"summary":"List agent key metadata without secret values","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Wallet keys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletKeyMetadataList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1AgentWalletsByIdKeys"},"post":{"tags":["Agent wallets"],"summary":"Issue a test agent key; the secret is shown once","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"201":{"description":"New agent key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletKey"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Key secret unavailable or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1AgentWalletsByIdKeys"}},"/v1/agent-wallets/{id}/keys/{keyId}":{"delete":{"tags":["Agent wallets"],"summary":"Revoke an agent key","security":[{"bearerAuth":[]},{"oauth2":["agent_wallets:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"keyId","in":"path"}],"responses":{"204":{"description":"Key revoked","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"deleteV1AgentWalletsByIdKeysByKeyId"}},"/v1/payments/{id}/refunds":{"get":{"tags":["Payments"],"summary":"Read the full refund for a payment, if one exists","security":[{"bearerAuth":[]},{"oauth2":["payments:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Zero or one refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRefundList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"listPaymentRefunds"},"post":{"tags":["Payments"],"summary":"Refund a succeeded Wave payment in full","description":"Idempotency keys are shared by merchant and mode across API and dashboard refunds. Reusing a key for another payment returns 409 idempotency_conflict. Replays resume the single full refund for the payment; a new key also binds to that refund.","security":[{"bearerAuth":[]},{"oauth2":["refunds:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"201":{"description":"Full refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refund"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency key conflict or payment cannot be refunded in its current state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds or unsupported provider","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Provider or ledger outcome requires retry/review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"createPaymentRefund"}},"/v1/payments":{"post":{"tags":["Payments"],"summary":"Create a payment","description":"Returns a hosted `checkout_url`. If `provider` is set, `next_action` is ready immediately. Live Wave payments require an aggregated merchant identity when aggregator mode is enabled.","security":[{"bearerAuth":[]},{"oauth2":["payments:write"]}],"parameters":[{"schema":{"type":"string","maxLength":255,"description":"Retry-safe key; reuse it when retrying the same request"},"required":false,"description":"Retry-safe key; reuse it when retrying the same request","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayment"}}}},"responses":{"201":{"description":"Payment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Merchant needs a Wave aggregated identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"createPayment"},"get":{"tags":["Payments"],"summary":"List payments (newest first)","security":[{"bearerAuth":[]},{"oauth2":["payments:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","enum":["requires_payment_method","processing","succeeded","failed","expired","refunded"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"[A-Za-z0-9]","example":"T_M6MTZ6GXKQ4YDFTP","description":"Exact match after keeping only ASCII letters/digits and ignoring case. Separators are ignored. Merchant/mode scoping, status filtering and pagination still apply; a reference can match several payments and does not prove successful payment."},"required":false,"description":"Exact match after keeping only ASCII letters/digits and ignoring case. Separators are ignored. Merchant/mode scoping, status filtering and pagination still apply; a reference can match several payments and does not prove successful payment.","name":"provider_transaction_id","in":"query"}],"responses":{"200":{"description":"Payments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"listPayments"}},"/v1/payments/{id}":{"get":{"tags":["Payments"],"summary":"Retrieve a payment","security":[{"bearerAuth":[]},{"oauth2":["payments:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"retrievePayment"}},"/v1/payments/{id}/simulate":{"post":{"tags":["Test mode"],"summary":"Simulate the customer's wallet result (test keys only)","security":[{"bearerAuth":[]},{"oauth2":["payments:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"outcome":{"type":"string","enum":["succeeded","failed"]}},"required":["outcome"]}}}},"responses":{"200":{"description":"Updated payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1PaymentsByIdSimulate"}},"/v1/payouts":{"post":{"tags":["Payouts"],"summary":"Send money from your balance to a mobile wallet","security":[{"bearerAuth":[]},{"oauth2":["payouts:write"]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayout"}}}},"responses":{"201":{"description":"Payout created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Merchant needs a Wave aggregated identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"422":{"description":"Insufficient funds / unsupported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}},"503":{"description":"Ledger reservation temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}}},"operationId":"createPayout"},"get":{"tags":["Payouts"],"summary":"List payouts","security":[{"bearerAuth":[]},{"oauth2":["payouts:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"listPayouts"}},"/v1/payouts/{id}":{"get":{"tags":["Payouts"],"summary":"Retrieve a payout","security":[{"bearerAuth":[]},{"oauth2":["payouts:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"retrievePayout"}},"/v1/balance":{"get":{"tags":["Balance"],"summary":"Current balance (from the ledger)","security":[{"bearerAuth":[]},{"oauth2":["balance:read"]}],"responses":{"200":{"description":"Balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"retrieveBalance"}},"/v1/account":{"get":{"tags":["Account"],"summary":"Your merchant account","security":[{"bearerAuth":[]},{"oauth2":[]}],"responses":{"200":{"description":"Account and key scopes","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAccount"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1Account"},"patch":{"tags":["Account"],"summary":"Update webhook endpoint","security":[{"bearerAuth":[]},{"oauth2":["webhooks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"webhook_url":{"type":["string","null"]}},"required":["webhook_url"]}}}},"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Live key required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"patchV1Account"}},"/v1/webhook-deliveries":{"get":{"tags":["Account"],"summary":"Recent webhook deliveries to your endpoint","security":[{"bearerAuth":[]},{"oauth2":["webhooks:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Deliveries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1WebhookDeliveries"}},"/v1/subscriptions":{"post":{"tags":["Subscriptions"],"summary":"Create a subscription and its first invoice","description":"Every invoice requires a customer-approved payment. The latest invoice includes a stable link payable through its grace period.","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:write"]}],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscription"}}}},"responses":{"201":{"description":"Subscription created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1Subscriptions"},"get":{"tags":["Subscriptions"],"summary":"List subscriptions","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","enum":["active","past_due","canceled","completed"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Subscriptions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1Subscriptions"}},"/v1/subscriptions/{id}":{"get":{"tags":["Subscriptions"],"summary":"Retrieve a subscription","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1SubscriptionsById"}},"/v1/subscriptions/{id}/cancel":{"post":{"tags":["Subscriptions"],"summary":"Stop future billing","description":"Immediate cancellation voids an invoice that has not started provider checkout. A payment already processing may still settle; pending_payment identifies it. Period-end cancellation lets the current invoice remain payable through grace.","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscription"}}}},"responses":{"200":{"description":"Subscription with pending payment, if any","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanceledSubscription"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1SubscriptionsByIdCancel"}},"/v1/subscriptions/{id}/test_advance":{"post":{"tags":["Test mode"],"summary":"Advance one subscription's billing clock (test keys only)","description":"Moves only this test subscription to its next billing event. The same Idempotency-Key cannot advance it twice.","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"200":{"description":"Advanced subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"postV1SubscriptionsByIdTestAdvance"}},"/v1/invoices":{"get":{"tags":["Invoices"],"summary":"List invoices","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:read"]}],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string"},"required":false,"name":"subscription","in":"query"},{"schema":{"type":"string","enum":["open","paid","void","uncollectible"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Invoices","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceList"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1Invoices"}},"/v1/invoices/{id}":{"get":{"tags":["Invoices"],"summary":"Retrieve an invoice","security":[{"bearerAuth":[]},{"oauth2":["subscriptions:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Invoice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"401":{"description":"Authentication error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}}}},"operationId":"getV1InvoicesById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/notification-preferences":{"get":{"tags":["Dashboard"],"summary":"Read merchant-wide notification preferences (owner only; shared across modes; security mandatory)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Notification preferences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferences"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeNotificationPreferences"},"patch":{"tags":["Dashboard"],"summary":"Update merchant-wide notification preferences (owner only; security mandatory)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kyc":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"additionalProperties":false},"payments":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"additionalProperties":false},"payouts":{"type":"object","properties":{"email":{"type":"boolean"},"whatsapp":{"type":"boolean"}},"additionalProperties":false},"security":{"type":"object","properties":{"email":{"type":"boolean","enum":[true]},"whatsapp":{"type":"boolean","enum":[true]}},"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Updated notification preferences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationPreferences"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeNotificationPreferences"}},"/dashboard/v1/merchants":{"get":{"tags":["Dashboard"],"summary":"List your merchant memberships","security":[{"dashboardSession":[]}],"responses":{"200":{"description":"Merchants","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardMerchantList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1Merchants"}},"/dashboard/v1/oauth/selection":{"get":{"tags":["Dashboard","OAuth"],"summary":"Current OAuth merchant and mode for this dashboard session","security":[{"dashboardSession":[]}],"responses":{"200":{"description":"OAuth selection","content":{"application/json":{"schema":{"type":"object","properties":{"merchant_id":{"type":["string","null"]},"mode":{"type":["string","null"],"enum":["test","live",null]},"merchant_name":{"type":["string","null"]}},"required":["merchant_id","mode","merchant_name"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1OauthSelection"}},"/dashboard/v1/merchants/{merchantId}/{mode}/account":{"get":{"tags":["Dashboard"],"summary":"Merchant account for the selected mode","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAccount"},"patch":{"tags":["Dashboard"],"summary":"Update webhook endpoint (owner, live mode)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"webhook_url":{"type":["string","null"]}},"required":["webhook_url"]}}}},"responses":{"200":{"description":"Account","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeAccount"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/link-codes":{"post":{"tags":["Dashboard","WhatsApp"],"summary":"Create a one-time code to link your WhatsApp number","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"wa_number":{"type":"string"}},"required":["wa_number"]}}}},"responses":{"201":{"description":"One-time linking code","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"expires_at":{"type":"string"},"wa_me_url":{"type":"string"}},"required":["code","expires_at","wa_me_url"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeWhatsappLinkCodes"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/links":{"get":{"tags":["Dashboard","WhatsApp"],"summary":"List WhatsApp links visible to this member","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"WhatsApp links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardWhatsAppLinkList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeWhatsappLinks"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/links/{id}/approve":{"post":{"tags":["Dashboard","WhatsApp"],"summary":"Approve your pending WhatsApp link","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Approved link","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_link"]},"id":{"type":"string"},"status":{"type":"string","enum":["pending_approval","active","suspended","revoked"]},"wa_id":{"type":"string"},"merchant_id":{"type":"string"},"business_name":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]},"livemode":{"type":"boolean"},"activated_at":{"type":["string","null"]},"notifications":{"type":"object","properties":{"payment_succeeded":{"type":"boolean"}},"required":["payment_succeeded"]}},"required":["object","id","status","wa_id","merchant_id","business_name","role","livemode","activated_at","notifications"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeWhatsappLinksByIdApprove"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/links/{id}":{"delete":{"tags":["Dashboard","WhatsApp"],"summary":"Disconnect a WhatsApp link","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Disconnected link","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_link"]},"id":{"type":"string"},"status":{"type":"string","enum":["pending_approval","active","suspended","revoked"]},"wa_id":{"type":"string"},"merchant_id":{"type":"string"},"business_name":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]},"livemode":{"type":"boolean"},"activated_at":{"type":["string","null"]},"notifications":{"type":"object","properties":{"payment_succeeded":{"type":"boolean"}},"required":["payment_succeeded"]}},"required":["object","id","status","wa_id","merchant_id","business_name","role","livemode","activated_at","notifications"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteDashboardV1MerchantsByMerchantIdByModeWhatsappLinksById"},"patch":{"tags":["Dashboard","WhatsApp"],"summary":"Update WhatsApp notification preferences","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notifications":{"type":"object","properties":{"payment_succeeded":{"type":"boolean"}},"required":["payment_succeeded"]}},"required":["notifications"]}}}},"responses":{"200":{"description":"Updated link","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_link"]},"id":{"type":"string"},"status":{"type":"string","enum":["pending_approval","active","suspended","revoked"]},"wa_id":{"type":"string"},"merchant_id":{"type":"string"},"business_name":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]},"livemode":{"type":"boolean"},"activated_at":{"type":["string","null"]},"notifications":{"type":"object","properties":{"payment_succeeded":{"type":"boolean"}},"required":["payment_succeeded"]}},"required":["object","id","status","wa_id","merchant_id","business_name","role","livemode","activated_at","notifications"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeWhatsappLinksById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/payout-settings":{"get":{"tags":["Dashboard","WhatsApp"],"summary":"Read your WhatsApp payout PIN and merchant cap status (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"PIN and cap status without secrets","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_settings"]},"pin_set":{"type":"boolean"},"pin_locked":{"type":"boolean"},"pin_change_effective_at":{"type":["string","null"]},"unlock_effective_at":{"type":["string","null"]},"daily_cap":{"type":"integer","minimum":0},"pending_cap":{"type":["integer","null"],"minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"cap_change_effective_at":{"type":["string","null"]},"link_hold_until":{"type":["string","null"]}},"required":["object","pin_set","pin_locked","pin_change_effective_at","unlock_effective_at","daily_cap","pending_cap","cap_change_effective_at","link_hold_until"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeWhatsappPayoutSettings"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/payout-pin":{"put":{"tags":["Dashboard","WhatsApp"],"summary":"Set or reset your WhatsApp payout PIN (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string","pattern":"^\\d{6}$"}},"required":["pin"]}}}},"responses":{"200":{"description":"PIN effective time; resets wait 24 hours","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_pin"]},"effective_at":{"type":"string"}},"required":["object","effective_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putDashboardV1MerchantsByMerchantIdByModeWhatsappPayoutPin"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/payout-pin/unlock":{"post":{"tags":["Dashboard","WhatsApp"],"summary":"Request a 24-hour-delayed WhatsApp payout PIN unlock (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"200":{"description":"Unlock effective time","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_pin"]},"effective_at":{"type":"string"}},"required":["object","effective_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeWhatsappPayoutPinUnlock"}},"/dashboard/v1/merchants/{merchantId}/{mode}/whatsapp/payout-policy":{"put":{"tags":["Dashboard","WhatsApp"],"summary":"Set WhatsApp's merchant-wide daily payout cap (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"daily_cap":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"}},"required":["daily_cap"]}}}},"responses":{"200":{"description":"Effective and pending cap","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_policy"]},"daily_cap":{"type":"integer","minimum":0},"pending_cap":{"type":["integer","null"],"minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"},"pending_at":{"type":["string","null"]}},"required":["object","daily_cap","pending_cap","pending_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putDashboardV1MerchantsByMerchantIdByModeWhatsappPayoutPolicy"}},"/dashboard/v1/merchants/{merchantId}/{mode}/oauth/selection":{"post":{"tags":["Dashboard","OAuth"],"summary":"Select the owner-controlled merchant and mode for this dashboard session's OAuth consent","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"OAuth selection","content":{"application/json":{"schema":{"type":"object","properties":{"merchant_id":{"type":"string"},"mode":{"type":"string","enum":["test","live"]}},"required":["merchant_id","mode"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeOauthSelection"}},"/dashboard/v1/merchants/{merchantId}/{mode}/webhook-endpoints":{"get":{"tags":["Dashboard","Webhooks"],"summary":"List webhook destinations (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Destinations without secrets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardWebhookEndpointList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeWebhookEndpoints"},"post":{"tags":["Dashboard","Webhooks"],"summary":"Create a subscribed webhook destination (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2000},"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]},"minItems":1,"maxItems":13},"payload_policy":{"type":"string","enum":["full","minimal"],"default":"minimal"}},"required":["url","event_types"]}}}},"responses":{"201":{"description":"New destination; signing secret shown once","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_endpoint"]},"id":{"type":"string"},"merchant_id":{"type":"string"},"mode":{"type":["string","null"],"enum":["test","live",null]},"is_default":{"type":"boolean"},"managed_by":{"type":["string","null"],"enum":["whatsapp",null]},"url":{"type":["string","null"]},"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]}},"payload_policy":{"type":"string","enum":["full","minimal"]},"active":{"type":"boolean"},"created_at":{"type":"string"},"signing_secret":{"type":"string"}},"required":["object","id","merchant_id","mode","is_default","managed_by","url","event_types","payload_policy","active","created_at","signing_secret"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Destination cap reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeWebhookEndpoints"}},"/dashboard/v1/merchants/{merchantId}/{mode}/webhook-endpoints/{id}":{"patch":{"tags":["Dashboard","Webhooks"],"summary":"Change webhook subscriptions or active state (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]},"minItems":1,"maxItems":13},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Updated destination","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_endpoint"]},"id":{"type":"string"},"merchant_id":{"type":"string"},"mode":{"type":["string","null"],"enum":["test","live",null]},"is_default":{"type":"boolean"},"managed_by":{"type":["string","null"],"enum":["whatsapp",null]},"url":{"type":["string","null"]},"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]}},"payload_policy":{"type":"string","enum":["full","minimal"]},"active":{"type":"boolean"},"created_at":{"type":"string"}},"required":["object","id","merchant_id","mode","is_default","managed_by","url","event_types","payload_policy","active","created_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeWebhookEndpointsById"},"delete":{"tags":["Dashboard","Webhooks"],"summary":"Disable a webhook destination (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"200":{"description":"Disabled destination","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["webhook_endpoint"]},"id":{"type":"string"},"merchant_id":{"type":"string"},"mode":{"type":["string","null"],"enum":["test","live",null]},"is_default":{"type":"boolean"},"managed_by":{"type":["string","null"],"enum":["whatsapp",null]},"url":{"type":["string","null"]},"event_types":{"type":"array","items":{"type":"string","enum":["payment.succeeded","payment.failed","payment.expired","payment.refunded","payout.succeeded","payout.failed","invoice.created","invoice.paid","invoice.overdue","subscription.past_due","subscription.canceled","subscription.completed","exchange.needs_review"]}},"payload_policy":{"type":"string","enum":["full","minimal"]},"active":{"type":"boolean"},"created_at":{"type":"string"}},"required":["object","id","merchant_id","mode","is_default","managed_by","url","event_types","payload_policy","active","created_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteDashboardV1MerchantsByMerchantIdByModeWebhookEndpointsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/api-keys":{"get":{"tags":["Dashboard"],"summary":"List API key metadata (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"API keys without secrets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardApiKeyList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeApiKeys"},"post":{"tags":["Dashboard"],"summary":"Issue a new API key (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"201":{"description":"New key; secret shown once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedDashboardApiKey"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeApiKeys"}},"/dashboard/v1/merchants/{merchantId}/{mode}/restricted-api-keys":{"post":{"tags":["Dashboard"],"summary":"Issue a merchant key with explicit scopes (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRestrictedApiKey"}}}},"responses":{"201":{"description":"Restricted key; secret shown once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedDashboardApiKey"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeRestrictedApiKeys"}},"/dashboard/v1/merchants/{merchantId}/{mode}/api-keys/{id}/roll":{"post":{"tags":["Dashboard"],"summary":"Issue replacement and schedule old key revocation (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollDashboardApiKey"}}}},"responses":{"201":{"description":"Replacement key; secret shown once","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolledDashboardApiKey"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeApiKeysByIdRoll"}},"/dashboard/v1/merchants/{merchantId}/{mode}/api-keys/{id}":{"delete":{"tags":["Dashboard"],"summary":"Revoke an API key immediately (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"204":{"description":"Key revoked"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteDashboardV1MerchantsByMerchantIdByModeApiKeysById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/onboarding":{"get":{"tags":["Dashboard"],"summary":"Read merchant onboarding (owner only, live mode)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Onboarding","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantOnboarding"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeOnboarding"},"patch":{"tags":["Dashboard"],"summary":"Edit merchant onboarding draft (owner only, live mode)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMerchantOnboarding"}}}},"responses":{"200":{"description":"Updated onboarding","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantOnboarding"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeOnboarding"}},"/dashboard/v1/merchants/{merchantId}/{mode}/onboarding/owner-id":{"put":{"tags":["Dashboard"],"summary":"Upload private owner ID PDF, JPEG, or PNG (owner only, live mode; max 5 MiB)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}}}},"responses":{"201":{"description":"Document stored privately","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KycDocument"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putDashboardV1MerchantsByMerchantIdByModeOnboardingOwnerId"}},"/dashboard/v1/merchants/{merchantId}/{mode}/onboarding/submit":{"post":{"tags":["Dashboard"],"summary":"Submit onboarding for admin review (owner only, live mode)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"terms_version":{"$ref":"#/components/schemas/MerchantTermsVersion"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Submitted onboarding","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantOnboarding"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeOnboardingSubmit"}},"/dashboard/v1/merchants/{merchantId}/{mode}/settlement-settings":{"get":{"tags":["Dashboard"],"summary":"Read automatic settlement settings (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Settlement settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettlementSettings"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeSettlementSettings"},"patch":{"tags":["Dashboard"],"summary":"Configure daily automatic payouts (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSettlementSettings"}}}},"responses":{"200":{"description":"Settlement settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettlementSettings"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Provider unsupported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Provider or rate limiter not configured/available","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeSettlementSettings"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payments":{"get":{"tags":["Dashboard"],"summary":"List payments","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","enum":["requires_payment_method","processing","succeeded","failed","expired","refunded"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"[A-Za-z0-9]","example":"T_M6MTZ6GXKQ4YDFTP","description":"Exact match after keeping only ASCII letters/digits and ignoring case. Separators are ignored. Merchant/mode scoping, status filtering and pagination still apply; a reference can match several payments and does not prove successful payment."},"required":false,"description":"Exact match after keeping only ASCII letters/digits and ignoring case. Separators are ignored. Merchant/mode scoping, status filtering and pagination still apply; a reference can match several payments and does not prove successful payment.","name":"provider_transaction_id","in":"query"}],"responses":{"200":{"description":"Payments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardPaymentList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModePayments"},"post":{"tags":["Dashboard"],"summary":"Create a payment (owner or developer)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayment"}}}},"responses":{"201":{"description":"Payment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModePayments"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payments/{id}":{"get":{"tags":["Dashboard"],"summary":"Retrieve a payment","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModePaymentsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payments/{id}/refunds":{"post":{"tags":["Dashboard"],"summary":"Refund a succeeded Wave payment in full (owner only)","security":[{"dashboardSession":[]}],"description":"Idempotency keys are shared by merchant and mode across API and dashboard refunds. Reusing a key for another payment returns 409 idempotency_conflict. Replays resume the single full refund for the payment; a new key also binds to that refund.","parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"201":{"description":"Full refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refund"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Insufficient funds or unsupported provider","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Provider, ledger or rate limiter unavailable; outcome may require retry/review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModePaymentsByIdRefunds"},"get":{"tags":["Dashboard"],"summary":"Read the full refund for a payment (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Zero or one refund","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardPaymentRefundList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModePaymentsByIdRefunds"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payments/{id}/simulate":{"post":{"tags":["Dashboard"],"summary":"Simulate a test payment (owner or developer)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"outcome":{"type":"string","enum":["succeeded","failed"]}},"required":["outcome"]}}}},"responses":{"200":{"description":"Payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModePaymentsByIdSimulate"}},"/dashboard/v1/merchants/{merchantId}/{mode}/subscriptions":{"get":{"tags":["Dashboard"],"summary":"List subscriptions","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string","enum":["active","past_due","canceled","completed"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Subscriptions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSubscriptionList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeSubscriptions"},"post":{"tags":["Dashboard"],"summary":"Create a subscription (owner or developer)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscription"}}}},"responses":{"201":{"description":"Subscription created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeSubscriptions"}},"/dashboard/v1/merchants/{merchantId}/{mode}/subscriptions/{id}":{"get":{"tags":["Dashboard"],"summary":"Retrieve a subscription","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeSubscriptionsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/subscriptions/{id}/cancel":{"post":{"tags":["Dashboard"],"summary":"Cancel a subscription (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscription"}}}},"responses":{"200":{"description":"Subscription with any in-flight payment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanceledSubscription"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeSubscriptionsByIdCancel"}},"/dashboard/v1/merchants/{merchantId}/{mode}/subscriptions/{id}/test_advance":{"post":{"tags":["Dashboard"],"summary":"Advance test billing (owner or developer)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"200":{"description":"Advanced subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Subscription"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeSubscriptionsByIdTestAdvance"}},"/dashboard/v1/merchants/{merchantId}/{mode}/invoices":{"get":{"tags":["Dashboard"],"summary":"List invoices","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"},{"schema":{"type":"string"},"required":false,"name":"subscription","in":"query"},{"schema":{"type":"string","enum":["open","paid","void","uncollectible"]},"required":false,"name":"status","in":"query"}],"responses":{"200":{"description":"Invoices","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardInvoiceList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeInvoices"}},"/dashboard/v1/merchants/{merchantId}/{mode}/invoices/{id}":{"get":{"tags":["Dashboard"],"summary":"Retrieve an invoice","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Invoice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Invoice"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeInvoicesById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payouts":{"get":{"tags":["Dashboard"],"summary":"List payouts","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardPayoutList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModePayouts"},"post":{"tags":["Dashboard"],"summary":"Create a payout (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayout"}}}},"responses":{"201":{"description":"Payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Insufficient funds","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModePayouts"}},"/dashboard/v1/merchants/{merchantId}/{mode}/payouts/{id}":{"get":{"tags":["Dashboard"],"summary":"Retrieve a payout","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Payout","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payout"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModePayoutsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/balance":{"get":{"tags":["Dashboard"],"summary":"Ledger balance","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeBalance"}},"/dashboard/v1/merchants/{merchantId}/{mode}/webhook-deliveries":{"get":{"tags":["Dashboard"],"summary":"Webhook delivery history","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Deliveries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardWebhookDeliveryList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeWebhookDeliveries"}},"/dashboard/v1/merchants/{merchantId}/{mode}/members":{"get":{"tags":["Dashboard"],"summary":"List members (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"Members","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardMemberList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeMembers"},"post":{"tags":["Dashboard"],"summary":"Invite developer or viewer (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["developer","viewer"]}},"required":["email","role"]}}}},"responses":{"201":{"description":"Member","content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string"},"merchant_id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["owner","developer","viewer"]}},"required":["user_id","merchant_id","email","role"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeMembers"}},"/dashboard/v1/merchants/{merchantId}/{mode}/members/{userId}":{"delete":{"tags":["Dashboard"],"summary":"Remove a developer or viewer (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"204":{"description":"Member removed"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteDashboardV1MerchantsByMerchantIdByModeMembersByUserId"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets":{"get":{"tags":["Dashboard agent wallets"],"summary":"List agent wallets","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Agent wallets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAgentWalletList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWallets"},"post":{"tags":["Dashboard agent wallets"],"summary":"Create an agent wallet (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentWallet"}}}},"responses":{"201":{"description":"Agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentWallets"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}":{"get":{"tags":["Dashboard agent wallets"],"summary":"Read an agent wallet","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWalletsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/balance":{"get":{"tags":["Dashboard agent wallets"],"summary":"Read an agent wallet balance","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Agent wallet balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletBalance"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdBalance"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/transfers":{"get":{"tags":["Dashboard agent wallets"],"summary":"List agent wallet funding and reclaim history","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Wallet transfers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAgentWalletTransferList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdTransfers"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/payouts":{"get":{"tags":["Dashboard agent wallets"],"summary":"List payouts attributed to an agent wallet","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Wallet payouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAgentWalletPayoutList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdPayouts"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/policy":{"patch":{"tags":["Dashboard agent wallets"],"summary":"Change an agent wallet policy (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentWalletPolicy"}}}},"responses":{"200":{"description":"Updated agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"patchDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdPolicy"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/fund":{"post":{"tags":["Dashboard agent wallets"],"summary":"Fund an agent wallet (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"}},"required":["amount"]}}}},"responses":{"201":{"description":"Agent wallet transfer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransfer"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdFund"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/reclaim":{"post":{"tags":["Dashboard agent wallets"],"summary":"Reclaim from an agent wallet (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer","minimum":1,"maximum":100000000,"example":15000,"description":"Integer XOF"}},"required":["amount"]}}}},"responses":{"201":{"description":"Agent wallet transfer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletTransfer"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdReclaim"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/disable":{"post":{"tags":["Dashboard agent wallets"],"summary":"Disable an agent wallet (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Disabled agent wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWallet"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdDisable"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/keys":{"get":{"tags":["Dashboard agent wallets"],"summary":"List agent key metadata (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Agent keys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAgentWalletKeyList"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdKeys"},"post":{"tags":["Dashboard agent wallets"],"summary":"Issue an agent key (owner only; secret shown once)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"responses":{"201":{"description":"New agent key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentWalletKey"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdKeys"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-wallets/{id}/keys/{keyId}":{"delete":{"tags":["Dashboard agent wallets"],"summary":"Revoke an agent key (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string"},"required":true,"name":"keyId","in":"path"}],"responses":{"204":{"description":"Agent key revoked"},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteDashboardV1MerchantsByMerchantIdByModeAgentWalletsByIdKeysByKeyId"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-approvals":{"get":{"tags":["Dashboard"],"summary":"List agent payout approvals (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"starting_after","in":"query"}],"responses":{"200":{"description":"Approvals","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardAgentApprovals"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentApprovals"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-approvals/pin":{"get":{"tags":["Dashboard"],"summary":"Read shared owner payout PIN status without a WhatsApp link","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"}],"responses":{"200":{"description":"PIN status","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["agent_approval_pin_settings"]},"pin_set":{"type":"boolean"},"pin_locked":{"type":"boolean"},"pin_change_effective_at":{"type":["string","null"]},"unlock_effective_at":{"type":["string","null"]}},"required":["object","pin_set","pin_locked","pin_change_effective_at","unlock_effective_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentApprovalsPin"},"put":{"tags":["Dashboard"],"summary":"Set or reset the shared owner payout PIN without a WhatsApp link","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string","pattern":"^\\d{6}$"}},"required":["pin"]}}}},"responses":{"200":{"description":"PIN effective time","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","enum":["whatsapp_payout_pin"]},"effective_at":{"type":"string"}},"required":["object","effective_at"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"putDashboardV1MerchantsByMerchantIdByModeAgentApprovalsPin"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-approvals/{id}":{"get":{"tags":["Dashboard"],"summary":"Read an agent payout approval (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Approval","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPayoutApproval"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getDashboardV1MerchantsByMerchantIdByModeAgentApprovalsById"}},"/dashboard/v1/merchants/{merchantId}/{mode}/agent-approvals/{id}/decision":{"post":{"tags":["Dashboard"],"summary":"Decline or request a PIN link for one agent payout (owner only)","security":[{"dashboardSession":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"merchantId","in":"path"},{"schema":{"type":"string","enum":["test","live"]},"required":true,"name":"mode","in":"path"},{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":255,"description":"Required retry-safe key; reuse it only for the same operation and request body"},"required":true,"description":"Required retry-safe key; reuse it only for the same operation and request body","name":"idempotency-key","in":"header"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"decision":{"type":"string","enum":["approve","decline"]}},"required":["decision"]}}}},"responses":{"200":{"description":"Approval decision","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentApprovalDecision"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sign-in required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Idempotency conflict or invalid state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited; see Retry-After response header","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Rate limiter or service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postDashboardV1MerchantsByMerchantIdByModeAgentApprovalsByIdDecision"}}},"webhooks":{}}