{"openapi":"3.0.0","paths":{"/v1/auth/turnstile/verify":{"post":{"operationId":"AuthController_verifyTurnstile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TurnstileVerifyDto"}}}},"responses":{"200":{"description":""}},"summary":"Verify a Cloudflare Turnstile token before opening Privy.","tags":["auth"]}},"/v1/auth/sync":{"post":{"operationId":"AuthController_sync","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncDto"}}}},"responses":{"200":{"description":""}},"summary":"Verify a Privy access token, upsert the Merchant row, and return the synced profile. Idempotent.","tags":["auth"]}},"/v1/auth/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Return the merchant attached to the current session.","tags":["auth"]}},"/v1/auth/privy-webhook":{"post":{"operationId":"PrivyWebhookController_receive","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/v1/merchants/me":{"get":{"operationId":"MerchantsController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Read the current merchant profile.","tags":["merchants"]},"patch":{"operationId":"MerchantsController_update","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMerchantDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update merchant profile fields.","tags":["merchants"]}},"/v1/merchants/me/onboard":{"post":{"operationId":"MerchantsController_onboard","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Submit the self-attested business onboarding form (business name, sector, country, payout address).","tags":["merchants"]}},"/v1/merchants/me/tier":{"post":{"operationId":"MerchantsController_changeTier","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeTierDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Change merchant pricing tier.","tags":["merchants"]}},"/v1/merchants/me/live-mode-eligibility":{"get":{"operationId":"MerchantsController_liveModeEligibility","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Return whether the merchant can issue live API keys, plus structured reasons for any gating.","tags":["merchants"]}},"/v1/merchants/me/chain-status":{"get":{"operationId":"MerchantsController_chainStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Read the merchant's on-chain registry id (if any) and the prerequisites still needed to register.","tags":["merchants"]}},"/v1/merchants/me/onchain-state":{"get":{"operationId":"MerchantsController_onchainState","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Live on-chain merchant record from the Registry. Backs the Settings page's payout-rotation and ownership-transfer flows.","tags":["merchants"]}},"/v1/merchants/me/balance":{"get":{"operationId":"MerchantsController_balance","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Live on-chain USDC + EURC balance at the merchant`s payout address. Backs the /app/withdraw page.","tags":["merchants"]}},"/v1/relay/payments":{"post":{"description":"Accepts a payer-signed ReceiveWithAuthorization and submits it on-chain via the StrimzPayments contract. Idempotent on `idempotencyKey`.","operationId":"RelayController_submitPayment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitPaymentDto"}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Submit a payer-signed one-shot payment (EIP-3009)","tags":["relay"]}},"/v1/relay/subscriptions":{"post":{"description":"Accepts a payer-signed Permit and creates the on-chain subscription via StrimzSubscriptions.permitAndCreateSubscription. Idempotent on `idempotencyKey`.","operationId":"RelayController_submitSubscription","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitSubscriptionDto"}}}},"responses":{"201":{"description":""}},"security":[{"apiKey":[]}],"summary":"Submit a payer-signed subscription enrolment (EIP-2612 permit)","tags":["relay"]}},"/v1/relay/submissions/{idempotencyKey}":{"get":{"description":"Returns the latest known state of a previously submitted relay job. Returns 404 if no submission exists for the given key (either it was never submitted, or BullMQ aged it out of the retention window).","operationId":"RelayController_getSubmission","parameters":[{"name":"idempotencyKey","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"apiKey":[]}],"summary":"Look up a submission by idempotency key","tags":["relay"]}},"/v1/subscriptions/{id}":{"get":{"operationId":"SubscriptionsController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["subscriptions"]}},"/v1/subscriptions":{"get":{"operationId":"SubscriptionsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["subscriptions"]}},"/v1/subscriptions/{id}/cancel":{"post":{"operationId":"SubscriptionsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancel a subscription. Marks DB optimistically, enqueues on-chain cancel.","tags":["subscriptions"]}},"/v1/api-keys":{"post":{"operationId":"ApiKeysController_create","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["api-keys"]},"get":{"operationId":"ApiKeysController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["api-keys"]}},"/v1/api-keys/{id}":{"get":{"operationId":"ApiKeysController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["api-keys"]}},"/v1/api-keys/{id}/revoke":{"post":{"operationId":"ApiKeysController_revoke","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["api-keys"]}},"/v1/api-keys/{id}/rotate":{"post":{"operationId":"ApiKeysController_rotate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoke this key and mint a fresh one with identical scopes.","tags":["api-keys"]}},"/v1/customers":{"post":{"operationId":"CustomersController_upsert","parameters":[],"responses":{"201":{"description":""}},"tags":["Customers"]},"get":{"operationId":"CustomersController_list","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"externalRef","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Customers"]}},"/v1/customers/{id}":{"get":{"operationId":"CustomersController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Customers"]}},"/v1/payment-sessions":{"post":{"operationId":"PaymentSessionsController_create","parameters":[],"responses":{"201":{"description":""}},"tags":["PaymentSessions"]},"get":{"operationId":"PaymentSessionsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["PaymentSessions"]}},"/v1/payment-sessions/{id}":{"get":{"operationId":"PaymentSessionsController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PaymentSessions"]}},"/v1/payment-sessions/{id}/cancel":{"post":{"operationId":"PaymentSessionsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["PaymentSessions"]}},"/v1/payment-sessions/{id}/expire":{"post":{"operationId":"PaymentSessionsController_expire","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["PaymentSessions"]}},"/v1/transactions/{id}":{"get":{"operationId":"TransactionsController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Transactions"]}},"/v1/transactions":{"get":{"operationId":"TransactionsController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["Transactions"]}},"/v1/subscription-plans":{"post":{"operationId":"SubscriptionPlansController_create","parameters":[],"responses":{"201":{"description":""}},"tags":["SubscriptionPlans"]},"get":{"operationId":"SubscriptionPlansController_list","parameters":[],"responses":{"200":{"description":""}},"tags":["SubscriptionPlans"]}},"/v1/subscription-plans/{id}":{"get":{"operationId":"SubscriptionPlansController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["SubscriptionPlans"]}},"/v1/subscription-plans/{id}/archive":{"post":{"operationId":"SubscriptionPlansController_archive","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["SubscriptionPlans"]}},"/v1/refunds":{"post":{"operationId":"RefundsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRefundDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a refund intent. Returns wallet-signing instructions for the merchant to broadcast on-chain.","tags":["refunds"]},"get":{"operationId":"RefundsController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["refunds"]}},"/v1/refunds/{id}":{"get":{"operationId":"RefundsController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["refunds"]}},"/v1/refunds/{id}/signature":{"post":{"operationId":"RefundsController_submitSignature","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitRefundSignatureDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Record the on-chain tx hash after signing the refund transfer.","tags":["refunds"]}},"/v1/webhook-endpoints":{"post":{"operationId":"WebhooksController_createEndpoint","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Register a new webhook endpoint and return the signing secret once.","tags":["webhooks"]},"get":{"operationId":"WebhooksController_listEndpoints","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-endpoints/{id}":{"get":{"operationId":"WebhooksController_retrieveEndpoint","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-endpoints/{id}/disable":{"post":{"operationId":"WebhooksController_disable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-endpoints/{id}/enable":{"post":{"operationId":"WebhooksController_enable","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-endpoints/{id}/rotate-secret":{"post":{"operationId":"WebhooksController_rotateSecret","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Generate a fresh signing secret. Old secret immediately invalidated.","tags":["webhooks"]}},"/v1/webhook-deliveries/{id}":{"get":{"operationId":"WebhooksController_retrieveDelivery","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-deliveries":{"get":{"operationId":"WebhooksController_listDeliveries","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["webhooks"]}},"/v1/webhook-deliveries/{id}/replay":{"post":{"operationId":"WebhooksController_replay","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Re-enqueue a delivery onto the scheduler queue.","tags":["webhooks"]}},"/v1/compliance/logs":{"get":{"operationId":"ComplianceController_listLogs","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List compliance screening results scoped to the current merchant.","tags":["compliance"]}},"/v1/stats/conversion":{"get":{"operationId":"AnalyticsController_conversion","parameters":[{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Daily checkout conversion rate.","tags":["analytics"]}},"/v1/stats/churn":{"get":{"operationId":"AnalyticsController_churn","parameters":[{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Monthly subscription churn rate.","tags":["analytics"]}},"/v1/stats/mrr":{"get":{"operationId":"AnalyticsController_mrr","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Monthly recurring revenue from active subscriptions.","tags":["analytics"]}},"/v1/stats/ltv":{"get":{"operationId":"AnalyticsController_ltv","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Customer lifetime value, ranked by total spend.","tags":["analytics"]}},"/v1/stats/forecast":{"get":{"operationId":"AnalyticsController_forecast","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"30/60/90-day revenue forecast (linear regression over 90-day history).","tags":["analytics"]}},"/v1/agents/config":{"get":{"operationId":"AgentsController_retrieveConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Read AutoPay Agent configuration for the current merchant.","tags":["agents"]},"patch":{"operationId":"AgentsController_updateConfig","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update AutoPay Agent configuration. Partial — sends only changed fields.","tags":["agents"]}},"/v1/agents/activity":{"get":{"operationId":"AgentsController_listActivity","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Paginated activity log for AutoPay Agent.","tags":["agents"]}},"/v1/agents/jobs":{"get":{"operationId":"AgentsController_listJobs","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["agents"]},"post":{"operationId":"AgentsController_createJob","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentJobDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create an ERC-8183 escrow job. Auto-approves below the merchant-configured threshold.","tags":["agents"]}},"/v1/agents/jobs/{id}":{"get":{"operationId":"AgentsController_retrieveJob","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["agents"]}},"/v1/agents/jobs/{id}/approve":{"post":{"operationId":"AgentsController_approveJob","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Human-approve a job that needed manual sign-off.","tags":["agents"]}},"/v1/storefront":{"get":{"operationId":"StorefrontsController_retrieve","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Retrieve the merchant’s own storefront.","tags":["storefronts"]},"post":{"operationId":"StorefrontsController_upsert","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorefrontDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create or update the merchant storefront.","tags":["storefronts"]}},"/v1/storefront/publish":{"post":{"operationId":"StorefrontsController_publish","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]}},"/v1/storefront/archive":{"post":{"operationId":"StorefrontsController_archive","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]}},"/v1/storefront/products":{"get":{"operationId":"StorefrontsController_listProducts","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]},"post":{"operationId":"StorefrontsController_createProduct","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStorefrontProductDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]}},"/v1/storefront/products/{id}":{"get":{"operationId":"StorefrontsController_retrieveProduct","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]}},"/v1/storefront/products/{id}/archive":{"post":{"operationId":"StorefrontsController_archiveProduct","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["storefronts"]}},"/store/{slug}":{"get":{"operationId":"StorefrontsController_retrievePublic","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Public storefront page by slug. Used by apps/web.","tags":["storefronts"]}},"/store/{slug}/products/{productId}/checkout":{"post":{"operationId":"StorefrontsController_checkoutFromProduct","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"productId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorefrontCheckoutDto"}}}},"responses":{"201":{"description":""}},"summary":"Mint a checkout URL for a storefront product. Called by the public /store/[slug]/products/[id] page when the shopper clicks Buy.","tags":["storefronts"]}},"/v1/invoices":{"post":{"operationId":"InvoicesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvoiceDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create an invoice and a backing payment session.","tags":["invoices"]},"get":{"operationId":"InvoicesController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["invoices"]}},"/v1/invoices/{id}":{"get":{"operationId":"InvoicesController_retrieve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["invoices"]}},"/v1/invoices/{id}/send":{"post":{"operationId":"InvoicesController_send","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Send the invoice via email to the customer email recorded on it.","tags":["invoices"]}},"/v1/invoices/{id}/void":{"post":{"operationId":"InvoicesController_void","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["invoices"]}},"/health":{"get":{"operationId":"HealthController_liveness","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}},"/ready":{"get":{"operationId":"HealthController_readiness","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}},"/v1/tokens/{address}":{"get":{"description":"Returns name, symbol, decimals, EIP-712 domain version, and capability bitmap (EIP-2612 permit, EIP-3009 transferWithAuthorization). The browser SDK uses this to pick which meta-tx path to take for a given token.","operationId":"TokensController_getMetadata","parameters":[{"name":"address","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get token metadata and Strimz capabilities","tags":["tokens"]}},"/v1/tokens/{address}/permit-nonce":{"get":{"description":"Returns the current `nonces(owner)` value for the token. Read this immediately before signing a Permit — the token contract rejects stale nonces.","operationId":"TokensController_getPermitNonce","parameters":[{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"owner","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get an owner's EIP-2612 permit nonce","tags":["tokens"]}},"/v1/checkout/merchants/{id}":{"get":{"description":"Returns businessName, logoUrl, and walletAddress so the hosted checkout can render the merchant identity. Public because the checkout URL already exposes the session/plan tied to this merchant.","operationId":"CheckoutController_retrieveMerchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Load a merchant brand card by id (public)","tags":["checkout"]}},"/v1/checkout/sessions/{id}":{"get":{"description":"Returns the same shape as the merchant-scoped retrieve, including chainMerchantId and tokenAddress so the hosted checkout can build the EIP-712 typed-data.","operationId":"CheckoutController_retrieveSession","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Load a payment session by id (public)","tags":["checkout"]}},"/v1/checkout/plans/{id}":{"get":{"description":"Returns the same shape as the merchant-scoped retrieve, including chainMerchantId, tokenAddress, and intervalSeconds so the hosted enrolment page can build the EIP-2612 permit.","operationId":"CheckoutController_retrievePlan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Load a subscription plan by id (public)","tags":["checkout"]}},"/v1/checkout/plans/{id}/subscription":{"get":{"description":"The hosted enrolment page calls this once the payer connects a wallet, so it can show \"already subscribed\" instead of letting them sign a duplicate enrolment. Scoped to (planId, payer): a subscription to a different plan or merchant never matches.","operationId":"CheckoutController_planSubscriptionStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"payer","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Check whether a wallet already subscribes to a plan (public)","tags":["checkout"]}},"/v1/checkout/sessions/{id}/payer":{"post":{"description":"The hosted checkout calls this after the payer connects a wallet and enters an email but before they sign the meta-tx. Upserts a Customer on the merchant keyed by (merchantId, walletAddress), keeps a rolling email history under Customer.metadata.emailHistory, and links the session to the customer so the receipt can find the payer once the on-chain confirmation lands.","operationId":"CheckoutController_attachSessionPayer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerIdentityDto"}}}},"responses":{"201":{"description":""}},"summary":"Attach a payer identity to a payment session (public)","tags":["checkout"]}},"/v1/checkout/plans/{id}/payer":{"post":{"description":"Same shape as the session variant, but scoped to a plan. Used by the /sub/:planId page before the payer signs the permit. No subscription row exists yet at this point, so this only upserts the Customer. The indexer links Subscription.customerId once the enrolment event confirms on-chain (by matching wallet address).","operationId":"CheckoutController_attachPlanPayer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerIdentityDto"}}}},"responses":{"201":{"description":""}},"summary":"Attach a payer identity to a subscription plan (public)","tags":["checkout"]}},"/v1/admin/me":{"get":{"operationId":"AdminController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Current admin profile.","tags":["admin"]}},"/v1/admin/overview":{"get":{"operationId":"AdminController_overview","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Platform-wide KPIs.","tags":["admin"]}},"/v1/admin/merchants":{"get":{"operationId":"AdminController_listMerchants","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List merchants with filters + pagination.","tags":["admin"]}},"/v1/admin/merchants/{id}":{"get":{"operationId":"AdminController_getMerchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Merchant detail with stats.","tags":["admin"]}},"/v1/admin/merchants/{id}/suspend":{"post":{"operationId":"AdminController_suspendMerchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Suspend a merchant. Active sessions still settle; new ones refuse.","tags":["admin"]}},"/v1/admin/merchants/{id}/reactivate":{"post":{"operationId":"AdminController_reactivateMerchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reactivate a suspended merchant.","tags":["admin"]}},"/v1/admin/merchants/{id}/close":{"post":{"operationId":"AdminController_closeMerchant","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Permanently close a merchant account.","tags":["admin"]}},"/v1/admin/merchants/{id}/tier":{"patch":{"operationId":"AdminController_setMerchantTier","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMerchantTierDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Change a merchant tier (free / growth / scale / enterprise).","tags":["admin"]}},"/v1/admin/merchants/{id}/status":{"patch":{"operationId":"AdminController_setMerchantStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMerchantStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Set merchant status explicitly. Same effect as suspend/reactivate.","tags":["admin"]}},"/v1/admin/analytics/volume":{"get":{"operationId":"AdminController_volumeSeries","parameters":[{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Daily platform volume (gross + fees) over a date range.","tags":["admin"]}},"/v1/admin/analytics/signups":{"get":{"operationId":"AdminController_signupSeries","parameters":[{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Daily merchant signups over a date range.","tags":["admin"]}},"/v1/admin/analytics/top-merchants":{"get":{"operationId":"AdminController_topMerchants","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Top merchants by confirmed-transaction volume.","tags":["admin"]}},"/v1/admin/health":{"get":{"operationId":"AdminController_health","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Indexer + webhook + subscription operational health.","tags":["admin"]}},"/v1/admin/admins":{"get":{"operationId":"AdminController_listAdmins","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List admin users.","tags":["admin"]},"post":{"operationId":"AdminController_inviteAdmin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAdminDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Invite a new admin (by email).","tags":["admin"]}},"/v1/admin/admins/{id}/role":{"patch":{"operationId":"AdminController_setAdminRole","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAdminRoleDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Change an admin's role.","tags":["admin"]}},"/v1/admin/admins/{id}/status":{"patch":{"operationId":"AdminController_setAdminStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAdminStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Suspend or reactivate an admin.","tags":["admin"]}},"/v1/admin/admins/{id}":{"delete":{"operationId":"AdminController_removeAdmin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Suspend an admin (alias for setAdminStatus → suspended).","tags":["admin"]}},"/v1/admin/broadcasts":{"post":{"operationId":"AdminController_createBroadcast","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBroadcastDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Send a broadcast. Audience `all` fans out to every active merchant; `merchant` messages one merchant by id.","tags":["admin"]},"get":{"operationId":"AdminController_listBroadcasts","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Recent broadcasts sent by any admin. Read for any active admin.","tags":["admin"]}},"/v1/contact":{"post":{"operationId":"ContactController_submit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequestDto"}}}},"responses":{"201":{"description":""}},"summary":"Deliver a marketing-form message to the Strimz support inbox. Backs the /contact page on the marketing site.","tags":["contact"]}},"/v1/notifications":{"get":{"operationId":"NotificationsController_list","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List recent notifications for the current merchant. Derived from recent confirmed payments, new subscribers, and refunds; read state resolved against the merchant`s notificationsLastReadAt.","tags":["notifications"]}},"/v1/notifications/mark-all-read":{"post":{"operationId":"NotificationsController_markAllRead","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Set notificationsLastReadAt = now(). Called by the dashboard tray when the merchant opens it.","tags":["notifications"]}}},"info":{"title":"Strimz API","description":"B2B subscription billing infrastructure for stablecoin commerce on Arc.","version":"2026-04-27","contact":{"name":"Strimz","url":"https://strimz.finance","email":"support@strimz.finance"}},"tags":[],"servers":[{"url":"https://api.strimz.finance"}],"components":{"securitySchemes":{"privy":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"apiKey":{"scheme":"bearer","bearerFormat":"API key","type":"http"}},"schemas":{"TurnstileVerifyDto":{"type":"object","properties":{"token":{"type":"string","minLength":1}},"required":["token"]},"SyncDto":{"type":"object","properties":{"accessToken":{"type":"string","minLength":1}},"required":["accessToken"]},"UpdateMerchantDto":{"type":"object","properties":{"businessName":{"type":"string","minLength":2,"maxLength":120},"payoutAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"defaultCurrency":{"type":"string","enum":["USDC","EURC"]},"websiteUrl":{"type":"string","format":"uri","nullable":true},"logoUrl":{"type":"string","format":"uri","nullable":true},"countryCode":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":{"oneOf":[{"type":"string","maxLength":500},{"type":"number"},{"type":"boolean"},{}]},"default":{}},"emailPrefs":{"type":"object","properties":{"paymentReceived":{"type":"boolean"},"subscriptionCharged":{"type":"boolean"}}}}},"OnboardDto":{"type":"object","properties":{"businessName":{"type":"string","minLength":2,"maxLength":120},"businessSector":{"type":"string","minLength":2,"maxLength":80},"countryCode":{"type":"string","pattern":"^[A-Z]{2}$"},"websiteUrl":{"type":"string","format":"uri"},"logoUrl":{"type":"string","format":"uri"},"phone":{"type":"string","minLength":6,"maxLength":20},"payoutAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"defaultCurrency":{"type":"string","enum":["USDC","EURC"]}},"required":["businessName","businessSector","countryCode","payoutAddress"]},"ChangeTierDto":{"type":"object","properties":{"tier":{"type":"string","enum":["free","growth","business","enterprise"]}},"required":["tier"]},"SubmitPaymentDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_.-]+$"},"merchantId":{"type":"string","pattern":"^[0-9]+$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"auth":{"type":"object","properties":{"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","pattern":"^[0-9]+$"},"validAfter":{"type":"string","pattern":"^[0-9]+$"},"validBefore":{"type":"string","pattern":"^[0-9]+$"},"nonce":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["from","amount","validAfter","validBefore","nonce"]},"ref":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"authSignature":{"type":"object","properties":{"v":{"type":"integer"},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["v","r","s"]},"intentSignature":{"type":"object","properties":{"v":{"type":"integer"},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["v","r","s"]},"sessionId":{"type":"string","minLength":1,"maxLength":80}},"required":["idempotencyKey","merchantId","token","auth","ref","authSignature","intentSignature"]},"SubmitSubscriptionDto":{"type":"object","properties":{"idempotencyKey":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_.-]+$"},"merchantId":{"type":"string","pattern":"^[0-9]+$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","pattern":"^[0-9]+$"},"interval":{"type":"integer","minimum":0,"exclusiveMinimum":true},"startAt":{"type":"string","pattern":"^[0-9]+$"},"endAt":{"type":"string","pattern":"^[0-9]+$"},"permitData":{"type":"object","properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"value":{"type":"string","pattern":"^[0-9]+$"},"deadline":{"type":"string","pattern":"^[0-9]+$"}},"required":["owner","value","deadline"]},"permitSignature":{"type":"object","properties":{"v":{"type":"integer"},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["v","r","s"]},"intentSignature":{"type":"object","properties":{"v":{"type":"integer"},"r":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"s":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["v","r","s"]},"subscriptionInternalId":{"type":"string","minLength":1,"maxLength":80}},"required":["idempotencyKey","merchantId","token","amount","interval","startAt","endAt","permitData","permitSignature","intentSignature"]},"CancelSubscriptionDto":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}},"CreateRefundDto":{"type":"object","properties":{"transactionId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[a-zA-Z0-9_-]+$"},"amount":{"type":"string","pattern":"^[0-9]+$"},"reason":{"type":"string","enum":["customer_request","product_issue","duplicate_charge","fraudulent","other"]},"note":{"type":"string","maxLength":500}},"required":["transactionId","amount","reason"]},"SubmitRefundSignatureDto":{"type":"object","properties":{"refundTxHash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$"}},"required":["refundTxHash"]},"CreateWebhookEndpointDto":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","minItems":1,"items":{"type":"string","enum":["payment.created","payment.completed","payment.failed","subscription.created","subscription.charged","subscription.charge_failed","subscription.recovery_attempt","subscription.recovery_outcome","subscription.cancelled","subscription.lapsed","refund.created","refund.completed","refund.failed","invoice.created","invoice.paid","invoice.overdue","agent.action_executed","agent.job_proposed","agent.job_completed","agent.job_disputed","compliance.wallet_flagged","compliance.wallet_blocked"]}},"description":{"type":"string","maxLength":200},"mode":{"type":"string","enum":["test","live"]}},"required":["url","events","mode"]},"UpdateAgentConfigDto":{"type":"object","properties":{"enabledCapabilities":{"type":"array","items":{"type":"string","enum":["identity","recovery","routing","cashflow","commerce","pricing_intelligence"]},"default":[]},"recovery":{"type":"object","properties":{"gracePeriodHours":{"oneOf":[{"type":"number","minimum":24,"maximum":24},{"type":"number","minimum":48,"maximum":48},{"type":"number","minimum":72,"maximum":72}],"default":48},"strategy":{"type":"string","enum":["once","twice","until_grace_ends"],"default":"twice"},"notificationTemplate":{"type":"string","maxLength":2000,"nullable":true}},"required":["notificationTemplate"]},"cashflow":{"type":"object","properties":{"digestEnabled":{"type":"boolean","default":false},"anomalySensitivity":{"type":"string","enum":["low","medium","high"],"default":"medium"},"autoConvertToYield":{"type":"boolean","default":false},"minimumLiquidReserveCents":{"type":"integer","minimum":0,"exclusiveMinimum":false,"default":100000}}},"commerce":{"type":"object","properties":{"requireHumanApprovalAboveUsdCents":{"type":"integer","minimum":0,"exclusiveMinimum":false,"default":100000},"approvedVendors":{"type":"array","items":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"default":[]},"monthlySpendCapUsdCents":{"type":"integer","minimum":0,"exclusiveMinimum":false,"nullable":true}},"required":["monthlySpendCapUsdCents"]}}},"CreateAgentJobDto":{"type":"object","properties":{"vendorAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"description":{"type":"string","minLength":1,"maxLength":2000},"amount":{"type":"string","pattern":"^[0-9]+$"},"currency":{"type":"string","enum":["USDC","EURC"]},"assessorAddress":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"}},"required":["vendorAddress","description","amount","currency"]},"CreateStorefrontDto":{"type":"object","properties":{"slug":{"type":"string","minLength":3,"maxLength":40,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"name":{"type":"string","minLength":2,"maxLength":120},"description":{"type":"string","maxLength":2000,"nullable":true},"logoUrl":{"type":"string","format":"uri","nullable":true},"coverImageUrl":{"type":"string","format":"uri","nullable":true},"accentColor":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$","nullable":true},"socialLinks":{"type":"array","maxItems":10,"items":{"type":"string","format":"uri"},"default":[]}},"required":["slug","name","description","logoUrl","coverImageUrl","accentColor"]},"CreateStorefrontProductDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":2000,"nullable":true},"imageUrl":{"type":"string","format":"uri"},"price":{"type":"string","pattern":"^[0-9]+$"},"currency":{"type":"string","enum":["USDC","EURC"]},"type":{"type":"string","enum":["one_time","subscription"]},"interval":{"type":"string","enum":["daily","weekly","monthly","quarterly","yearly"],"nullable":true},"intervalCount":{"type":"integer","minimum":1,"exclusiveMinimum":false,"maximum":365,"exclusiveMaximum":false,"nullable":true},"stock":{"type":"integer","minimum":0,"exclusiveMinimum":false,"nullable":true},"isActive":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":0,"exclusiveMinimum":false,"default":0}},"required":["name","description","price","currency","type","interval","intervalCount","stock","isActive"]},"StorefrontCheckoutDto":{"type":"object","properties":{"customerEmail":{"type":"string","format":"email"},"returnPath":{"type":"string","maxLength":200}}},"CreateInvoiceDto":{"type":"object","properties":{"customerName":{"type":"string","minLength":1,"maxLength":200},"customerEmail":{"type":"string","format":"email","maxLength":320},"lineItems":{"type":"array","minItems":1,"items":{"type":"object","properties":{"description":{"type":"string","minLength":1,"maxLength":500},"quantity":{"type":"integer","minimum":1,"exclusiveMinimum":false,"maximum":10000,"exclusiveMaximum":false},"unitAmount":{"type":"string","pattern":"^[0-9]+$"}},"required":["description","quantity","unitAmount"]}},"currency":{"type":"string","enum":["USDC","EURC"]},"note":{"type":"string","maxLength":2000},"dueInDays":{"type":"integer","minimum":1,"exclusiveMinimum":false,"maximum":90,"exclusiveMaximum":false,"default":7}},"required":["lineItems","currency"]},"PayerIdentityDto":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":320},"walletAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["email","walletAddress"]},"SetMerchantTierDto":{"type":"object","properties":{"tier":{"type":"string","enum":["free","growth","business","enterprise"]}},"required":["tier"]},"SetMerchantStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["active","suspended","closed"]}},"required":["status"]},"InviteAdminDto":{"type":"object","properties":{"email":{"type":"string","format":"email","maxLength":320},"name":{"type":"string","minLength":1,"maxLength":120},"role":{"type":"string","enum":["super_admin","admin","read_only"]}},"required":["email","role"]},"SetAdminRoleDto":{"type":"object","properties":{"role":{"type":"string","enum":["super_admin","admin","read_only"]}},"required":["role"]},"SetAdminStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["active","suspended"]}},"required":["status"]},"CreateBroadcastDto":{"type":"object","properties":{"title":{"type":"string","minLength":4,"maxLength":160},"body":{"type":"string","minLength":4,"maxLength":4000},"audience":{"type":"string","enum":["all","merchant"],"default":"all"},"merchantId":{"type":"string"}},"required":["title","body"]},"ContactRequestDto":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"email":{"type":"string","format":"email","maxLength":320},"company":{"type":"string","minLength":1,"maxLength":120},"topic":{"type":"string","enum":["sales","support","partnership","security","other"]},"message":{"type":"string","minLength":20,"maxLength":4000}},"required":["name","email","topic","message"]}}}}