{"info":{"title":"ODUS Core API","description":"Official ODUS Core API reference. ODUS is a payment orchestration platform that simplifies payment processing by integrating multiple payment gateways into a single API.","version":"1.0","contact":{}},"servers":[{"url":"https://api.odus.com","description":"Production URL"},{"url":"https://sandbox-api.odus.com","description":"Sandbox URL"}],"tags":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"API Key","type":"http","description":"To authenticate, generate a Secret API Key from your ODUS Dashboard and include it in the `Authorization` header as follows: `Authorization: Bearer <YOUR_SECRET_API_KEY>`"}},"schemas":{"ErrorResponse":{"type":"object","properties":{"statusCode":{"type":"number","description":"HTTP status code","examples":[400]},"requestId":{"type":"string","description":"Unique identifier for the request","examples":["dfc10de3-36bb-4bcc-b081-316216194033"]},"message":{"type":"string","description":"Human-readable description of the failure","examples":["An error occurred"]},"type":{"type":"string","enum":["invalid_request_error","authentication_error","permission_error","not_found_error","invalid_state_error","conflict_error","rate_limit_error","payment_error","api_error"],"description":"Coarse, stable classifier for the failure. Present on every error response including 5xx. This is the field to branch on: `statusCode` is too coarse and `message` is human prose that may be reworded. The set is closed and every member is permanent, so it is safe to handle exhaustively.","examples":["invalid_request_error"]},"code":{"type":"string","description":"Fine-grained identifier for the failure, present only where it adds something `type` does not — for example separating a replayed idempotency key from a held lock, or naming the reason a payment was declined. The set is open and grows over time, so treat an unrecognised value as absent and fall back to `type`.","examples":["validation_failed"]}},"required":["statusCode","requestId","message","type"]},"ValidationErrorResponse":{"properties":{"statusCode":{"type":"number","description":"HTTP status code","examples":[400]},"requestId":{"type":"string","description":"Unique identifier for the request","examples":["dfc10de3-36bb-4bcc-b081-316216194033"]},"message":{"type":"string","description":"The first error message from the validation errors","examples":["email must be a valid email address"]},"type":{"type":"string","enum":["invalid_request_error","authentication_error","permission_error","not_found_error","invalid_state_error","conflict_error","rate_limit_error","payment_error","api_error"],"description":"Coarse, stable classifier for the failure. Present on every error response including 5xx. This is the field to branch on: `statusCode` is too coarse and `message` is human prose that may be reworded. The set is closed and every member is permanent, so it is safe to handle exhaustively.","examples":["invalid_request_error"]},"code":{"type":"string","description":"Fine-grained identifier for the failure, present only where it adds something `type` does not — for example separating a replayed idempotency key from a held lock, or naming the reason a payment was declined. The set is open and grows over time, so treat an unrecognised value as absent and fall back to `type`.","examples":["validation_failed"]},"errors":{"type":"array","description":"Complete list of validation errors","items":{"type":"string"},"examples":[["email must be a valid email address.","password must be at least 8 characters long."]]}},"required":["statusCode","requestId","message","type"]},"ProvisioningInProgress":{"type":"object","required":["status","merchantAccountId"],"properties":{"status":{"type":"string","enum":["provisioning"],"description":"Signals the merchant environment is still being provisioned."},"merchantAccountId":{"type":"string","description":"The merchant account whose environment is being provisioned.","examples":["dAI3aa87ROOeupeBCjNSKCOBOisBCYjB"]}}},"AccountDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the account"},"name":{"type":"string","description":"Name of the account","examples":["Zezima Studios"]}},"required":["createdAt","updatedAt","id","name"]},"GatewayProfilePartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods"]},"GatewayProfileDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"},"configuration":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["stripe"],"description":"Gateway integration type","examples":["stripe"]},"environment":{"type":"string","enum":["live","test"],"description":"Gateway environment","examples":["test"]},"secretKey":{"type":"string","description":"Stripe secret key","examples":["sk_test_..."]},"webhookSecret":{"description":"Webhook signing secret for signature verification","type":["string","null"]},"useStatementDescriptorSuffix":{"type":"boolean","description":"Whether card payments send the payment's `statementDescriptorSuffix` to Stripe instead of its `statementDescriptor`. Stripe appends the suffix to your account's shortened descriptor, so the statement reads `PREFIX* SUFFIX`. Turn this on if Stripe rejects payments that set a full statement descriptor: newer Stripe accounts accept only the suffix. When it is on, a payment without a suffix uses your Stripe account's descriptor. Defaults to `false`.","examples":[false]}},"required":["type","environment","secretKey","useStatementDescriptorSuffix"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["adyen"],"description":"Gateway integration type","examples":["adyen"]},"environment":{"type":"string","enum":["live","test"],"description":"Gateway environment","examples":["test"]},"apiKey":{"type":"string","description":"Adyen API key","examples":["your-api-key"]},"merchantAccount":{"type":"string","description":"Adyen merchant account name","examples":["MerchantAccountName"]},"liveUrlPrefix":{"type":["string","null"],"description":"Live endpoint URL prefix","examples":["0b3c1310cad152c9-MyCompany"]},"webhookSecret":{"description":"Webhook HMAC key for signature verification","type":["string","null"]}},"required":["type","environment","apiKey","merchantAccount"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkout"],"description":"Gateway integration type","examples":["checkout"]},"environment":{"type":"string","enum":["live","test"],"description":"Gateway environment","examples":["test"]},"secretKey":{"type":"string","description":"Checkout.com secret key","examples":["sk_sbox_..."]},"processingChannel":{"type":"string","description":"Checkout.com processing channel ID","examples":["pc_..."]},"webhookSecret":{"description":"Webhook signing secret for signature verification","type":["string","null"]},"merchantCity":{"description":"Merchant city for billing descriptor","type":["string","null"],"examples":["Tallinn"]}},"required":["type","environment","secretKey","processingChannel"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["paypal"],"description":"Gateway integration type","examples":["paypal"]},"environment":{"type":"string","enum":["live","test"],"description":"Gateway environment","examples":["test"]},"clientId":{"type":"string","description":"PayPal application client ID","examples":["client-id-from-paypal-app"]},"secretKey":{"type":"string","description":"PayPal application secret key","examples":["secret-key-from-paypal-app"]},"integrationMode":{"type":"string","enum":["vault","billingAgreement"],"description":"Integration mode: \"vault\" uses PayPal Vaulting, \"billingAgreement\" uses Billing Agreements API"},"collectShippingAddress":{"type":"boolean","description":"Whether to collect shipping address from PayPal. Only available for Vault integration mode."},"webhookId":{"description":"PayPal webhook ID for signature verification","type":["string","null"],"examples":["0NH55953DH663215D"]},"cardProcessing":{"type":"boolean","description":"Whether this profile also accepts card payments, processed by PayPal. Turn it on only after PayPal has enabled card processing on your PayPal account. When it is on, card payment options can use this profile. Card payments on this profile ask for 3-D Secure when the card requires it. Merchant-initiated card payments, such as subscription renewals, are charged from the saved card without 3-D Secure. They are declined when the card has no earlier approved payment with a card network reference, or no known brand. A Mastercard or Discover card is also declined when the date the card network approved that earlier payment is unknown. PayPal requires it on these networks, and ODUS records it only from payments taken through PayPal, so a card whose network reference came from another gateway is declined.","examples":[false]}},"required":["type","environment","clientId","secretKey","integrationMode","collectShippingAddress","cardProcessing"],"additionalProperties":false}],"description":"Gateway-specific configuration. The schema depends on the `integration` field: use StripeConfigDTO for Stripe, AdyenConfigDTO for Adyen, CheckoutConfigDTO for Checkout, and PaypalConfigDTO for PayPal."}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods","configuration"]},"CascadePartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the cascade"},"name":{"type":"string","examples":["My Cascade"]},"description":{"type":["string","null"],"examples":["Simple cascade"]},"active":{"type":"boolean","description":"Whether the cascade is active and available for routing","examples":[true]},"algorithm":{"type":"string","enum":["roundRobin","weightedRoundRobin","priorityQueue"],"description":"The algorithm used for gateway selection. Available options: roundRobin, weightedRoundRobin, priorityQueue","examples":["weightedRoundRobin"]}},"required":["createdAt","updatedAt","id","name","description","active","algorithm"]},"CascadeDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the cascade"},"name":{"type":"string","examples":["My Cascade"]},"description":{"type":["string","null"],"examples":["Simple cascade"]},"active":{"type":"boolean","description":"Whether the cascade is active and available for routing","examples":[true]},"algorithm":{"type":"string","enum":["roundRobin","weightedRoundRobin","priorityQueue"],"description":"The algorithm used for gateway selection. Available options: roundRobin, weightedRoundRobin, priorityQueue","examples":["weightedRoundRobin"]},"gateways":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the cascade gateway entry"},"profile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"The gateway profile associated with this cascade entry"},"position":{"type":"number","description":"Order in which this gateway is tried in the cascade","examples":[1]},"weight":{"description":"Relative weight for weighted routing algorithms","type":["number","null"],"examples":[80]},"transactionLimit":{"description":"Maximum transaction amount this gateway can process","type":["number","null"],"examples":[100]},"transactionLimitCounter":{"description":"Current counter value for the transaction limit","type":"number","examples":[0]},"transactionLimitPeriod":{"description":"Time period for the transaction limit","type":["string","null"],"enum":["day","week","month",null],"examples":["day"]},"isTransactionLimitExhausted":{"type":"boolean","description":"Whether the transaction limit has been reached for the current period","examples":[false]},"transactionCap":{"description":"Maximum number of transactions in a period","type":["number","null"],"examples":[10000]},"transactionCapCounter":{"description":"Current counter value for the transaction cap","type":"number","examples":[0]},"transactionCapPeriod":{"description":"Time period for the transaction cap","type":["string","null"],"enum":["day","week","month",null],"examples":["month"]},"isTransactionCapExhausted":{"type":"boolean","description":"Whether the transaction cap has been reached for the current period","examples":[false]}},"required":["createdAt","updatedAt","id","profile","position","weight","transactionLimit","transactionLimitCounter","transactionLimitPeriod","isTransactionLimitExhausted","transactionCap","transactionCapCounter","transactionCapPeriod","isTransactionCapExhausted"],"additionalProperties":false},"description":"The list of gateway profiles configured for this cascade"},"lastAttempted":{"description":"The cascade gateway entry that was last attempted for routing","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the last-used cascade gateway entry"}},"required":["createdAt","updatedAt","id"],"additionalProperties":false},"lastBilled":{"description":"The cascade gateway entry that last successfully processed a payment","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the last-used cascade gateway entry"}},"required":["createdAt","updatedAt","id"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","name","description","active","algorithm","gateways","lastAttempted","lastBilled"]},"PaymentMethodDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"]},"PriceDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the price","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"type":{"type":"string","enum":["one_time","recurring"],"description":"Type of the price","examples":["recurring"]},"active":{"type":"boolean","description":"Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the price. Only available from the dashboard or the API using a secret key.","examples":["My Digital Subscription"]},"amount":{"type":"number","description":"Amount of the price in minor units (e.g., cents)","examples":[1500]},"quantity":{"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.","examples":[1]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the price","examples":["usd"]},"product":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","metadata","id","active","name","description","statementDescriptor","statementDescriptorSuffix","category","shippable","sku"],"additionalProperties":false,"description":"The product that this price represents. Only available from the dashboard or the API using a secret key."},"billingSchedule":{"deprecated":true,"description":"Deprecated: Use recurringSchedule instead. Billing schedule for `recurring` prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the billing schedule","examples":["bsch_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing schedule","examples":["usd"]},"cycleDefinitions":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"position":{"type":"number","description":"Position of the billing cycle in the schedule. Used for ordering.","examples":[1]},"amount":{"type":"number","description":"Amount to be charged for this billing cycle in minor units (e.g., cents)","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing cycle","examples":["usd"]},"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Unit of time for the billing cycle interval"},"intervalValue":{"type":"number","description":"Value of the billing cycle interval"}},"required":["createdAt","updatedAt","metadata","position","amount","currency","intervalUnit","intervalValue"],"additionalProperties":false}}},"required":["createdAt","updatedAt","metadata","id","currency","cycleDefinitions"],"additionalProperties":false},"recurringSchedule":{"description":"Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details when present","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"],"additionalProperties":false}},"required":["intervalUnit","intervalCount","trial"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","type","active","amount","quantity","currency"]},"PricePartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the price","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"type":{"type":"string","enum":["one_time","recurring"],"description":"Type of the price","examples":["recurring"]},"active":{"type":"boolean","description":"Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the price. Only available from the dashboard or the API using a secret key.","examples":["My Digital Subscription"]},"amount":{"type":"number","description":"Amount of the price in minor units (e.g., cents)","examples":[1500]},"quantity":{"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.","examples":[1]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the price","examples":["usd"]},"product":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","metadata","id","active","name","description","statementDescriptor","statementDescriptorSuffix","category","shippable","sku"],"additionalProperties":false,"description":"The product that this price represents. Only available from the dashboard or the API using a secret key."},"recurringSchedule":{"description":"Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details when present","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"],"additionalProperties":false}},"required":["intervalUnit","intervalCount","trial"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","type","active","amount","quantity","currency"]},"CustomerDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"]},"CustomerPartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender"]},"EntityRemovedDTO":{"type":"object","properties":{"deleted":{"type":"boolean","description":"Whether the entity was deleted or not","examples":[true]}},"required":["deleted"]},"CustomerBlacklistDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the customer blacklist entry"},"email":{"type":"string","description":"Email address of the blacklisted customer","examples":["user@example.com"]},"reason":{"description":"Reason for blacklisting this customer","type":["string","null"],"examples":["Fraudulent activity detected"]}},"required":["createdAt","updatedAt","id","email","reason"]},"EventDTO":{"type":"object","properties":{"id":{"type":"string","description":"ID of the event. Stable across reads.","examples":["evt_2c9NxQ3jSVWpaAqEbTORrivRV20"]},"type":{"type":"string","enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"],"description":"What happened, named with the same vocabulary as the webhook event types: the object it concerns, then the change.","examples":["payment.captured"]},"createdAt":{"description":"When it happened.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"subjectType":{"type":"string","enum":["payment","transaction","customer","blacklist","subscription","invoice","product","price"],"description":"The kind of object the event was recorded against, read from the prefix of `subjectId`. A capture or refund that failed at the processor is recorded on the `transaction` that attempted it rather than on its payment.","examples":["payment"]},"subjectId":{"type":"string","description":"ID of the object the event was recorded against.","examples":["pay_2c9NxQ3jSVWpaAqEbTORrivRV20"]},"details":{"description":"Curated context for the event, read from what it recorded. Which keys appear depends on `type`; every value is an id, an enum, an amount in minor units, an ISO 8601 date or a message safe to show. Populated for `payment.*` and `transaction.*` events — pass a payment and its transactions together as `subjectId[in][]` to read a payment’s whole history. `payment.created`: `amount`, `currency`, `initiator`, `captureMethod`, `customer`, `paymentMethod`. `payment.updated`: whichever of `amount`, `captureMethod`, `customer`, `paymentMethod` changed. `payment.requires_action`: `transaction`. `payment.attempt_failed`: `transaction` when the attempt reached a processor, `declineCode`, `declineType`, `message`. `payment.succeeded`: `transaction`, and `captureAt` when the capture is scheduled. `payment.captured` and `payment.reversed`: `amount` — the amount captured or refunded *by this event*, not the running total — and `transaction`. `payment.cancelled`: `cancellationReason`. Every payment event that names a `transaction`, and the two `transaction.*` types, also carry what that transaction went through, as it is now: `gatewayProfile`, `gatewayProfileTitle` and `integration` for the processor; `paymentMethod` and `paymentMethodType`, with `cardBrand` and `cardLastFour` for a card and `applePayDisplayName` for Apple Pay. These are omitted when the transaction can no longer be read. `null` when the event carries no context — always for `payment.chargebacked`, and for every event of a customer, subscription, invoice, product, price or blacklist entry, whose `details` are not yet projected.","type":["object","null"],"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":["string","null"],"enum":[null]}]},"examples":[{"amount":500,"transaction":"tx_2c9NxQ3jSVWpaAqEbTORrivRV20","gatewayProfile":"gwp_2c9NxQ3jSVWpaAqEbTORrivRV20","gatewayProfileTitle":"Stripe","integration":"stripe","paymentMethod":"pm_2c9NxQ3jSVWpaAqEbTORrivRV20","paymentMethodType":"card","cardBrand":"visa","cardLastFour":"4242"}]}},"required":["id","type","createdAt","subjectType","subjectId","details"]},"GatewayOperationDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the gateway operation"},"type":{"type":"string","enum":["authorize","capture","refund","void","confirm","create_apple_pay_session","process_webhook"],"description":"The type of operation performed against the payment service provider","examples":["authorize"]},"status":{"type":"string","enum":["pending","completed"],"description":"Current status of the gateway operation","examples":["completed"]},"amount":{"description":"Operation amount in minor currency units (e.g., 1500 for $15.00)","type":["number","null"],"examples":[1500]},"currency":{"description":"Currency of the operation","type":["string","null"],"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk",null],"examples":["usd"]},"processorId":{"description":"The external identifier returned by the payment service provider. Only available from the dashboard.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"processorResponse":{"description":"The raw response returned by the payment service provider. A string where the provider answered with a non-JSON body. May contain redacted card data for PCI compliance. Only available from the dashboard.","anyOf":[{"anyOf":[{"type":"object","additionalProperties":true},{"type":"string"}]},{"type":"null"}]},"request":{"description":"The sanitized request sent to the payment service provider. May contain redacted sensitive data for PCI compliance. Only available from the dashboard.","type":["object","null"],"properties":{"requestUrl":{"type":"string"},"method":{"type":"string"},"requestHeaders":{"type":"object","additionalProperties":true},"requestBody":{"type":["object","null"],"additionalProperties":true}},"required":["requestUrl","method","requestBody"],"additionalProperties":false},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"transaction":{"description":"The ID of the transaction this operation belongs to","type":["string","null"]}},"required":["createdAt","updatedAt","id","type","status","amount","currency","transaction"]},"InvoiceDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the invoice"},"status":{"type":"string","enum":["open","paid","voided"],"description":"The status of the invoice","examples":["open"]},"voidedReason":{"description":"The reason for voiding the invoice","type":["string","null"],"examples":["Grace period expired"]},"comment":{"description":"An optional comment for the invoice","type":["string","null"],"examples":["This is a comment for the invoice"]},"amount":{"type":"number","description":"The intended amount to pay for the invoice. The actual amount paid can differ if retrying with a percentage discount, in which case the actual amount paid can be found in `payment.amount`","examples":[999]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"The currency of the amount to be charged","examples":["usd"]},"type":{"type":"string","enum":["setup","recurring"],"description":"Indicates whether the invoice is the one that sets up the subscription, or a recurring one","examples":["setup"]},"number":{"type":"string","description":"Sequential, unique, and human-readable number of the invoice","examples":["2W12-1004"]},"subscription":{"type":["string","null"],"description":"The ID of the subscription associated with this invoice"},"customer":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender"],"additionalProperties":false,"description":"The customer associated with this invoice"},"payment":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"id":{"type":"string","description":"ID of the payment","examples":["pay_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["open","requires_action","succeeded","cancelled"],"description":"Status of the payment","examples":["succeeded"]},"displayStatus":{"type":"string","enum":["retrying","chargeback","reversed","cancelled","partially_reversed","succeeded","uncaptured","incomplete","failed","unattempted"],"description":"A user-friendly aggregate status for display purposes","examples":["succeeded"]},"amount":{"type":"number","description":"Payment amount in minor currency, e.g. 1500 for 15.00 USD","examples":[1500]},"note":{"description":"Optional note for the payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["This is a note for the payment"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the payment","examples":["usd"]},"amountReversed":{"type":"number","description":"Amount reversed for the payment","examples":[0]},"amountCaptured":{"type":"number","description":"Amount captured for the payment","examples":[1500]},"isCaptured":{"type":"boolean","description":"Indicates if the payment has been captured","examples":[true]},"isRedirectRequired":{"type":"boolean","description":"Indicates if a redirect is required for the payment","examples":[false]},"isReversed":{"type":"boolean","description":"Indicates if the payment has been partially reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Indicates if the payment has been fully reversed","examples":[false]},"isRecovered":{"type":"boolean","description":"Whether the payment recovered after one or more retry attempts and eventually succeeded.","examples":[true]},"isRetrying":{"type":"boolean","description":"Whether the payment is currently in a retrying state after a failed attempt.","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether a chargeback has been recorded for this payment. Only available from the dashboard or the API using a secret key.","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"authorizedAt":{"description":"The timestamp when an authorization was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"capturedAt":{"description":"The timestamp when a capture was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:35:00.000Z"]},"reversedAt":{"description":"The timestamp when a reversal was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-20T14:00:00.000Z"]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the payment, indicating who initiated the payment.","examples":["customer"]},"offSessionType":{"description":"The off-session type of the payment. Only present for merchant-initiated payments.","type":["string","null"],"enum":["recurring","unscheduled",null],"examples":["recurring"]},"statementDescriptor":{"description":"Statement to be shown on bank statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Some product"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"latestMessage":{"description":"Latest message available for the payment. This message is non-sensitive and may be displayed to the customer.","type":["string","null"],"examples":["Payment was declined by the issuing bank."]},"latestDeclineType":{"description":"The decline type for the latest transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null],"examples":["hard_decline"]},"action":{"description":"The action that needs to be taken for this payment, e.g. redirecting the customer to a payment gateway.","type":["object","null"],"properties":{"redirectUrl":{"type":"string","description":"URL to redirect the customer to for completing payment authentication (e.g., 3D Secure)","examples":["https://example.com"]}},"required":["redirectUrl"],"additionalProperties":false},"checkoutKey":{"type":"string","description":"The checkout key for this payment, used for client-side payment processing by the Checkout SDK.","examples":["ck_live_abc123def456"]},"metadata":{"description":"Metadata for the payment.","type":["object","null"],"additionalProperties":true,"examples":[{}]},"attribution":{"description":"Attribution data for marketing tracking, including UTM parameters and platform click IDs.","type":["object","null"],"properties":{"utm_source":{"description":"Traffic source (platform/site)","type":["string","null"],"examples":["google"]},"utm_medium":{"description":"Marketing medium/channel","type":["string","null"],"examples":["cpc"]},"utm_campaign":{"description":"Campaign name/identifier","type":["string","null"],"examples":["summer_sale"]},"utm_term":{"description":"Paid search keywords","type":["string","null"],"examples":["running+shoes"]},"utm_content":{"description":"Differentiates ads/links","type":["string","null"],"examples":["banner_a"]},"utm_id":{"description":"Used in URLs to assign a unique identifier or numerical ID to a specific marketing campaign","type":["string","null"],"examples":["utm_123"]},"utm_contentid":{"description":"Content ID for tracking","type":["string","null"],"examples":["content_123"]},"ref_id":{"description":"Reference ID for tracking","type":["string","null"],"examples":["ref_abc"]},"fbclid":{"description":"Facebook click identifier","type":["string","null"],"examples":["fbclid_abc"]},"cmpid":{"description":"Campaign ID","type":["string","null"],"examples":["cmp_123"]},"sub1":{"description":"Sub-tracking parameter 1","type":["string","null"]},"sub2":{"description":"Sub-tracking parameter 2","type":["string","null"]},"sub3":{"description":"Sub-tracking parameter 3","type":["string","null"]},"sub4":{"description":"Sub-tracking parameter 4","type":["string","null"]},"sub5":{"description":"Sub-tracking parameter 5","type":["string","null"]},"sub6":{"description":"Sub-tracking parameter 6","type":["string","null"]},"sub7":{"description":"Sub-tracking parameter 7","type":["string","null"]},"sub8":{"description":"Sub-tracking parameter 8","type":["string","null"]},"sub9":{"description":"Sub-tracking parameter 9","type":["string","null"]},"sub10":{"description":"Sub-tracking parameter 10","type":["string","null"]}},"additionalProperties":false,"required":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_contentid","ref_id","fbclid","cmpid","sub1","sub2","sub3","sub4","sub5","sub6","sub7","sub8","sub9","sub10"]},"retry":{"description":"Retry details for this payment.","type":["object","null"],"properties":{"attempts":{"type":"number","description":"The number of retry attempts made","examples":[2]},"nextAt":{"description":"The date when the next retry attempt is scheduled","type":["string","null"],"format":"date-time"},"nextAmount":{"description":"The amount to be charged for the next retry attempt","type":["number","null"],"examples":[999]}},"required":["attempts","nextAt","nextAmount"],"additionalProperties":false},"customer":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"],"additionalProperties":false,"description":"Customer associated with the payment"},"paymentMethod":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","metadata","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"Payment method used for the payment. Only available from the dashboard or the API using a secret key."},"latestTransaction":{"description":"The latest transaction for this payment. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the transaction"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"],"description":"Current status of the transaction","examples":["authorized"]},"authentication":{"type":"string","enum":["not_requested","pending","succeeded","failed"],"description":"How far the transaction got through customer authentication — 3-D Secure for a card, the equivalent payer-action step for a redirect-based method. `not_requested` when the gateway never asked for it, so an absent challenge is distinguishable from a failed one.","examples":["not_requested"]},"amount":{"type":"number","description":"Transaction amount in minor currency units (e.g., 1500 for $15.00)","examples":[1500]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the transaction","examples":["customer"]},"statementDescriptor":{"description":"The statement descriptor that will appear on the customer's statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Hello World"]},"statementDescriptorSuffix":{"description":"The statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"amountReversed":{"type":"number","description":"The amount that has been reversed by refunds or voids","examples":[0]},"amountCaptured":{"type":"number","description":"The amount that has been captured","examples":[1500]},"isReversed":{"type":"boolean","description":"Whether the transaction has been reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Whether the transaction has been fully reversed","examples":[false]},"isCaptureFailed":{"type":"boolean","description":"Whether the capture operation failed","examples":[false]},"isReverseFailed":{"type":"boolean","description":"Whether the reverse operation failed","examples":[false]},"isRefundFailed":{"type":"boolean","description":"Whether the refund operation failed","examples":[false]},"isVoidFailed":{"type":"boolean","description":"Whether the void operation failed","examples":[false]},"isCaptured":{"type":"boolean","description":"Whether the transaction has been captured","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether the transaction has a chargeback recorded","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this transaction","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"Capture method used for this transaction","examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable for 'automaticDelayed' capture method.","type":["number","null"],"examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the transaction","examples":["usd"]},"processorId":{"description":"The external transaction ID from the payment processor. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile used for this transaction. Only available from the dashboard or the API using a secret key."},"execution":{"description":"The cascade execution associated with this transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"]},"paymentMethod":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"The payment method used for this transaction"},"customer":{"description":"The ID of the customer associated with this transaction","type":["string","null"]}},"required":["createdAt","updatedAt","id","status","authentication","amount","initiator","amountReversed","amountCaptured","isReversed","isFullyReversed","isCaptureFailed","isReverseFailed","isRefundFailed","isVoidFailed","isCaptured","isChargebacked","captureMethod","captureDelay","currency","paymentMethod","customer"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","status","displayStatus","amount","currency","amountReversed","amountCaptured","isCaptured","isRedirectRequired","isReversed","isFullyReversed","isRecovered","isRetrying","initiator","offSessionType","latestMessage","action","metadata","attribution","customer","latestTransaction"],"additionalProperties":false,"description":"The payment associated with this invoice"}},"required":["createdAt","updatedAt","id","status","voidedReason","comment","amount","currency","type","number","subscription","customer","payment"]},"InvoicePartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the invoice"},"status":{"type":"string","enum":["open","paid","voided"],"description":"The status of the invoice","examples":["open"]},"voidedReason":{"description":"The reason for voiding the invoice","type":["string","null"],"examples":["Grace period expired"]},"comment":{"description":"An optional comment for the invoice","type":["string","null"],"examples":["This is a comment for the invoice"]},"amount":{"type":"number","description":"The intended amount to pay for the invoice. The actual amount paid can differ if retrying with a percentage discount, in which case the actual amount paid can be found in `payment.amount`","examples":[999]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"The currency of the amount to be charged","examples":["usd"]},"type":{"type":"string","enum":["setup","recurring"],"description":"Indicates whether the invoice is the one that sets up the subscription, or a recurring one","examples":["setup"]},"number":{"type":"string","description":"Sequential, unique, and human-readable number of the invoice","examples":["2W12-1004"]},"subscription":{"type":["string","null"],"description":"The ID of the subscription associated with this invoice"},"customer":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender"],"additionalProperties":false,"description":"The customer associated with this invoice"}},"required":["createdAt","updatedAt","id","status","voidedReason","comment","amount","currency","type","number","subscription","customer"]},"MerchantConfigDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the merchant configuration"},"defaultPaymentMethodOptions":{"type":"object","properties":{"captureMethod":{"description":"Capture method for the payment. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":"string","enum":["automatic","automaticDelayed","manual"],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring charges. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring charges. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"card":{"description":"Card-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct","route"],"description":"The processing mode for card payments","examples":["cascade"]},"gatewayProfile":{"description":"Specific gateway profile to use, bypassing cascade routing. Only present if `mode` is `direct`","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false},"cascade":{"description":"The cascade to use for gateway routing. Only present if `mode` is `cascade`","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the cascade"},"name":{"type":"string","examples":["My Cascade"]},"description":{"type":["string","null"],"examples":["Simple cascade"]},"active":{"type":"boolean","description":"Whether the cascade is active and available for routing","examples":[true]},"algorithm":{"type":"string","enum":["roundRobin","weightedRoundRobin","priorityQueue"],"description":"The algorithm used for gateway selection. Available options: roundRobin, weightedRoundRobin, priorityQueue","examples":["weightedRoundRobin"]}},"required":["createdAt","updatedAt","id","name","description","active","algorithm"],"additionalProperties":false},"captureMethod":{"description":"Capture method for card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring charges. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"route":{"description":"The route that chooses the gateway for each card payment when `mode` is `route`. `null` when no route is set.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"name":{"type":"string","examples":["Card routing"]},"description":{"type":["string","null"],"examples":["Sends US-issued cards to a domestic gateway"]},"active":{"type":"boolean","description":"Whether the route is active. A route is available for routing only while it is active and has an active version.","examples":[true]}},"required":["createdAt","updatedAt","id","name","description","active"]}},"required":["mode","gatewayProfile","cascade","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay","route"],"additionalProperties":false},"paypal":{"description":"PayPal-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct"],"description":"Processing mode for PayPal payments, will always be `direct`","examples":["direct"]},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile ID for PayPal processing"},"captureMethod":{"description":"Capture method for PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs for PayPal payments. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring PayPal payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]}},"required":["mode","gatewayProfile","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay"],"additionalProperties":false},"applePay":{"description":"Apple Pay-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct"],"description":"Processing mode for Apple Pay payments, will always be `direct`","examples":["direct"]},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile ID for Apple Pay processing"},"captureMethod":{"description":"Capture method for Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs for Apple Pay payments. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring Apple Pay payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]}},"required":["mode","gatewayProfile","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay"],"additionalProperties":false}},"additionalProperties":false,"description":"Default payment method options for the merchant.","required":["captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay"]},"displayCurrency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Display currency for the merchant. Used in statistics.","examples":["usd"]},"timezone":{"type":"string","description":"Timezone for the merchant, in IANA format.","examples":["UTC"]},"enableRecurringPaymentBundling":{"type":"boolean","description":"Whether to bundle recurring payments for the same customer into a single charge.","examples":[false]},"preferCaptureAtNight":{"type":"boolean","description":"Whether delayed captures should be scheduled at night in the shopper's local time, derived from the UTC offset their browser reported at authorization. Captures fall back to the standard schedule when no offset was reported.","examples":[false]},"blacklistCustomerOnChargeback":{"type":"boolean","description":"Whether recording a chargeback always blacklists the customer. While this is `true`, the `blacklistCustomer` field of a chargeback request is ignored.","examples":[true]},"lineItemDescriptionSource":{"type":"string","enum":["price","product"],"description":"Which name a line item description defaults to when none is supplied on the request: the name of the price it references, or the name of the product behind that price.","examples":["price"]},"relatedSubscriptionWindowMinutes":{"type":"number","description":"How many minutes apart two of the same customer's subscriptions may be created and still be presented as related in the dashboard. 0 disables the time window; subscriptions sharing a setup payment are grouped regardless.","examples":[0]}},"required":["createdAt","updatedAt","id","defaultPaymentMethodOptions","displayCurrency","timezone","enableRecurringPaymentBundling","preferCaptureAtNight","blacklistCustomerOnChargeback","lineItemDescriptionSource","relatedSubscriptionWindowMinutes"]},"RouteExecutionDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route execution","examples":["rtx_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"payment":{"type":"string","description":"The ID of the payment the route was run for","examples":["pay_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"routeVersion":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route version","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a version of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The version's number. A route's first version is 1, and each version published after it counts up by one.","examples":[2]}},"required":["createdAt","updatedAt","id","route","number"],"additionalProperties":false,"description":"The route version that ran. Activating another version later does not change it."},"status":{"type":"string","enum":["processing","completed","failed"],"description":"`processing` while the route is still choosing or trying gateways, `completed` once it has finished, and `failed` if it stopped on an error before finishing.","examples":["completed"]},"outcome":{"description":"How the route ended. `null` while it is `processing`, and when it `failed` before deciding. `not_routed` means no gateway was attempted.","type":["string","null"],"enum":["authorized","pending","declined","unknown","not_routed",null],"examples":["authorized"]},"facts":{"type":"object","properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount of the payment, in minor units","examples":[1000]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"The currency of the payment","examples":["usd"]},"initiator":{"type":"string","description":"Who initiated the payment: `customer` or `merchant`","examples":["customer"]},"card":{"description":"What was known about the card. A condition on a card field that was `null` here had nothing to compare, so it did not match.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card, or `null` when it was not known","type":["string","null"],"examples":["visa"]},"bin":{"description":"The card BIN/IIN (Bank/Issuer Identification Number)","type":["string","null"],"examples":["41472000"]},"issuerName":{"description":"The name of the bank that issued the card, or `null` when it was not known when the payment was routed","type":["string","null"],"examples":["Capital One"]},"issuerCountry":{"description":"The country of the bank that issued the card, as an ISO 3166-1 alpha-2 code, or `null` when it was not known","type":["string","null"],"examples":["US"]},"fundingType":{"description":"How the card is funded: `credit`, `debit`, `prepaid` or `charge`, or `null` when it was not known","type":["string","null"],"examples":["credit"]}},"additionalProperties":false,"required":["brand","bin","issuerName","issuerCountry","fundingType"]},"metadata":{"description":"The payment's metadata values that the route's conditions name, or `null` when they name none. Other metadata is not kept.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"channel":"web"}]},"statementDescriptor":{"description":"The payment's statement descriptor, or `null` when it had none. A condition on `statementDescriptor` did not match a payment without one.","type":["string","null"],"examples":["Some product"]},"statementDescriptorSuffix":{"description":"The payment's statement descriptor suffix, or `null` when it had none. A condition on `statementDescriptorSuffix` did not match a payment without one.","type":["string","null"],"examples":["PRO PLAN"]}},"required":["amount","currency","initiator","card","metadata","statementDescriptor","statementDescriptorSuffix"],"additionalProperties":false,"description":"What the route's conditions were evaluated against. They are fixed when the execution starts."},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the step","examples":["rtxs_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"position":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The place of the step in the order the route reached its nodes, from 0","examples":[0]},"route":{"type":"string","description":"The ID of the route the node belongs to. It differs from the version's route when a `route` node led into another route.","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"path":{"type":"string","description":"Where the node sits in that route's decision tree","examples":["$.branches[0].then.children[1]"]},"result":{"type":"string","enum":["matched","no_match","unknown_fact","skipped","attempted","withheld"],"description":"What happened at the node. `matched`: a condition took the branch in `branch`, or a split took the output in `branch`. `no_match`: the branch in `branch` did not match. `unknown_fact`: the branch could not be decided because the payment lacked the facts in `unknownFields`, so it did not match. `skipped`: the node was passed over for the `reason` given. `attempted`: the payment was sent to `gatewayProfile`. `withheld`: the route stopped before trying `gatewayProfile`, for the `reason` given.","examples":["matched"]},"branch":{"description":"For a condition, the index of the branch, counted from 0, or `else`. For a split, the index of the output the payment took, counted from 0. `null` for other nodes.","type":["string","null"],"examples":["0"]},"reason":{"description":"Why a node was `skipped` or `withheld`; `null` otherwise. New reasons may be added: branch on `result`, and treat a reason you do not recognise as an explanation only. Skipped: `gateway_not_found`, `gateway_inactive`, `gateway_already_attempted`, `passed_over` (an earlier attempt had already moved past the node), `route_not_found`, `route_depth_exceeded`, `no_branch_matched`, `pool_max_attempts`, `attempt_cap`, `evaluation_limit`, `unsupported_node`. Withheld: `unknown_outcome` (the previous attempt got no answer and may have charged the card), `deadline` (too little time was left in the request for another attempt).","type":["string","null"],"examples":["gateway_inactive"]},"gatewayProfile":{"description":"The ID of the gateway profile the node names, or `null` for a node that names none","type":["string","null"],"examples":["gwp_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"transaction":{"description":"For an `attempted` step, the ID of the transaction the attempt created; `null` otherwise, and until the attempt is answered.","type":["string","null"],"examples":["tx_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"attempt":{"description":"For an `attempted` step, which attempt of the execution it was, counted from 1; `null` otherwise.","type":["integer","null"],"minimum":-9007199254740991,"maximum":9007199254740991,"examples":[1]},"outcome":{"description":"For an `attempted` step, what the gateway answered: `authorized`, `declined`, `pending` (waiting on the customer or the gateway, such as 3D Secure) or `unknown` (no answer, so the card may have been charged). `null` otherwise, and while the attempt is in progress.","type":["string","null"],"examples":["declined"]},"unknownFields":{"description":"For an `unknown_fact` step, the fields the condition needed that the payment did not have; `null` otherwise.","type":["array","null"],"items":{"type":"string"},"examples":[["card.issuerName"]]},"unsupportedTerms":{"description":"For an `unknown_fact` step, the parts of the condition that could not be evaluated, as `<field> <operator>`; `null` when there were none.","type":["array","null"],"items":{"type":"string"},"examples":[["card.issuerName startsWith"]]},"remainingBudgetMs":{"description":"For a step withheld for `deadline`, the time left in the request, in milliseconds; `null` otherwise.","type":["number","null"],"examples":[1200]},"targetRoute":{"description":"For a skipped `route` node, the ID of the route it names; `null` otherwise.","type":["string","null"],"examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"reachedAt":{"description":"When the route first reached the node","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"answeredAt":{"description":"For an `attempted` step, when the gateway answered; `null` otherwise, and while the attempt is in progress.","type":["string","null"],"format":"date-time","examples":["2024-02-18T12:00:02Z"]}},"required":["id","position","route","path","result","branch","reason","gatewayProfile","transaction","attempt","outcome","unknownFields","unsupportedTerms","remainingBudgetMs","targetRoute","reachedAt","answeredAt"],"additionalProperties":false},"description":"Every node the route reached, in the order it reached them, with what it decided there. The gateway attempts are the `attempted` steps, in `attempt` order."}},"required":["createdAt","updatedAt","id","payment","routeVersion","status","outcome","facts","steps"]},"RouteEvaluationDTO":{"type":"object","properties":{"route":{"type":"string","description":"The ID of the route that was evaluated","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"routeVersion":{"description":"The ID of the version that was evaluated, or `null` when the request sent its own `tree`","type":["string","null"],"examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"attempts":{"type":"array","items":{"type":"object","properties":{"attempt":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Where the attempt comes in the order, counted from 1","examples":[1]},"gatewayProfile":{"type":"string","description":"The ID of the gateway profile that would be attempted","examples":["gwp_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route the gateway node belongs to","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"path":{"type":"string","description":"Where the gateway node sits in the route's decision tree","examples":["$.branches[0].then.children[1]"]}},"required":["attempt","gatewayProfile","route","path"],"additionalProperties":false},"description":"The gateway profiles the payment would be sent to, in order. Each one is attempted only if every attempt before it declined. Empty when the route would attempt none."},"steps":{"type":"array","items":{"type":"object","properties":{"route":{"type":"string","description":"The ID of the route the node belongs to","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"path":{"type":"string","description":"Where the node sits in the route's decision tree","examples":["$.branches[0].then.children[1]"]},"result":{"type":"string","enum":["matched","no_match","unknown_fact","skipped","attempted","withheld"],"description":"What the route decided at the node. `matched`: a condition took the branch in `branch`. `no_match`: the branch in `branch` did not match. `unknown_fact`: the branch could not be decided because the facts lacked the fields in `unknownFields`, so it did not match. `skipped`: the node was passed over for the `reason` given. `attempted`: the payment would be sent to `gatewayProfile` as attempt number `attempt`. An evaluation never answers `withheld`.","examples":["matched"]},"branch":{"description":"For a condition, the index of the branch, counted from 0, or `else`. `null` for other nodes.","type":["string","null"],"examples":["0"]},"reason":{"description":"Why a node was `skipped`; `null` otherwise. The reasons are those of a route execution step, and new ones may be added: treat a reason you do not recognise as an explanation only.","type":["string","null"],"examples":["gateway_inactive"]},"gatewayProfile":{"description":"The ID of the gateway profile the node names, or `null` for a node that names none","type":["string","null"],"examples":["gwp_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"attempt":{"description":"For an `attempted` step, where the attempt comes in the order, counted from 1; `null` otherwise.","type":["integer","null"],"minimum":-9007199254740991,"maximum":9007199254740991,"examples":[1]},"unknownFields":{"description":"For an `unknown_fact` step, the fields the condition needed that the facts did not have; `null` otherwise.","type":["array","null"],"items":{"type":"string"},"examples":[["card.issuerName"]]},"unsupportedTerms":{"description":"For an `unknown_fact` step, the parts of the condition that could not be evaluated, as `<field> <operator>`; `null` when there were none.","type":["array","null"],"items":{"type":"string"},"examples":[["card.issuerName startsWith"]]},"targetRoute":{"description":"For a skipped `route` node, the ID of the route it names; `null` otherwise.","type":["string","null"],"examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]}},"required":["route","path","result","branch","reason","gatewayProfile","attempt","unknownFields","unsupportedTerms","targetRoute"],"additionalProperties":false},"description":"Every node the route reached, in the order it reached them, with what it decided there."}},"required":["route","routeVersion","attempts","steps"]},"CreateApplePaySessionResponseDTO":{"type":"object","properties":{"sessionData":{"type":"string","description":"Base-64 encoded Apple Pay session data"}},"required":["sessionData"]},"CheckoutDetailsDTO":{"type":"object","properties":{"payment":{"type":"string","description":"ID of the payment associated with this checkout session"},"amount":{"type":"number","description":"Amount in smallest currency unit"},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency code in ISO 4217 format","examples":["usd"]},"countryCode":{"type":"string","description":"Country code in ISO 3166-1 alpha-2 format"},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"List of supported payment method types for this checkout session"},"vgsJwt":{"description":"Short-lived access token the ODUS Checkout SDK uses to collect card details in the browser. The SDK reads it from this response and picks how to collect the card based on whether it is present, so your integration does not need to handle it.","type":"string"}},"required":["payment","amount","currency","countryCode","supportedPaymentMethods"]},"PaymentDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"id":{"type":"string","description":"ID of the payment","examples":["pay_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["open","requires_action","succeeded","cancelled"],"description":"Status of the payment","examples":["succeeded"]},"displayStatus":{"type":"string","enum":["retrying","chargeback","reversed","cancelled","partially_reversed","succeeded","uncaptured","incomplete","failed","unattempted"],"description":"A user-friendly aggregate status for display purposes","examples":["succeeded"]},"amount":{"type":"number","description":"Payment amount in minor currency, e.g. 1500 for 15.00 USD","examples":[1500]},"note":{"description":"Optional note for the payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["This is a note for the payment"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the payment","examples":["usd"]},"amountReversed":{"type":"number","description":"Amount reversed for the payment","examples":[0]},"amountCaptured":{"type":"number","description":"Amount captured for the payment","examples":[1500]},"isCaptured":{"type":"boolean","description":"Indicates if the payment has been captured","examples":[true]},"isRedirectRequired":{"type":"boolean","description":"Indicates if a redirect is required for the payment","examples":[false]},"isReversed":{"type":"boolean","description":"Indicates if the payment has been partially reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Indicates if the payment has been fully reversed","examples":[false]},"isRecovered":{"type":"boolean","description":"Whether the payment recovered after one or more retry attempts and eventually succeeded.","examples":[true]},"isRetrying":{"type":"boolean","description":"Whether the payment is currently in a retrying state after a failed attempt.","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether a chargeback has been recorded for this payment. Only available from the dashboard or the API using a secret key.","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"authorizedAt":{"description":"The timestamp when an authorization was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"capturedAt":{"description":"The timestamp when a capture was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:35:00.000Z"]},"reversedAt":{"description":"The timestamp when a reversal was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-20T14:00:00.000Z"]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the payment, indicating who initiated the payment.","examples":["customer"]},"offSessionType":{"description":"The off-session type of the payment. Only present for merchant-initiated payments.","type":["string","null"],"enum":["recurring","unscheduled",null],"examples":["recurring"]},"statementDescriptor":{"description":"Statement to be shown on bank statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Some product"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"latestMessage":{"description":"Latest message available for the payment. This message is non-sensitive and may be displayed to the customer.","type":["string","null"],"examples":["Payment was declined by the issuing bank."]},"latestDeclineType":{"description":"The decline type for the latest transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null],"examples":["hard_decline"]},"action":{"description":"The action that needs to be taken for this payment, e.g. redirecting the customer to a payment gateway.","type":["object","null"],"properties":{"redirectUrl":{"type":"string","description":"URL to redirect the customer to for completing payment authentication (e.g., 3D Secure)","examples":["https://example.com"]}},"required":["redirectUrl"],"additionalProperties":false},"checkoutKey":{"type":"string","description":"The checkout key for this payment, used for client-side payment processing by the Checkout SDK.","examples":["ck_live_abc123def456"]},"metadata":{"description":"Metadata for the payment.","type":["object","null"],"additionalProperties":true,"examples":[{}]},"attribution":{"description":"Attribution data for marketing tracking, including UTM parameters and platform click IDs.","type":["object","null"],"properties":{"utm_source":{"description":"Traffic source (platform/site)","type":["string","null"],"examples":["google"]},"utm_medium":{"description":"Marketing medium/channel","type":["string","null"],"examples":["cpc"]},"utm_campaign":{"description":"Campaign name/identifier","type":["string","null"],"examples":["summer_sale"]},"utm_term":{"description":"Paid search keywords","type":["string","null"],"examples":["running+shoes"]},"utm_content":{"description":"Differentiates ads/links","type":["string","null"],"examples":["banner_a"]},"utm_id":{"description":"Used in URLs to assign a unique identifier or numerical ID to a specific marketing campaign","type":["string","null"],"examples":["utm_123"]},"utm_contentid":{"description":"Content ID for tracking","type":["string","null"],"examples":["content_123"]},"ref_id":{"description":"Reference ID for tracking","type":["string","null"],"examples":["ref_abc"]},"fbclid":{"description":"Facebook click identifier","type":["string","null"],"examples":["fbclid_abc"]},"cmpid":{"description":"Campaign ID","type":["string","null"],"examples":["cmp_123"]},"sub1":{"description":"Sub-tracking parameter 1","type":["string","null"]},"sub2":{"description":"Sub-tracking parameter 2","type":["string","null"]},"sub3":{"description":"Sub-tracking parameter 3","type":["string","null"]},"sub4":{"description":"Sub-tracking parameter 4","type":["string","null"]},"sub5":{"description":"Sub-tracking parameter 5","type":["string","null"]},"sub6":{"description":"Sub-tracking parameter 6","type":["string","null"]},"sub7":{"description":"Sub-tracking parameter 7","type":["string","null"]},"sub8":{"description":"Sub-tracking parameter 8","type":["string","null"]},"sub9":{"description":"Sub-tracking parameter 9","type":["string","null"]},"sub10":{"description":"Sub-tracking parameter 10","type":["string","null"]}},"additionalProperties":false,"required":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_contentid","ref_id","fbclid","cmpid","sub1","sub2","sub3","sub4","sub5","sub6","sub7","sub8","sub9","sub10"]},"retry":{"description":"Retry details for this payment.","type":["object","null"],"properties":{"attempts":{"type":"number","description":"The number of retry attempts made","examples":[2]},"nextAt":{"description":"The date when the next retry attempt is scheduled","type":["string","null"],"format":"date-time"},"nextAmount":{"description":"The amount to be charged for the next retry attempt","type":["number","null"],"examples":[999]}},"required":["attempts","nextAt","nextAmount"],"additionalProperties":false},"cart":{"description":"Cart associated with the payment, if any","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the cart"},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the cart","examples":["eur"]},"items":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the line item"},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the line item","examples":["usd"]},"description":{"type":"string","description":"Buyer-facing text for the line item. Defaults at creation to the price name or the product name, following the merchant's `lineItemDescriptionSource` setting, and can be overridden per line item.","examples":["Pro Plan"]},"amount":{"type":"number","description":"Amount of the line item in minor units (e.g., cents)","examples":[1500]},"lineAmount":{"type":"number","description":"Line amount of the line item in minor units (e.g., cents), calculated as `amount` * `quantity`","examples":[3000]},"quantity":{"type":"number","description":"Quantity of the line item","examples":[2]},"subscription":{"description":"ID of the subscription this line item started. Set only on the recurring line items of the payment that starts a subscription, shortly after that payment succeeds rather than at the same moment, so it can briefly be empty. Always empty on renewal payments. The `subscription.active` webhook is sent once the subscription exists.","type":["string","null"]},"price":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the price","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"type":{"type":"string","enum":["one_time","recurring"],"description":"Type of the price","examples":["recurring"]},"active":{"type":"boolean","description":"Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the price. Only available from the dashboard or the API using a secret key.","examples":["My Digital Subscription"]},"amount":{"type":"number","description":"Amount of the price in minor units (e.g., cents)","examples":[1500]},"quantity":{"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.","examples":[1]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the price","examples":["usd"]},"product":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","metadata","id","active","name","description","statementDescriptor","statementDescriptorSuffix","category","shippable","sku"],"additionalProperties":false,"description":"The product that this price represents. Only available from the dashboard or the API using a secret key."},"recurringSchedule":{"description":"Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details when present","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"],"additionalProperties":false}},"required":["intervalUnit","intervalCount","trial"],"additionalProperties":false}},"required":["createdAt","updatedAt","metadata","id","type","active","name","amount","quantity","currency","product","recurringSchedule"],"additionalProperties":false,"description":"The price used for this line item. Only available from the dashboard or the API using a secret key."}},"required":["createdAt","updatedAt","id","currency","description","amount","lineAmount","quantity","subscription"],"additionalProperties":false},"description":"List of items in the cart"}},"required":["createdAt","updatedAt","id","currency","items"],"additionalProperties":false},"paymentMethodOptions":{"type":"object","properties":{"captureMethod":{"description":"Capture method for the payment. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":"string","enum":["automatic","automaticDelayed","manual"],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring charges. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring charges. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"card":{"description":"Card-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct","route"],"description":"The processing mode for card payments","examples":["cascade"]},"gatewayProfile":{"description":"Specific gateway profile to use, bypassing cascade routing. Only present if `mode` is `direct`","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false},"cascade":{"description":"The cascade to use for gateway routing. Only present if `mode` is `cascade`","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the cascade"},"name":{"type":"string","examples":["My Cascade"]},"description":{"type":["string","null"],"examples":["Simple cascade"]},"active":{"type":"boolean","description":"Whether the cascade is active and available for routing","examples":[true]},"algorithm":{"type":"string","enum":["roundRobin","weightedRoundRobin","priorityQueue"],"description":"The algorithm used for gateway selection. Available options: roundRobin, weightedRoundRobin, priorityQueue","examples":["weightedRoundRobin"]}},"required":["createdAt","updatedAt","metadata","id","name","description","active","algorithm"],"additionalProperties":false},"captureMethod":{"description":"Capture method for card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring charges. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"route":{"description":"The route that chooses the gateway for each card payment when `mode` is `route`. `null` when no route is set.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"name":{"type":"string","examples":["Card routing"]},"description":{"type":["string","null"],"examples":["Sends US-issued cards to a domestic gateway"]},"active":{"type":"boolean","description":"Whether the route is active. A route is available for routing only while it is active and has an active version.","examples":[true]}},"required":["createdAt","updatedAt","metadata","id","name","description","active"]}},"required":["mode","gatewayProfile","cascade","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay","route"],"additionalProperties":false},"paypal":{"description":"PayPal-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct"],"description":"Processing mode for PayPal payments, will always be `direct`","examples":["direct"]},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile ID for PayPal processing"},"captureMethod":{"description":"Capture method for PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs for PayPal payments. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring PayPal payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]}},"required":["mode","gatewayProfile","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay"],"additionalProperties":false},"applePay":{"description":"Apple Pay-specific processing options","type":["object","null"],"properties":{"mode":{"type":"string","enum":["cascade","direct"],"description":"Processing mode for Apple Pay payments, will always be `direct`","examples":["direct"]},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile ID for Apple Pay processing"},"captureMethod":{"description":"Capture method for Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs for Apple Pay payments. Only applicable when captureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]},"recurringCaptureMethod":{"description":"Capture method to use for recurring Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null],"examples":["automatic"]},"recurringCaptureDelay":{"description":"Delay in days before capture occurs for recurring Apple Pay payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","type":["number","null"],"examples":[7]}},"required":["mode","gatewayProfile","captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay"],"additionalProperties":false}},"additionalProperties":false,"description":"Processing options for the payment. Only available from the dashboard or the API using a secret key.","required":["captureMethod","captureDelay","recurringCaptureMethod","recurringCaptureDelay","card","paypal","applePay"]},"customer":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"],"additionalProperties":false,"description":"Customer associated with the payment"},"paymentMethod":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","metadata","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"Payment method used for the payment. Only available from the dashboard or the API using a secret key."},"latestTransaction":{"description":"The latest transaction for this payment. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the transaction"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"],"description":"Current status of the transaction","examples":["authorized"]},"authentication":{"type":"string","enum":["not_requested","pending","succeeded","failed"],"description":"How far the transaction got through customer authentication — 3-D Secure for a card, the equivalent payer-action step for a redirect-based method. `not_requested` when the gateway never asked for it, so an absent challenge is distinguishable from a failed one.","examples":["not_requested"]},"amount":{"type":"number","description":"Transaction amount in minor currency units (e.g., 1500 for $15.00)","examples":[1500]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the transaction","examples":["customer"]},"statementDescriptor":{"description":"The statement descriptor that will appear on the customer's statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Hello World"]},"statementDescriptorSuffix":{"description":"The statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"amountReversed":{"type":"number","description":"The amount that has been reversed by refunds or voids","examples":[0]},"amountCaptured":{"type":"number","description":"The amount that has been captured","examples":[1500]},"isReversed":{"type":"boolean","description":"Whether the transaction has been reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Whether the transaction has been fully reversed","examples":[false]},"isCaptureFailed":{"type":"boolean","description":"Whether the capture operation failed","examples":[false]},"isReverseFailed":{"type":"boolean","description":"Whether the reverse operation failed","examples":[false]},"isRefundFailed":{"type":"boolean","description":"Whether the refund operation failed","examples":[false]},"isVoidFailed":{"type":"boolean","description":"Whether the void operation failed","examples":[false]},"isCaptured":{"type":"boolean","description":"Whether the transaction has been captured","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether the transaction has a chargeback recorded","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this transaction","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"Capture method used for this transaction","examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable for 'automaticDelayed' capture method.","type":["number","null"],"examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the transaction","examples":["usd"]},"processorId":{"description":"The external transaction ID from the payment processor. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile used for this transaction. Only available from the dashboard or the API using a secret key."},"execution":{"description":"The cascade execution associated with this transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"]},"paymentMethod":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"The payment method used for this transaction"},"customer":{"description":"The ID of the customer associated with this transaction","type":["string","null"]}},"required":["createdAt","updatedAt","id","status","authentication","amount","initiator","amountReversed","amountCaptured","isReversed","isFullyReversed","isCaptureFailed","isReverseFailed","isRefundFailed","isVoidFailed","isCaptured","isChargebacked","captureMethod","captureDelay","currency","paymentMethod","customer"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","status","displayStatus","amount","currency","amountReversed","amountCaptured","isCaptured","isRedirectRequired","isReversed","isFullyReversed","isRecovered","isRetrying","initiator","offSessionType","latestMessage","action","metadata","attribution","cart","customer","latestTransaction"]},"PaymentPartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"id":{"type":"string","description":"ID of the payment","examples":["pay_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["open","requires_action","succeeded","cancelled"],"description":"Status of the payment","examples":["succeeded"]},"displayStatus":{"type":"string","enum":["retrying","chargeback","reversed","cancelled","partially_reversed","succeeded","uncaptured","incomplete","failed","unattempted"],"description":"A user-friendly aggregate status for display purposes","examples":["succeeded"]},"amount":{"type":"number","description":"Payment amount in minor currency, e.g. 1500 for 15.00 USD","examples":[1500]},"note":{"description":"Optional note for the payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["This is a note for the payment"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the payment","examples":["usd"]},"amountReversed":{"type":"number","description":"Amount reversed for the payment","examples":[0]},"amountCaptured":{"type":"number","description":"Amount captured for the payment","examples":[1500]},"isCaptured":{"type":"boolean","description":"Indicates if the payment has been captured","examples":[true]},"isRedirectRequired":{"type":"boolean","description":"Indicates if a redirect is required for the payment","examples":[false]},"isReversed":{"type":"boolean","description":"Indicates if the payment has been partially reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Indicates if the payment has been fully reversed","examples":[false]},"isRecovered":{"type":"boolean","description":"Whether the payment recovered after one or more retry attempts and eventually succeeded.","examples":[true]},"isRetrying":{"type":"boolean","description":"Whether the payment is currently in a retrying state after a failed attempt.","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether a chargeback has been recorded for this payment. Only available from the dashboard or the API using a secret key.","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"authorizedAt":{"description":"The timestamp when an authorization was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"capturedAt":{"description":"The timestamp when a capture was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:35:00.000Z"]},"reversedAt":{"description":"The timestamp when a reversal was recorded for this payment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"format":"date-time","examples":["2026-01-20T14:00:00.000Z"]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the payment, indicating who initiated the payment.","examples":["customer"]},"offSessionType":{"description":"The off-session type of the payment. Only present for merchant-initiated payments.","type":["string","null"],"enum":["recurring","unscheduled",null],"examples":["recurring"]},"statementDescriptor":{"description":"Statement to be shown on bank statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Some product"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"latestMessage":{"description":"Latest message available for the payment. This message is non-sensitive and may be displayed to the customer.","type":["string","null"],"examples":["Payment was declined by the issuing bank."]},"latestDeclineType":{"description":"The decline type for the latest transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null],"examples":["hard_decline"]},"action":{"description":"The action that needs to be taken for this payment, e.g. redirecting the customer to a payment gateway.","type":["object","null"],"properties":{"redirectUrl":{"type":"string","description":"URL to redirect the customer to for completing payment authentication (e.g., 3D Secure)","examples":["https://example.com"]}},"required":["redirectUrl"],"additionalProperties":false},"checkoutKey":{"type":"string","description":"The checkout key for this payment, used for client-side payment processing by the Checkout SDK.","examples":["ck_live_abc123def456"]},"metadata":{"description":"Metadata for the payment.","type":["object","null"],"additionalProperties":true,"examples":[{}]},"attribution":{"description":"Attribution data for marketing tracking, including UTM parameters and platform click IDs.","type":["object","null"],"properties":{"utm_source":{"description":"Traffic source (platform/site)","type":["string","null"],"examples":["google"]},"utm_medium":{"description":"Marketing medium/channel","type":["string","null"],"examples":["cpc"]},"utm_campaign":{"description":"Campaign name/identifier","type":["string","null"],"examples":["summer_sale"]},"utm_term":{"description":"Paid search keywords","type":["string","null"],"examples":["running+shoes"]},"utm_content":{"description":"Differentiates ads/links","type":["string","null"],"examples":["banner_a"]},"utm_id":{"description":"Used in URLs to assign a unique identifier or numerical ID to a specific marketing campaign","type":["string","null"],"examples":["utm_123"]},"utm_contentid":{"description":"Content ID for tracking","type":["string","null"],"examples":["content_123"]},"ref_id":{"description":"Reference ID for tracking","type":["string","null"],"examples":["ref_abc"]},"fbclid":{"description":"Facebook click identifier","type":["string","null"],"examples":["fbclid_abc"]},"cmpid":{"description":"Campaign ID","type":["string","null"],"examples":["cmp_123"]},"sub1":{"description":"Sub-tracking parameter 1","type":["string","null"]},"sub2":{"description":"Sub-tracking parameter 2","type":["string","null"]},"sub3":{"description":"Sub-tracking parameter 3","type":["string","null"]},"sub4":{"description":"Sub-tracking parameter 4","type":["string","null"]},"sub5":{"description":"Sub-tracking parameter 5","type":["string","null"]},"sub6":{"description":"Sub-tracking parameter 6","type":["string","null"]},"sub7":{"description":"Sub-tracking parameter 7","type":["string","null"]},"sub8":{"description":"Sub-tracking parameter 8","type":["string","null"]},"sub9":{"description":"Sub-tracking parameter 9","type":["string","null"]},"sub10":{"description":"Sub-tracking parameter 10","type":["string","null"]}},"additionalProperties":false,"required":["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","utm_contentid","ref_id","fbclid","cmpid","sub1","sub2","sub3","sub4","sub5","sub6","sub7","sub8","sub9","sub10"]},"retry":{"description":"Retry details for this payment.","type":["object","null"],"properties":{"attempts":{"type":"number","description":"The number of retry attempts made","examples":[2]},"nextAt":{"description":"The date when the next retry attempt is scheduled","type":["string","null"],"format":"date-time"},"nextAmount":{"description":"The amount to be charged for the next retry attempt","type":["number","null"],"examples":[999]}},"required":["attempts","nextAt","nextAmount"],"additionalProperties":false},"customer":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"],"additionalProperties":false,"description":"Customer associated with the payment"},"paymentMethod":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","metadata","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"Payment method used for the payment. Only available from the dashboard or the API using a secret key."},"latestTransaction":{"description":"The latest transaction for this payment. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the transaction"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"],"description":"Current status of the transaction","examples":["authorized"]},"authentication":{"type":"string","enum":["not_requested","pending","succeeded","failed"],"description":"How far the transaction got through customer authentication — 3-D Secure for a card, the equivalent payer-action step for a redirect-based method. `not_requested` when the gateway never asked for it, so an absent challenge is distinguishable from a failed one.","examples":["not_requested"]},"amount":{"type":"number","description":"Transaction amount in minor currency units (e.g., 1500 for $15.00)","examples":[1500]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the transaction","examples":["customer"]},"statementDescriptor":{"description":"The statement descriptor that will appear on the customer's statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Hello World"]},"statementDescriptorSuffix":{"description":"The statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"amountReversed":{"type":"number","description":"The amount that has been reversed by refunds or voids","examples":[0]},"amountCaptured":{"type":"number","description":"The amount that has been captured","examples":[1500]},"isReversed":{"type":"boolean","description":"Whether the transaction has been reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Whether the transaction has been fully reversed","examples":[false]},"isCaptureFailed":{"type":"boolean","description":"Whether the capture operation failed","examples":[false]},"isReverseFailed":{"type":"boolean","description":"Whether the reverse operation failed","examples":[false]},"isRefundFailed":{"type":"boolean","description":"Whether the refund operation failed","examples":[false]},"isVoidFailed":{"type":"boolean","description":"Whether the void operation failed","examples":[false]},"isCaptured":{"type":"boolean","description":"Whether the transaction has been captured","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether the transaction has a chargeback recorded","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this transaction","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"Capture method used for this transaction","examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable for 'automaticDelayed' capture method.","type":["number","null"],"examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the transaction","examples":["usd"]},"processorId":{"description":"The external transaction ID from the payment processor. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile used for this transaction. Only available from the dashboard or the API using a secret key."},"execution":{"description":"The cascade execution associated with this transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"]},"paymentMethod":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"The payment method used for this transaction"},"customer":{"description":"The ID of the customer associated with this transaction","type":["string","null"]}},"required":["createdAt","updatedAt","id","status","authentication","amount","initiator","amountReversed","amountCaptured","isReversed","isFullyReversed","isCaptureFailed","isReverseFailed","isRefundFailed","isVoidFailed","isCaptured","isChargebacked","captureMethod","captureDelay","currency","paymentMethod","customer"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","status","displayStatus","amount","currency","amountReversed","amountCaptured","isCaptured","isRedirectRequired","isReversed","isFullyReversed","isRecovered","isRetrying","initiator","offSessionType","latestMessage","action","metadata","attribution","customer","latestTransaction"]},"ProductDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","id","active"]},"RequestLogDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the request log entry","examples":["req_log_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"requestId":{"type":"string","description":"Unique request identifier for correlating log entries","examples":["abc123"]},"url":{"type":"string","description":"The URL path of the API request","examples":["/api/payments"]},"method":{"type":"string","description":"HTTP method of the request","examples":["POST"]},"clientIp":{"description":"IP address of the client that made the request","type":["string","null"],"examples":["192.168.1.1"]},"userAgent":{"description":"User-Agent header from the client request","type":["string","null"],"examples":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"]},"requestHeaders":{"description":"HTTP request headers captured for this log entry","type":["object","null"],"additionalProperties":true},"requestBody":{"description":"The request body payload. May be redacted for PCI compliance.","type":["object","null"],"additionalProperties":true},"responseBody":{"description":"The response body payload. May be redacted for PCI compliance.","type":["object","null"],"additionalProperties":true},"statusCode":{"description":"HTTP response status code","type":["number","null"],"examples":[200]},"initiator":{"description":"The type of access key used to make the request","type":["string","null"]},"credentialId":{"description":"The ID of the credential that authenticated the request. For a key, this is the key's `id`. For a request made from the Dashboard, it is the ID of the signed-in user or of their session. `null` when no credential can be identified: the request carried none, or the entry was recorded before this field was introduced.","type":["string","null"],"examples":["skey_2R6lBd1IxNUPqtsQLcJU2PFtyAD"]},"rejectionReason":{"description":"Why the request was refused because of its credential. `invalid_credential`: the key or session was not accepted, for example because it was deleted, deactivated or has expired. `account_not_entitled`: the credential is valid, but the account does not have access to the API. `null` on every other entry.","type":["string","null"],"enum":["invalid_credential","account_not_entitled",null],"examples":["invalid_credential"]}},"required":["createdAt","updatedAt","id","requestId","url","method","clientIp","userAgent","requestHeaders","requestBody","responseBody","statusCode","initiator","credentialId","rejectionReason"]},"RetryPolicyDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the retry policy"},"title":{"type":"string","description":"Human-readable name for the retry policy","examples":["Default Retry Policy"]},"isEnabled":{"type":"boolean","description":"Whether payment retries are active for this policy","examples":[true]},"steps":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"retryPolicy":{"type":"string","description":"The unique identifier of the parent retry policy"},"position":{"type":"number","description":"Position of this step in the retry sequence (lower = earlier)","examples":[8]},"isEnabled":{"type":"boolean","description":"Whether this retry step is enabled","examples":[true]},"useInitialGateway":{"type":"boolean","description":"Whether to use the same gateway that was used for the initial payment attempt","examples":[true]},"gatewayProfile":{"description":"The ID of the gateway profile to use for this retry step","type":["string","null"]},"priceReductionPercentage":{"type":"number","description":"Percentage to reduce the original price by for this retry attempt (0-100)","examples":[15]},"retryDelay":{"type":"number","description":"Delay in days before this retry step is executed","examples":[3]}},"required":["createdAt","updatedAt","retryPolicy","position","useInitialGateway","gatewayProfile","priceReductionPercentage","retryDelay"],"additionalProperties":false},"description":"The ordered list of retry steps that define the retry strategy"}},"required":["createdAt","updatedAt","id","title","steps"]},"SecretKeyDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"Unique identifier of the secret key","examples":["skey_2R6lBd1IxNUPqtsQLcJU2PFtyAD"]},"maskedValue":{"type":"string","description":"Masked representation of the secret key, showing only the last four characters","examples":["sk_****...a1b2"]},"note":{"type":["string","null"],"description":"User-provided note for identifying this secret key","examples":["Production backend key"]},"permissions":{"type":"array","items":{"type":"string","enum":["customer:read","customer:create","customer:update","customer:manage_restrictions","payment:read","payment:create","payment:authorize","payment:update","payment:capture","payment:reverse","payment:record_chargeback","payment:create_apple_pay_session","price:read","price:create","price:update","price:delete","job:read","product:read","product:create","product:update","secret_key:read","secret_key:create","secret_key:update","secret_key:delete","publishable_key:read","publishable_key:roll","publishable_key:update","invoice:read","invoice:void","gateway_profile:read","gateway_profile:create","gateway_profile:update","gateway_operation:read","customer_blacklist:read","customer_blacklist:create","customer_blacklist:delete","payment_method:read","request_log:read","cascade:read","cascade:create","cascade:update","route:read","route:create","route:update","webhook_subscriber:read","webhook_subscriber:create","webhook_subscriber:update","retry_policy:read","retry_policy:create","retry_policy:update","user:read","user:create","user:update","user:delete","subscription:read","subscription:cancel","subscription:resume","subscription:force_bill","subscription:preview","subscription:update","checkout_profile:read","checkout_profile:create","checkout_profile:update","merchant_config:read","merchant_config:update","search:read","report:read"]},"description":"Permissions of the secret key","examples":[["payment:read","payment:create"]]}},"required":["createdAt","updatedAt","id","maskedValue","note","permissions"]},"SecretKeyWithKeyDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"Unique identifier of the secret key","examples":["skey_2R6lBd1IxNUPqtsQLcJU2PFtyAD"]},"maskedValue":{"type":"string","description":"Masked representation of the secret key, showing only the last four characters","examples":["sk_****...a1b2"]},"note":{"type":["string","null"],"description":"User-provided note for identifying this secret key","examples":["Production backend key"]},"permissions":{"type":"array","items":{"type":"string","enum":["customer:read","customer:create","customer:update","customer:manage_restrictions","payment:read","payment:create","payment:authorize","payment:update","payment:capture","payment:reverse","payment:record_chargeback","payment:create_apple_pay_session","price:read","price:create","price:update","price:delete","job:read","product:read","product:create","product:update","secret_key:read","secret_key:create","secret_key:update","secret_key:delete","publishable_key:read","publishable_key:roll","publishable_key:update","invoice:read","invoice:void","gateway_profile:read","gateway_profile:create","gateway_profile:update","gateway_operation:read","customer_blacklist:read","customer_blacklist:create","customer_blacklist:delete","payment_method:read","request_log:read","cascade:read","cascade:create","cascade:update","route:read","route:create","route:update","webhook_subscriber:read","webhook_subscriber:create","webhook_subscriber:update","retry_policy:read","retry_policy:create","retry_policy:update","user:read","user:create","user:update","user:delete","subscription:read","subscription:cancel","subscription:resume","subscription:force_bill","subscription:preview","subscription:update","checkout_profile:read","checkout_profile:create","checkout_profile:update","merchant_config:read","merchant_config:update","search:read","report:read"]},"description":"Permissions of the secret key","examples":[["payment:read","payment:create"]]},"value":{"type":"string","description":"The full secret key value. Only returned once upon creation and cannot be retrieved again","examples":["sk_live_a1b2c3d4e5f6g7h8i9j0"]}},"required":["createdAt","updatedAt","id","maskedValue","note","permissions","value"]},"SubscriptionDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the subscription","examples":["sub_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["active","cancelled"],"description":"The status of the subscription","examples":["active"]},"isRecovering":{"type":"boolean","description":"Whether the subscription is recovering from a failed payment","examples":[false]},"autoBillingEnabled":{"type":"boolean","description":"Whether the subscription is going to be billed automatically","examples":[true]},"autoBillingDisabledAt":{"description":"The date when auto billing was disabled","type":["string","null"],"format":"date-time"},"autoBillingDisabledReason":{"description":"The reason why auto billing was disabled","type":["string","null"],"enum":["recurring_payment_errored","subscription_cancelled","latest_invoice_retrying",null],"examples":["subscription_cancelled"]},"startDate":{"description":"The start date of the subscription","type":"string","format":"date-time"},"endDate":{"description":"The end date of the subscription, if it has ended","type":["string","null"],"format":"date-time"},"cancelAtPeriodEnd":{"type":"boolean","description":"Whether the subscription should be cancelled when current billing cycle ends","examples":[true]},"cancelAtCycle":{"description":"The cycle at whose end the subscription is scheduled to be cancelled, or absent when no cancellation is scheduled. Equals `currentCycle` once `cancelAtPeriodEnd` is true","type":["number","null"],"examples":[2]},"currentCycle":{"type":"number","description":"The current cycle of the subscription, starting from 1","examples":[1]},"currentPeriodStart":{"description":"The start date of the current billing period","type":"string","format":"date-time"},"currentPeriodEnd":{"description":"The end date of the current billing period","type":"string","format":"date-time"},"setupInvoice":{"type":"string","description":"The ID of the invoice that set up the subscription"},"setupLineItem":{"description":"The ID of the line item that set up the subscription","type":["string","null"]},"billingSettings":{"type":"object","properties":{"paymentMethodType":{"type":"string","enum":["card","paypal","applePay"],"description":"The payment method type used for recurring billing"},"gatewayProfile":{"type":"string","description":"The gateway profile used for recurring billing"},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"The capture method used for recurring billing"},"captureDelay":{"description":"The capture delay in days, if applicable","type":["number","null"],"examples":[3]}},"required":["paymentMethodType","gatewayProfile","captureMethod","captureDelay"],"additionalProperties":false,"description":"The billing settings for recurring charges"},"upcomingInvoice":{"description":"The upcoming invoice details","type":["object","null"],"properties":{"amount":{"type":"number","description":"Amount to be charged for the upcoming invoice.","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the upcoming invoice.","examples":["usd"]},"periodStart":{"description":"Start date of the billing period.","type":"string","format":"date-time","examples":["2023-01-01T00:00:00Z"]},"periodEnd":{"description":"End date of the billing period.","type":"string","format":"date-time","examples":["2023-01-31T23:59:59Z"]},"statementDescriptor":{"description":"Statement descriptor for the upcoming invoice.","type":["string","null"],"examples":["SUBSCRIPTION"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the upcoming invoice.","type":["string","null"],"examples":["PRO PLAN"]},"comment":{"description":"Comment for the upcoming invoice.","type":["string","null"],"examples":["Invoice for subscription 123, period January 2023"]}},"required":["amount","currency","periodStart","periodEnd","statementDescriptor","statementDescriptorSuffix","comment"],"additionalProperties":false},"customer":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"],"additionalProperties":false,"description":"The customer associated with the subscription"},"price":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the price","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"type":{"type":"string","enum":["one_time","recurring"],"description":"Type of the price","examples":["recurring"]},"active":{"type":"boolean","description":"Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the price. Only available from the dashboard or the API using a secret key.","examples":["My Digital Subscription"]},"amount":{"type":"number","description":"Amount of the price in minor units (e.g., cents)","examples":[1500]},"quantity":{"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.","examples":[1]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the price","examples":["usd"]},"product":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","metadata","id","active","name","description","statementDescriptor","statementDescriptorSuffix","category","shippable","sku"],"additionalProperties":false,"description":"The product that this price represents. Only available from the dashboard or the API using a secret key."},"billingSchedule":{"deprecated":true,"description":"Deprecated: Use recurringSchedule instead. Billing schedule for `recurring` prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the billing schedule","examples":["bsch_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing schedule","examples":["usd"]},"cycleDefinitions":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"position":{"type":"number","description":"Position of the billing cycle in the schedule. Used for ordering.","examples":[1]},"amount":{"type":"number","description":"Amount to be charged for this billing cycle in minor units (e.g., cents)","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing cycle","examples":["usd"]},"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Unit of time for the billing cycle interval"},"intervalValue":{"type":"number","description":"Value of the billing cycle interval"}},"required":["createdAt","updatedAt","metadata","position","amount","currency","intervalUnit","intervalValue"],"additionalProperties":false}}},"required":["createdAt","updatedAt","metadata","id","currency","cycleDefinitions"],"additionalProperties":false},"recurringSchedule":{"description":"Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details when present","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"],"additionalProperties":false}},"required":["intervalUnit","intervalCount","trial"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","type","active","amount","quantity","currency"],"additionalProperties":false,"description":"The price details of the subscription"},"cancellationReason":{"description":"Why the subscription was cancelled. `requested`: you cancelled it. `payment_failed`: a renewal payment failed and could not be recovered. `chargeback`: one of its payments was charged back. `customer_blacklisted`: you blacklisted the customer's email. `null` while the subscription is active, and for subscriptions cancelled before this field was introduced.","type":["string","null"],"enum":["requested","payment_failed","chargeback","customer_blacklisted",null],"examples":["customer_blacklisted"]}},"required":["createdAt","updatedAt","id","status","isRecovering","autoBillingEnabled","autoBillingDisabledAt","autoBillingDisabledReason","startDate","endDate","cancelAtPeriodEnd","cancelAtCycle","currentCycle","currentPeriodStart","currentPeriodEnd","setupInvoice","setupLineItem","billingSettings","upcomingInvoice","customer","price","cancellationReason"]},"SubscriptionPartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the subscription","examples":["sub_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["active","cancelled"],"description":"The status of the subscription","examples":["active"]},"isRecovering":{"type":"boolean","description":"Whether the subscription is recovering from a failed payment","examples":[false]},"autoBillingEnabled":{"type":"boolean","description":"Whether the subscription is going to be billed automatically","examples":[true]},"autoBillingDisabledAt":{"description":"The date when auto billing was disabled","type":["string","null"],"format":"date-time"},"autoBillingDisabledReason":{"description":"The reason why auto billing was disabled","type":["string","null"],"enum":["recurring_payment_errored","subscription_cancelled","latest_invoice_retrying",null],"examples":["subscription_cancelled"]},"startDate":{"description":"The start date of the subscription","type":"string","format":"date-time"},"endDate":{"description":"The end date of the subscription, if it has ended","type":["string","null"],"format":"date-time"},"cancelAtPeriodEnd":{"type":"boolean","description":"Whether the subscription should be cancelled when current billing cycle ends","examples":[true]},"cancelAtCycle":{"description":"The cycle at whose end the subscription is scheduled to be cancelled, or absent when no cancellation is scheduled. Equals `currentCycle` once `cancelAtPeriodEnd` is true","type":["number","null"],"examples":[2]},"currentCycle":{"type":"number","description":"The current cycle of the subscription, starting from 1","examples":[1]},"currentPeriodStart":{"description":"The start date of the current billing period","type":"string","format":"date-time"},"currentPeriodEnd":{"description":"The end date of the current billing period","type":"string","format":"date-time"},"setupInvoice":{"type":"string","description":"The ID of the invoice that set up the subscription"},"setupLineItem":{"description":"The ID of the line item that set up the subscription","type":["string","null"]},"billingSettings":{"type":"object","properties":{"paymentMethodType":{"type":"string","enum":["card","paypal","applePay"],"description":"The payment method type used for recurring billing"},"gatewayProfile":{"type":"string","description":"The gateway profile used for recurring billing"},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"The capture method used for recurring billing"},"captureDelay":{"description":"The capture delay in days, if applicable","type":["number","null"],"examples":[3]}},"required":["paymentMethodType","gatewayProfile","captureMethod","captureDelay"],"additionalProperties":false,"description":"The billing settings for recurring charges"},"upcomingInvoice":{"description":"The upcoming invoice details","type":["object","null"],"properties":{"amount":{"type":"number","description":"Amount to be charged for the upcoming invoice.","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the upcoming invoice.","examples":["usd"]},"periodStart":{"description":"Start date of the billing period.","type":"string","format":"date-time","examples":["2023-01-01T00:00:00Z"]},"periodEnd":{"description":"End date of the billing period.","type":"string","format":"date-time","examples":["2023-01-31T23:59:59Z"]},"statementDescriptor":{"description":"Statement descriptor for the upcoming invoice.","type":["string","null"],"examples":["SUBSCRIPTION"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the upcoming invoice.","type":["string","null"],"examples":["PRO PLAN"]},"comment":{"description":"Comment for the upcoming invoice.","type":["string","null"],"examples":["Invoice for subscription 123, period January 2023"]}},"required":["amount","currency","periodStart","periodEnd","statementDescriptor","statementDescriptorSuffix","comment"],"additionalProperties":false},"customer":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]},"billingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The billing address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":"object","properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"additionalProperties":false,"description":"The shipping address of the customer","required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender","billingAddress","shippingAddress"],"additionalProperties":false,"description":"The customer associated with the subscription"},"price":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the price","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"type":{"type":"string","enum":["one_time","recurring"],"description":"Type of the price","examples":["recurring"]},"active":{"type":"boolean","description":"Indicates if the price is currently active. Inactive prices will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the price. Only available from the dashboard or the API using a secret key.","examples":["My Digital Subscription"]},"amount":{"type":"number","description":"Amount of the price in minor units (e.g., cents)","examples":[1500]},"quantity":{"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so a line item referencing this price gets this quantity at a per-unit amount of `amount / quantity`.","examples":[1]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the price","examples":["usd"]},"product":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the product","examples":["prod_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Indicates if the product is currently active. Inactive products will be hidden from the dashboard, but can still be used in the API.","examples":[true]},"name":{"type":"string","description":"Name of the product. Only available from the dashboard or the API using a secret key.","examples":["My product"]},"description":{"description":"Description of the product. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Best selling product"]},"statementDescriptor":{"description":"Statement descriptor for the product that will be used in the bank statement","type":["string","null"],"examples":["Face Yoga subscription"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the product, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"category":{"description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment. Only available from the dashboard or the API using a secret key.","type":["string","null"],"enum":["digital","physical",null],"examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Only available from the dashboard or the API using a secret key.","examples":[false]},"sku":{"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships: an item without one is kept on the order but never fulfilled. Null when the product has none. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["FY-YOGA-MAT-01"]}},"required":["createdAt","updatedAt","metadata","id","active","name","description","statementDescriptor","statementDescriptorSuffix","category","shippable","sku"],"additionalProperties":false,"description":"The product that this price represents. Only available from the dashboard or the API using a secret key."},"billingSchedule":{"deprecated":true,"description":"Deprecated: Use recurringSchedule instead. Billing schedule for `recurring` prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the billing schedule","examples":["bsch_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing schedule","examples":["usd"]},"cycleDefinitions":{"type":"array","items":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"position":{"type":"number","description":"Position of the billing cycle in the schedule. Used for ordering.","examples":[1]},"amount":{"type":"number","description":"Amount to be charged for this billing cycle in minor units (e.g., cents)","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the billing cycle","examples":["usd"]},"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Unit of time for the billing cycle interval"},"intervalValue":{"type":"number","description":"Value of the billing cycle interval"}},"required":["createdAt","updatedAt","metadata","position","amount","currency","intervalUnit","intervalValue"],"additionalProperties":false}}},"required":["createdAt","updatedAt","metadata","id","currency","cycleDefinitions"],"additionalProperties":false},"recurringSchedule":{"description":"Recurring schedule for recurring prices. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details when present","type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"],"description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units. This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"],"additionalProperties":false}},"required":["intervalUnit","intervalCount","trial"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","type","active","amount","quantity","currency"],"additionalProperties":false,"description":"The price details of the subscription"},"cancellationReason":{"description":"Why the subscription was cancelled. `requested`: you cancelled it. `payment_failed`: a renewal payment failed and could not be recovered. `chargeback`: one of its payments was charged back. `customer_blacklisted`: you blacklisted the customer's email. `null` while the subscription is active, and for subscriptions cancelled before this field was introduced.","type":["string","null"],"enum":["requested","payment_failed","chargeback","customer_blacklisted",null],"examples":["customer_blacklisted"]}},"required":["createdAt","updatedAt","id","status","isRecovering","autoBillingEnabled","autoBillingDisabledAt","autoBillingDisabledReason","startDate","endDate","cancelAtPeriodEnd","cancelAtCycle","currentCycle","currentPeriodStart","currentPeriodEnd","setupInvoice","setupLineItem","billingSettings","upcomingInvoice","customer","price","cancellationReason"]},"UpdatePreviewDTO":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the preview","examples":["sub_preview_2pKw553IpHphT79MHhZh8jEf2cT"]},"subscription":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the subscription","examples":["sub_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"price":{"type":"string","description":"The ID of the price associated with the subscription"},"currentCycle":{"type":"number","description":"The current cycle of the subscription, starting from 1","examples":[1]},"currentPeriodStart":{"description":"The start date of the current period","type":"string","format":"date-time"},"currentPeriodEnd":{"description":"The end date of the current period","type":"string","format":"date-time"},"upcomingInvoice":{"type":"object","properties":{"amount":{"type":"number","description":"Amount to be charged for the upcoming invoice.","examples":[1500]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the upcoming invoice.","examples":["usd"]},"periodStart":{"description":"Start date of the billing period.","type":"string","format":"date-time","examples":["2023-01-01T00:00:00Z"]},"periodEnd":{"description":"End date of the billing period.","type":"string","format":"date-time","examples":["2023-01-31T23:59:59Z"]},"statementDescriptor":{"description":"Statement descriptor for the upcoming invoice.","type":["string","null"],"examples":["SUBSCRIPTION"]},"statementDescriptorSuffix":{"description":"Statement descriptor suffix for the upcoming invoice.","type":["string","null"],"examples":["PRO PLAN"]},"comment":{"description":"Comment for the upcoming invoice.","type":["string","null"],"examples":["Invoice for subscription 123, period January 2023"]}},"required":["amount","currency","periodStart","periodEnd","statementDescriptor","statementDescriptorSuffix","comment"],"additionalProperties":false,"description":"The upcoming invoice details"}},"required":["id","price","currentCycle","currentPeriodStart","currentPeriodEnd","upcomingInvoice"],"additionalProperties":false,"description":"How subscription will be updated, if the preview is applied"},"previewValidUntil":{"description":"The date until the preview is valid.","type":"string","format":"date-time"}},"required":["id","subscription","previewValidUntil"]},"RelatedSubscriptionsDTO":{"type":"object","properties":{"windowMinutes":{"type":"number","description":"The merchant's configured grouping window, in minutes, that this lookup applied. `0` means only the setup payment was used.","examples":[0]},"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the related subscription","examples":["sub_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"status":{"type":"string","enum":["active","cancelled"],"description":"The status of the related subscription","examples":["active"]},"cancelAtPeriodEnd":{"type":"boolean","description":"Whether the related subscription is cancelled when its current billing cycle ends","examples":[false]},"cancelAtCycle":{"type":["number","null"],"description":"The cycle at whose end the related subscription is scheduled to be cancelled, or `null` when no cancellation is scheduled","examples":[2]},"createdAt":{"description":"When the related subscription was created","type":"string","format":"date-time"},"createdAtDeltaSeconds":{"type":"number","description":"Seconds between the creation of the subscription being viewed and this one. Negative when this one was created first.","examples":[42]},"amount":{"type":"number","description":"Amount charged each billing cycle, in cents. `0` marks a free subscription — the case this grouping exists to surface.","examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"The currency of the recurring amount","examples":["usd"]},"priceName":{"type":"string","description":"The name of the price the related subscription bills on","examples":["Monthly membership"]},"productName":{"type":"string","description":"The name of the product behind that price","examples":["Membership"]},"matchedOn":{"type":"string","enum":["setup_payment","creation_window"],"description":"Why this subscription is part of the group: it shares the viewed subscription’s setup payment, or it was created within the merchant’s configured window","examples":["setup_payment"]}},"required":["id","status","cancelAtPeriodEnd","cancelAtCycle","createdAt","createdAtDeltaSeconds","amount","currency","priceName","productName","matchedOn"],"additionalProperties":false},"description":"The other subscriptions of the same customer that belong to the same purchase, oldest first"}},"required":["windowMinutes","subscriptions"]},"TransactionDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the transaction"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"],"description":"Current status of the transaction","examples":["authorized"]},"authentication":{"type":"string","enum":["not_requested","pending","succeeded","failed"],"description":"How far the transaction got through customer authentication — 3-D Secure for a card, the equivalent payer-action step for a redirect-based method. `not_requested` when the gateway never asked for it, so an absent challenge is distinguishable from a failed one.","examples":["not_requested"]},"amount":{"type":"number","description":"Transaction amount in minor currency units (e.g., 1500 for $15.00)","examples":[1500]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the transaction","examples":["customer"]},"statementDescriptor":{"description":"The statement descriptor that will appear on the customer's statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Hello World"]},"statementDescriptorSuffix":{"description":"The statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"amountReversed":{"type":"number","description":"The amount that has been reversed by refunds or voids","examples":[0]},"amountCaptured":{"type":"number","description":"The amount that has been captured","examples":[1500]},"isReversed":{"type":"boolean","description":"Whether the transaction has been reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Whether the transaction has been fully reversed","examples":[false]},"isCaptureFailed":{"type":"boolean","description":"Whether the capture operation failed","examples":[false]},"isReverseFailed":{"type":"boolean","description":"Whether the reverse operation failed","examples":[false]},"isRefundFailed":{"type":"boolean","description":"Whether the refund operation failed","examples":[false]},"isVoidFailed":{"type":"boolean","description":"Whether the void operation failed","examples":[false]},"isCaptured":{"type":"boolean","description":"Whether the transaction has been captured","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether the transaction has a chargeback recorded","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this transaction","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"Capture method used for this transaction","examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable for 'automaticDelayed' capture method.","type":["number","null"],"examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the transaction","examples":["usd"]},"processorId":{"description":"The external transaction ID from the payment processor. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"payment":{"type":"string","description":"The ID of the payment this transaction belongs to"},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile used for this transaction. Only available from the dashboard or the API using a secret key."},"execution":{"description":"The cascade execution associated with this transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"]},"paymentMethod":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"The payment method used for this transaction"},"customer":{"type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the customer","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"email":{"type":"string","description":"The email of the customer","examples":["user@gmail.com"]},"name":{"description":"The name of the customer","type":["string","null"],"examples":["John Doe"]},"phoneNumber":{"description":"The phone number of the customer. Numbers submitted since normalisation began are stored in E.164 format (`+` followed by digits) when they could be validated; any other number is returned as it was sent.","type":["string","null"],"examples":["+12015550123"]},"dateOfBirth":{"description":"The date of birth of the customer","type":["string","null"],"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","examples":["2020-01-01"]},"gender":{"description":"The gender of the customer","type":["string","null"],"enum":["male","female","other",null],"examples":["male"]},"restrictMit":{"type":"boolean","description":"Whether the customer is restricted from making merchant-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictCit":{"type":"boolean","description":"Whether the customer is restricted from making customer-initiated payments. Only available from the dashboard or the API using a secret key.","examples":[false]},"restrictReason":{"description":"Reason for restricting the customer. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Customer restricted due to suspicious activity"]},"isRestricted":{"type":"boolean","description":"Whether the customer has at least one restriction applied (either `restrictMit` or `restrictCit`). Only available from the dashboard or the API using a secret key.","examples":[true]}},"required":["createdAt","updatedAt","id","email","name","phoneNumber","dateOfBirth","gender"],"additionalProperties":false,"description":"The customer associated with this transaction"}},"required":["createdAt","updatedAt","id","status","authentication","amount","initiator","amountReversed","amountCaptured","isReversed","isFullyReversed","isCaptureFailed","isReverseFailed","isRefundFailed","isVoidFailed","isCaptured","isChargebacked","captureMethod","captureDelay","currency","payment","paymentMethod","customer"]},"TransactionPartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the transaction"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"],"description":"Current status of the transaction","examples":["authorized"]},"authentication":{"type":"string","enum":["not_requested","pending","succeeded","failed"],"description":"How far the transaction got through customer authentication — 3-D Secure for a card, the equivalent payer-action step for a redirect-based method. `not_requested` when the gateway never asked for it, so an absent challenge is distinguishable from a failed one.","examples":["not_requested"]},"amount":{"type":"number","description":"Transaction amount in minor currency units (e.g., 1500 for $15.00)","examples":[1500]},"initiator":{"type":"string","enum":["customer","merchant"],"description":"The initiator of the transaction","examples":["customer"]},"statementDescriptor":{"description":"The statement descriptor that will appear on the customer's statement. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["Hello World"]},"statementDescriptorSuffix":{"description":"The statement descriptor suffix, appended to your account's descriptor by gateways that support a per-payment suffix. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["PRO PLAN"]},"amountReversed":{"type":"number","description":"The amount that has been reversed by refunds or voids","examples":[0]},"amountCaptured":{"type":"number","description":"The amount that has been captured","examples":[1500]},"isReversed":{"type":"boolean","description":"Whether the transaction has been reversed","examples":[false]},"isFullyReversed":{"type":"boolean","description":"Whether the transaction has been fully reversed","examples":[false]},"isCaptureFailed":{"type":"boolean","description":"Whether the capture operation failed","examples":[false]},"isReverseFailed":{"type":"boolean","description":"Whether the reverse operation failed","examples":[false]},"isRefundFailed":{"type":"boolean","description":"Whether the refund operation failed","examples":[false]},"isVoidFailed":{"type":"boolean","description":"Whether the void operation failed","examples":[false]},"isCaptured":{"type":"boolean","description":"Whether the transaction has been captured","examples":[true]},"isChargebacked":{"type":"boolean","description":"Whether the transaction has a chargeback recorded","examples":[false]},"chargebackRecordedAt":{"description":"The timestamp when a chargeback was recorded for this transaction","type":["string","null"],"format":"date-time","examples":["2026-01-15T10:30:00.000Z"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"],"description":"Capture method used for this transaction","examples":["automatic"]},"captureDelay":{"description":"Delay in days before capture occurs. Only applicable for 'automaticDelayed' capture method.","type":["number","null"],"examples":[0]},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"description":"Currency of the transaction","examples":["usd"]},"processorId":{"description":"The external transaction ID from the payment processor. Only available from the dashboard or the API using a secret key.","type":["string","null"],"examples":["ch_1J8lZpJ9j1bSv2Jr6sVjXZ1N"]},"outcome":{"description":"Outcome details from the gateway operation. Only available from the dashboard or the API using a secret key.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"errorMessage":{"type":["string","null"]},"safeErrorMessage":{"type":["string","null"]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"retryStrategy":{"type":["string","null"],"enum":["never_retry","retry_with_new_payment_method","retry_after_delay","retry_immediately",null]},"specialCode":{"type":["string","null"],"enum":["confirmation_requested",null]},"authCode":{"type":["string","null"]},"processorCode":{"type":["string","null"]},"processorMessage":{"type":["string","null"]}},"required":["status","errorCode","errorMessage","safeErrorMessage","declineType","retryStrategy","specialCode","authCode","processorCode","processorMessage"],"additionalProperties":false},"payment":{"type":"string","description":"The ID of the payment this transaction belongs to"},"gatewayProfile":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"ID of the Gateway Profile","examples":["gwp_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"active":{"type":"boolean","description":"Whether the gateway profile is active and available for processing","examples":[true]},"title":{"type":"string","description":"Title of the Gateway Profile","examples":["Profile #1"]},"integration":{"type":"string","enum":["stripe","adyen","checkout","paypal"],"description":"Associated Gateway Integration","examples":["stripe"]},"environment":{"description":"The environment the gateway profile operates in","type":["string","null"],"enum":["live","test",null],"examples":["test"]},"supportedPaymentMethods":{"type":"array","items":{"type":"string","enum":["card","paypal","applePay"]},"description":"Supported payment methods for the Gateway Profile"}},"required":["createdAt","updatedAt","metadata","id","active","title","integration","environment","supportedPaymentMethods"],"additionalProperties":false,"description":"Gateway profile used for this transaction. Only available from the dashboard or the API using a secret key."},"execution":{"description":"The cascade execution associated with this transaction. Only available from the dashboard or the API using a secret key.","type":["string","null"]},"paymentMethod":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The ID of the payment method","examples":["pm_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"type":{"type":"string","enum":["card","paypal","applePay"],"description":"The type of the payment method","examples":["card"]},"customer":{"type":["string","null"],"description":"The ID of the customer who this payment method belongs to","examples":["cus_2QC7PqoUeOxQEWscJJt6B3PkvyL"]},"isDefault":{"type":"boolean","description":"Whether the payment method is the default one for the customer","examples":[false]},"card":{"description":"The card details of the payment method. Set only when `type` is `card`.","type":["object","null"],"properties":{"brand":{"description":"The brand of the card","type":["string","null"],"enum":["visa","mastercard","amex","discover",null],"examples":["amex"]},"lastFour":{"type":"string","description":"The last four digits of the card","examples":["1234"]},"bin":{"type":"string","description":"The card BIN/IIN (Bank/Issuer Identification Number) - 4 to 8 digits","examples":["123456"]},"expMonth":{"description":"The expiration month of the card (in MM format)","type":["string","null"],"examples":["12"]},"expYear":{"description":"The expiration year of the card (in YYYY format)","type":["string","null"],"examples":["2025"]},"cardholderName":{"description":"The name on the card","type":["string","null"],"examples":["John Doe"]}},"required":["brand","lastFour","bin","expMonth","expYear","cardholderName"],"additionalProperties":false},"applePay":{"description":"The Apple Pay details of the payment method. Set only when `type` is `applePay`.","type":["object","null"],"properties":{"displayName":{"description":"The display name of the Apple Pay payment method","type":["string","null"],"examples":["MasterCard 1234"]}},"additionalProperties":false,"required":["displayName"]}},"required":["createdAt","updatedAt","id","type","customer","isDefault","card","applePay"],"additionalProperties":false,"description":"The payment method used for this transaction"},"customer":{"description":"The ID of the customer associated with this transaction","type":["string","null"]}},"required":["createdAt","updatedAt","id","status","authentication","amount","initiator","amountReversed","amountCaptured","isReversed","isFullyReversed","isCaptureFailed","isReverseFailed","isRefundFailed","isVoidFailed","isCaptured","isChargebacked","captureMethod","captureDelay","currency","payment","paymentMethod","customer"]},"WebhookResponseDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the webhook delivery"},"success":{"type":"boolean","description":"Whether the webhook delivery was successful"},"url":{"type":"string","description":"The URL the webhook was delivered to"},"attempts":{"type":"number","description":"Number of delivery attempts made"},"latestResponseStatus":{"description":"HTTP status code from the latest delivery attempt","type":["number","null"]},"firstDispatchedAt":{"description":"Timestamp of the first delivery attempt","type":["string","null"],"format":"date-time"},"lastDispatchedAt":{"description":"Timestamp of the most recent delivery attempt","type":["string","null"],"format":"date-time"},"abandonedAt":{"description":"Timestamp at which this delivery was abandoned without ever succeeding, because it stayed undelivered past the delivery deadline — typically because the subscriber was left inactive. Null for deliveries that succeeded, that failed after exhausting their retries, or that are still in flight.","type":["string","null"],"format":"date-time"},"subscriber":{"type":"string","description":"The ID of the webhook subscriber"},"event":{"type":"object","properties":{"id":{"type":"string","description":"The unique identifier of the event"},"type":{"type":"string","enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"],"description":"The event type"}},"required":["id","type"],"additionalProperties":false,"description":"The event that triggered this delivery"}},"required":["createdAt","updatedAt","id","success","url","attempts","latestResponseStatus","firstDispatchedAt","lastDispatchedAt","abandonedAt","subscriber","event"]},"WebhookSubscriberDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the webhook subscriber"},"active":{"type":"boolean","description":"Whether the webhook subscriber is active and will receive events","examples":[true]},"recipientUrl":{"type":"string","description":"The URL where webhook events will be delivered via HTTP POST","examples":["https://my-backend.com/webhooks"]},"subscribedTo":{"type":"array","items":{"type":"string","enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"]},"description":"The list of event types this subscriber receives webhooks for. Covers lifecycle events for customers, subscriptions, payments, transactions, invoices, products, and prices.","examples":[["customer.created","customer.updated"]]},"payloadVersion":{"type":"number","enum":[1,2],"description":"The version of the webhook payload this subscriber receives. It was set when the subscriber was created and cannot be changed afterwards, so a later change to the payload never alters what this subscriber is sent.","examples":[1]}},"required":["createdAt","updatedAt","id","active","recipientUrl","subscribedTo","payloadVersion"]},"WebhookSubscriberWithSecretDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the webhook subscriber"},"active":{"type":"boolean","description":"Whether the webhook subscriber is active and will receive events","examples":[true]},"recipientUrl":{"type":"string","description":"The URL where webhook events will be delivered via HTTP POST","examples":["https://my-backend.com/webhooks"]},"subscribedTo":{"type":"array","items":{"type":"string","enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"]},"description":"The list of event types this subscriber receives webhooks for. Covers lifecycle events for customers, subscriptions, payments, transactions, invoices, products, and prices.","examples":[["customer.created","customer.updated"]]},"payloadVersion":{"type":"number","enum":[1,2],"description":"The version of the webhook payload this subscriber receives. It was set when the subscriber was created and cannot be changed afterwards, so a later change to the payload never alters what this subscriber is sent.","examples":[1]},"sharedSecret":{"type":"string","description":"The shared secret used to verify webhook signatures. Only returned once upon creation and cannot be retrieved again.","examples":["218f5208d105f754025bb5cfa6b6aefd"]}},"required":["createdAt","updatedAt","id","active","recipientUrl","subscribedTo","payloadVersion","sharedSecret"]},"CalendarDataDTO":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date for the calendar entry","examples":["2025-09-02T19:25:42.282Z"]},"upcomingRecurringPayments":{"type":"number","description":"Count of upcoming recurring payments for this date","examples":[5]},"upcomingRetries":{"type":"number","description":"Count of upcoming retries for this date","examples":[2]},"successfulRebills":{"type":"number","description":"Count of successful rebills for this date","examples":[3]},"softDeclines":{"type":"number","description":"Count of soft declines for this date","examples":[1]},"hardDeclines":{"type":"number","description":"Count of rebills for this date that will not recover on their own: the payment method was refused outright, or no authorization was attempted against it at all. It spans more than one decline type, so filtering the payment list on a single latestDeclineType value returns fewer payments than this count.","examples":[0]}},"required":["date","upcomingRecurringPayments","upcomingRetries","successfulRebills","softDeclines","hardDeclines"],"additionalProperties":false},"description":"Date for the calendar entry"}},"required":["data"]},"CustomerValueReportResponseDTO":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["USD"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["eur"]},"fcQuantity":{"description":"Number of first-charge conversions","type":"number","examples":[150]},"fcAmount":{"description":"Total first-charge amount (in display currency)","type":"number","examples":[30000]},"fcAov":{"description":"Average order value for first-charge payments (in display currency)","type":"number","examples":[200]},"upsellsQuantity":{"description":"Number of upsell transactions","type":"number","examples":[45]},"upsellsItemsCount":{"description":"Total number of line items across upsell transactions. May exceed `upsellsQuantity` when upsells contain multiple line items.","type":"number","examples":[72]},"upsellsAmount":{"description":"Total upsell amount (in display currency)","type":"number","examples":[9000]},"upsellsAov":{"description":"Average order value for upsell transactions (in display currency)","type":"number","examples":[200]},"totalAov":{"description":"Overall average order value including first-charges and upsells (in display currency)","type":"number","examples":[260]},"rebillsQuantity":{"description":"Number of rebill transactions","type":"number","examples":[300]},"rebillsItemsCount":{"description":"Total number of line items across rebill transactions. May exceed `rebillsQuantity` when rebills contain multiple line items.","type":"number","examples":[480]},"rebillsAmount":{"description":"Total rebill amount (in display currency)","type":"number","examples":[60000]},"ltv":{"description":"Customer lifetime value (in display currency)","type":"number","examples":[660]}},"additionalProperties":false,"required":["groupBy"]},"description":"Report data rows grouped by the specified field"},"total":{"description":"Aggregated totals across all groups (only present when withTotal is enabled)","type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["USD"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["eur"]},"fcQuantity":{"description":"Number of first-charge conversions","type":"number","examples":[150]},"fcAmount":{"description":"Total first-charge amount (in display currency)","type":"number","examples":[30000]},"fcAov":{"description":"Average order value for first-charge payments (in display currency)","type":"number","examples":[200]},"upsellsQuantity":{"description":"Number of upsell transactions","type":"number","examples":[45]},"upsellsItemsCount":{"description":"Total number of line items across upsell transactions. May exceed `upsellsQuantity` when upsells contain multiple line items.","type":"number","examples":[72]},"upsellsAmount":{"description":"Total upsell amount (in display currency)","type":"number","examples":[9000]},"upsellsAov":{"description":"Average order value for upsell transactions (in display currency)","type":"number","examples":[200]},"totalAov":{"description":"Overall average order value including first-charges and upsells (in display currency)","type":"number","examples":[260]},"rebillsQuantity":{"description":"Number of rebill transactions","type":"number","examples":[300]},"rebillsItemsCount":{"description":"Total number of line items across rebill transactions. May exceed `rebillsQuantity` when rebills contain multiple line items.","type":"number","examples":[480]},"rebillsAmount":{"description":"Total rebill amount (in display currency)","type":"number","examples":[60000]},"ltv":{"description":"Customer lifetime value (in display currency)","type":"number","examples":[660]}},"additionalProperties":false}},"required":["data"]},"PaymentSummaryReportResponseDTO":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["USD"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["eur"]},"fcPaymentsCount":{"description":"Number of first-charge payments classified as approved, failed, or incomplete","type":"number","examples":[42]},"fcSuccessfulCount":{"description":"Number of successful first-charge payments","type":"number","examples":[35]},"fcSuccessfulItemCount":{"description":"Total number of line items across successful first-charge payments. May exceed `fcSuccessfulCount` when payments contain multiple line items.","type":"number","examples":[58]},"fcIncompleteCount":{"description":"Number of first-charge payments still awaiting the customer on a redirect (`displayStatus` `incomplete`)","type":"number","examples":[3]},"fcFailedCount":{"description":"Number of first-charge payments classified as failed: the latest attempt carries a declineType, whatever it says (including a payment you cancelled afterwards), or the payment ended in a failed state without one — an attempt that never got an answer, or a redirect the customer did not complete","type":"number","examples":[4]},"fcRevenue":{"description":"Total revenue from first-charge payments (in display currency)","type":"number","examples":[15000]},"fcApprovalRate":{"description":"Approval rate for first-charge payments: approved / (approved + failed), as a percentage. Approved excludes chargebacks, unlike `fcSuccessfulCount`.","type":"number","examples":[89.74]},"recurringPaymentsCount":{"description":"Number of recurring payments classified as approved or declined","type":"number","examples":[120]},"recurringSuccessfulCount":{"description":"Number of successful recurring payments","type":"number","examples":[110]},"recurringSuccessfulItemCount":{"description":"Total number of line items across successful recurring payments. May exceed `recurringSuccessfulCount` when payments contain multiple line items.","type":"number","examples":[185]},"recurringDeclinedCount":{"description":"Number of recurring payments whose latest attempt carries a declineType, whatever it says — a refusal, an unresolved processor outcome, or a payment never authorized against the payment method — including those still being retried","type":"number","examples":[10]},"recurringRevenue":{"description":"Total revenue from recurring payments (in display currency)","type":"number","examples":[45000]},"recurringApprovalRate":{"description":"Approval rate for recurring payments: successful / (successful + declined), as a percentage","type":"number","examples":[91.67]},"refundedPaymentsCount":{"description":"Number of refunded payments","type":"number","examples":[5]},"refundAmount":{"description":"Total refund amount (in display currency)","type":"number","examples":[2500]},"refundPercentage":{"description":"Refund percentage relative to gross revenue","type":"number","examples":[4.17]},"chargebacksCount":{"description":"Number of chargebacked payments","type":"number","examples":[2]},"chargebackAmount":{"description":"Total chargeback amount (in display currency)","type":"number","examples":[1000]},"chargebackPercentage":{"description":"Chargeback percentage relative to gross revenue","type":"number","examples":[1.67]},"fcRefundAmount":{"description":"Total refund amount on first-charge payments (in display currency)","type":"number","examples":[1500]},"fcChargebackAmount":{"description":"Total chargeback amount on first-charge payments (in display currency)","type":"number","examples":[600]},"recurringRefundAmount":{"description":"Total refund amount on recurring payments (in display currency)","type":"number","examples":[1000]},"recurringChargebackAmount":{"description":"Total chargeback amount on recurring payments (in display currency)","type":"number","examples":[400]},"totalGrossRevenue":{"description":"Total gross revenue (in display currency)","type":"number","examples":[60000]},"totalNetRevenue":{"description":"Total net revenue after refunds and chargebacks (in display currency)","type":"number","examples":[56500]}},"additionalProperties":false,"required":["groupBy"]},"description":"Report data rows grouped by the specified field"},"total":{"description":"Aggregated totals across all groups (only present when withTotal is enabled)","type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["USD"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["eur"]},"fcPaymentsCount":{"description":"Number of first-charge payments classified as approved, failed, or incomplete","type":"number","examples":[42]},"fcSuccessfulCount":{"description":"Number of successful first-charge payments","type":"number","examples":[35]},"fcSuccessfulItemCount":{"description":"Total number of line items across successful first-charge payments. May exceed `fcSuccessfulCount` when payments contain multiple line items.","type":"number","examples":[58]},"fcIncompleteCount":{"description":"Number of first-charge payments still awaiting the customer on a redirect (`displayStatus` `incomplete`)","type":"number","examples":[3]},"fcFailedCount":{"description":"Number of first-charge payments classified as failed: the latest attempt carries a declineType, whatever it says (including a payment you cancelled afterwards), or the payment ended in a failed state without one — an attempt that never got an answer, or a redirect the customer did not complete","type":"number","examples":[4]},"fcRevenue":{"description":"Total revenue from first-charge payments (in display currency)","type":"number","examples":[15000]},"fcApprovalRate":{"description":"Approval rate for first-charge payments: approved / (approved + failed), as a percentage. Approved excludes chargebacks, unlike `fcSuccessfulCount`.","type":"number","examples":[89.74]},"recurringPaymentsCount":{"description":"Number of recurring payments classified as approved or declined","type":"number","examples":[120]},"recurringSuccessfulCount":{"description":"Number of successful recurring payments","type":"number","examples":[110]},"recurringSuccessfulItemCount":{"description":"Total number of line items across successful recurring payments. May exceed `recurringSuccessfulCount` when payments contain multiple line items.","type":"number","examples":[185]},"recurringDeclinedCount":{"description":"Number of recurring payments whose latest attempt carries a declineType, whatever it says — a refusal, an unresolved processor outcome, or a payment never authorized against the payment method — including those still being retried","type":"number","examples":[10]},"recurringRevenue":{"description":"Total revenue from recurring payments (in display currency)","type":"number","examples":[45000]},"recurringApprovalRate":{"description":"Approval rate for recurring payments: successful / (successful + declined), as a percentage","type":"number","examples":[91.67]},"refundedPaymentsCount":{"description":"Number of refunded payments","type":"number","examples":[5]},"refundAmount":{"description":"Total refund amount (in display currency)","type":"number","examples":[2500]},"refundPercentage":{"description":"Refund percentage relative to gross revenue","type":"number","examples":[4.17]},"chargebacksCount":{"description":"Number of chargebacked payments","type":"number","examples":[2]},"chargebackAmount":{"description":"Total chargeback amount (in display currency)","type":"number","examples":[1000]},"chargebackPercentage":{"description":"Chargeback percentage relative to gross revenue","type":"number","examples":[1.67]},"fcRefundAmount":{"description":"Total refund amount on first-charge payments (in display currency)","type":"number","examples":[1500]},"fcChargebackAmount":{"description":"Total chargeback amount on first-charge payments (in display currency)","type":"number","examples":[600]},"recurringRefundAmount":{"description":"Total refund amount on recurring payments (in display currency)","type":"number","examples":[1000]},"recurringChargebackAmount":{"description":"Total chargeback amount on recurring payments (in display currency)","type":"number","examples":[400]},"totalGrossRevenue":{"description":"Total gross revenue (in display currency)","type":"number","examples":[60000]},"totalNetRevenue":{"description":"Total net revenue after refunds and chargebacks (in display currency)","type":"number","examples":[56500]}},"additionalProperties":false}},"required":["data"]},"ProjectedBillingReportResponseDTO":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["usd"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["2026-05-21T00:00:00.000Z"]},"rebillsCount":{"description":"Total number of upcoming rebill + recycle attempts in the bucket","type":"number","examples":[128]},"projectedRevenue":{"description":"Projected revenue across all upcoming attempts, in the merchant display currency's minor units (integer). Both rebills and recycles apply the per-attempt approval rate directly.","type":"number","examples":[1834200]},"rebillBucket1Count":{"description":"Number of upcoming Rebill #1 attempts","type":"number"},"rebillBucket1BaseAmount":{"description":"Total invoice amount of upcoming Rebill #1 attempts","type":"number"},"rebillBucket2Count":{"description":"Number of upcoming Rebill #2 attempts","type":"number"},"rebillBucket2BaseAmount":{"description":"Total invoice amount of upcoming Rebill #2 attempts","type":"number"},"rebillBucket3Count":{"description":"Number of upcoming Rebill #3 attempts","type":"number"},"rebillBucket3BaseAmount":{"description":"Total invoice amount of upcoming Rebill #3 attempts","type":"number"},"rebillBucketAdditionalCount":{"description":"Number of upcoming Rebill #4+ (additional) attempts","type":"number"},"rebillBucketAdditionalBaseAmount":{"description":"Total invoice amount of upcoming Rebill #4+ (additional) attempts","type":"number"},"recycleBucket1Count":{"description":"Number of upcoming Recycle #1 attempts","type":"number"},"recycleBucket1BaseAmount":{"description":"Total invoice amount of upcoming Recycle #1 attempts","type":"number"},"recycleBucket2Count":{"description":"Number of upcoming Recycle #2 attempts","type":"number"},"recycleBucket2BaseAmount":{"description":"Total invoice amount of upcoming Recycle #2 attempts","type":"number"},"recycleBucket3Count":{"description":"Number of upcoming Recycle #3 attempts","type":"number"},"recycleBucket3BaseAmount":{"description":"Total invoice amount of upcoming Recycle #3 attempts","type":"number"},"recycleBucketAdditionalCount":{"description":"Number of upcoming Recycle #4+ (additional) attempts","type":"number"},"recycleBucketAdditionalBaseAmount":{"description":"Total invoice amount of upcoming Recycle #4+ (additional) attempts","type":"number"}},"additionalProperties":false,"required":["groupBy"]}},"total":{"type":"object","properties":{"groupBy":{"description":"The value of the groupBy field (field name varies based on groupBy parameter)","type":["string","null"],"examples":["usd"]},"secondaryGroupBy":{"description":"The value of the secondaryGroupBy field (present only when secondaryGroupBy was supplied)","type":["string","null"],"examples":["2026-05-21T00:00:00.000Z"]},"rebillsCount":{"description":"Total number of upcoming rebill + recycle attempts in the bucket","type":"number","examples":[128]},"projectedRevenue":{"description":"Projected revenue across all upcoming attempts, in the merchant display currency's minor units (integer). Both rebills and recycles apply the per-attempt approval rate directly.","type":"number","examples":[1834200]},"rebillBucket1Count":{"description":"Number of upcoming Rebill #1 attempts","type":"number"},"rebillBucket1BaseAmount":{"description":"Total invoice amount of upcoming Rebill #1 attempts","type":"number"},"rebillBucket2Count":{"description":"Number of upcoming Rebill #2 attempts","type":"number"},"rebillBucket2BaseAmount":{"description":"Total invoice amount of upcoming Rebill #2 attempts","type":"number"},"rebillBucket3Count":{"description":"Number of upcoming Rebill #3 attempts","type":"number"},"rebillBucket3BaseAmount":{"description":"Total invoice amount of upcoming Rebill #3 attempts","type":"number"},"rebillBucketAdditionalCount":{"description":"Number of upcoming Rebill #4+ (additional) attempts","type":"number"},"rebillBucketAdditionalBaseAmount":{"description":"Total invoice amount of upcoming Rebill #4+ (additional) attempts","type":"number"},"recycleBucket1Count":{"description":"Number of upcoming Recycle #1 attempts","type":"number"},"recycleBucket1BaseAmount":{"description":"Total invoice amount of upcoming Recycle #1 attempts","type":"number"},"recycleBucket2Count":{"description":"Number of upcoming Recycle #2 attempts","type":"number"},"recycleBucket2BaseAmount":{"description":"Total invoice amount of upcoming Recycle #2 attempts","type":"number"},"recycleBucket3Count":{"description":"Number of upcoming Recycle #3 attempts","type":"number"},"recycleBucket3BaseAmount":{"description":"Total invoice amount of upcoming Recycle #3 attempts","type":"number"},"recycleBucketAdditionalCount":{"description":"Number of upcoming Recycle #4+ (additional) attempts","type":"number"},"recycleBucketAdditionalBaseAmount":{"description":"Total invoice amount of upcoming Recycle #4+ (additional) attempts","type":"number"}},"additionalProperties":false}},"required":["data"]},"SearchResultsDTO":{"type":"object","properties":{"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the matched entity","examples":["pay_2abc3def4ghi5jkl"]},"label":{"type":"string","description":"Primary identifier of the entity (e.g. customer email, payment ID)","examples":["john@example.com"]},"sublabel":{"description":"Secondary context for the entity (e.g. customer name, payment amount)","type":["string","null"],"examples":["John Doe"]},"entityType":{"type":"string","enum":["payment","customer","subscription","invoice","price"],"description":"The type of entity this search result represents"}},"required":["id","label","sublabel","entityType"],"additionalProperties":false},"description":"Matching payment results"},"customers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the matched entity","examples":["pay_2abc3def4ghi5jkl"]},"label":{"type":"string","description":"Primary identifier of the entity (e.g. customer email, payment ID)","examples":["john@example.com"]},"sublabel":{"description":"Secondary context for the entity (e.g. customer name, payment amount)","type":["string","null"],"examples":["John Doe"]},"entityType":{"type":"string","enum":["payment","customer","subscription","invoice","price"],"description":"The type of entity this search result represents"}},"required":["id","label","sublabel","entityType"],"additionalProperties":false},"description":"Matching customer results"},"subscriptions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the matched entity","examples":["pay_2abc3def4ghi5jkl"]},"label":{"type":"string","description":"Primary identifier of the entity (e.g. customer email, payment ID)","examples":["john@example.com"]},"sublabel":{"description":"Secondary context for the entity (e.g. customer name, payment amount)","type":["string","null"],"examples":["John Doe"]},"entityType":{"type":"string","enum":["payment","customer","subscription","invoice","price"],"description":"The type of entity this search result represents"}},"required":["id","label","sublabel","entityType"],"additionalProperties":false},"description":"Matching subscription results"},"invoices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the matched entity","examples":["pay_2abc3def4ghi5jkl"]},"label":{"type":"string","description":"Primary identifier of the entity (e.g. customer email, payment ID)","examples":["john@example.com"]},"sublabel":{"description":"Secondary context for the entity (e.g. customer name, payment amount)","type":["string","null"],"examples":["John Doe"]},"entityType":{"type":"string","enum":["payment","customer","subscription","invoice","price"],"description":"The type of entity this search result represents"}},"required":["id","label","sublabel","entityType"],"additionalProperties":false},"description":"Matching invoice results"},"prices":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the matched entity","examples":["pay_2abc3def4ghi5jkl"]},"label":{"type":"string","description":"Primary identifier of the entity (e.g. customer email, payment ID)","examples":["john@example.com"]},"sublabel":{"description":"Secondary context for the entity (e.g. customer name, payment amount)","type":["string","null"],"examples":["John Doe"]},"entityType":{"type":"string","enum":["payment","customer","subscription","invoice","price"],"description":"The type of entity this search result represents"}},"required":["id","label","sublabel","entityType"],"additionalProperties":false},"description":"Matching price results"}},"required":["payments","customers","subscriptions","invoices","prices"]},"RouteDraftDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the draft","examples":["rtd_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a draft of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"tree":{"type":"object","additionalProperties":true,"description":"The decision tree exactly as it was last saved. It may be incomplete, and no payment is ever routed by it."},"revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The revision of the tree. It goes up each time a save creates or replaces the tree, and a Route never gives the same revision to two drafts, so a draft created after another was published or deleted has a higher revision than it. Send it back as `revision` when you save or publish the draft, so the request is refused if someone else saved, published or deleted the draft in the meantime.","examples":[3]}},"required":["createdAt","updatedAt","id","route","tree","revision"]},"RouteVersionPartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route version","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a version of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The version's number. A route's first version is 1, and each version published after it counts up by one.","examples":[2]}},"required":["createdAt","updatedAt","id","route","number"]},"RouteVersionDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route version","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a version of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The version's number. A route's first version is 1, and each version published after it counts up by one.","examples":[2]},"tree":{"type":"object","additionalProperties":true,"description":"The version's decision tree, exactly as it was published: the same shape as `tree` in Publish a Route version. It never changes once published."}},"required":["createdAt","updatedAt","id","route","number","tree"]},"RoutePartialDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"name":{"type":"string","examples":["Card routing"]},"description":{"type":["string","null"],"examples":["Sends US-issued cards to a domestic gateway"]},"active":{"type":"boolean","description":"Whether the route is active. A route is available for routing only while it is active and has an active version.","examples":[true]},"activeVersion":{"description":"The active version, or `null` until a version is activated","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route version","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a version of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The version's number. A route's first version is 1, and each version published after it counts up by one.","examples":[2]}},"required":["createdAt","updatedAt","id","route","number"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","name","description","active","activeVersion"]},"RouteDTO":{"type":"object","properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"name":{"type":"string","examples":["Card routing"]},"description":{"type":["string","null"],"examples":["Sends US-issued cards to a domestic gateway"]},"active":{"type":"boolean","description":"Whether the route is active. A route is available for routing only while it is active and has an active version.","examples":[true]},"activeVersion":{"description":"The active version, or `null` until a version is activated","type":["object","null"],"properties":{"createdAt":{"description":"The date and time when the entity was created.","type":"string","format":"date-time","examples":["2024-02-18T12:00:00Z"]},"updatedAt":{"description":"The date and time when the entity was last updated.","type":["string","null"],"format":"date-time","examples":["2024-02-21T12:15:00Z"]},"metadata":{"description":"Metadata used by merchants to store additional information about the entity.","type":["object","null"],"additionalProperties":{"type":"string"},"examples":[{"key1":"value1","key2":"value2"}]},"id":{"type":"string","description":"The unique identifier of the route version","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"route":{"type":"string","description":"The ID of the route this is a version of","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The version's number. A route's first version is 1, and each version published after it counts up by one.","examples":[2]},"tree":{"type":"object","additionalProperties":true,"description":"The version's decision tree, exactly as it was published: the same shape as `tree` in Publish a Route version. It never changes once published."}},"required":["createdAt","updatedAt","id","route","number","tree"],"additionalProperties":false}},"required":["createdAt","updatedAt","id","name","description","active","activeVersion"]},"CursorPageMetaDTO":{"type":"object","properties":{"mode":{"default":"cursor","description":"Discriminator identifying cursor-based pagination metadata.","type":"string","enum":["cursor"],"examples":["cursor"]},"pageSize":{"type":"number","minimum":0,"description":"Number of items per page.","examples":[10]},"hasNextPage":{"type":"boolean","description":"Whether a next page exists.","examples":[false]},"hasPreviousPage":{"type":"boolean","description":"Whether a previous page exists.","examples":[true]},"nextCursor":{"description":"Opaque cursor for fetching the next page. Null when there is no next page.","type":["string","null"],"examples":["eyJzIjoiY3JlYXRlZEF0IiwiZCI6ImFzYyIsIm4iOiJmb3J3YXJkIn0"]},"prevCursor":{"description":"Opaque cursor for fetching the previous page. Null when there is no previous page.","type":["string","null"],"examples":["eyJzIjoiY3JlYXRlZEF0IiwiZCI6ImFzYyIsIm4iOiJiYWNrd2FyZCJ9"]},"totalCount":{"description":"Number of items matching this request's filters, ignoring the cursor. Present only when the request sets \"withTotal\". Counting stops at 10000; read \"totalCountIsExact\" before showing this as a total.","type":"number","examples":[139]},"totalCountIsExact":{"description":"Whether \"totalCount\" is the exact number of matching items. False when more items match than counting reaches, in which case \"totalCount\" holds that limit and should be shown as a lower bound, for example \"over 10,000\". Present only when the request sets \"withTotal\".","type":"boolean","examples":[true]}},"required":["mode","pageSize","hasNextPage","hasPreviousPage","nextCursor","prevCursor"]},"CreateCustomerBlacklistDTO":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"The blacklisted email. Stored lowercased.","examples":["user@example.com"]},"reason":{"type":"string"}},"required":["email"]},"CreateCascadeRequestDTO":{"type":"object","properties":{"name":{"type":"string","description":"The cascade's name","examples":["My Cascade"]},"description":{"type":"string","description":"The cascade's description"},"algorithm":{"enum":["roundRobin","weightedRoundRobin","priorityQueue"],"type":"string","description":"The algorithm to be used to route payments in the cascade","examples":["weightedRoundRobin"]},"gateways":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateCascadeGatewayCascadeDTO"},"description":"Gateway profiles that are utilised by the cascade and their configuration"}},"required":["name","algorithm","gateways"]},"CreateCascadeGatewayCascadeDTO":{"type":"object","properties":{"profile":{"type":"string","description":"The gateway profile ID","examples":["gwp_2QUGPTQo8As1cNIvgKlSFDxjJDd"]},"position":{"type":"number","minimum":1,"maximum":10,"description":"The position in which the gateway is used in the cascade, from lowest to highest.","examples":[1]},"weight":{"type":"number","minimum":0,"maximum":100,"description":"The weight of the gateway in the cascade, which represents the percentage of payments that are processed with the gateway. Is required for cascades using the weighted algorithm.","examples":[80]},"transactionLimit":{"type":"number","minimum":1,"description":"The maximum number of transactions allowed in the limit period.","examples":[100]},"transactionLimitPeriod":{"enum":["day","week","month"],"type":"string","description":"The period in which the transaction limit applies. Required if `transactionLimit` is set.","examples":["day"]},"transactionCap":{"type":"number","minimum":1,"description":"The maximum total amount (in minor units) charged in the cap period.","examples":[10000]},"transactionCapPeriod":{"enum":["day","week","month"],"type":"string","description":"The period in which the cap value applies. Required if `transactionCap` is set.","examples":["day"]}},"required":["profile"]},"UpdateCascadeRequestDTO":{"type":"object","properties":{"name":{"type":"string","description":"The cascade's name","examples":["My Cascade"]},"description":{"type":"string","description":"The cascade's description"},"algorithm":{"enum":["roundRobin","weightedRoundRobin","priorityQueue"],"type":"string","description":"The algorithm to be used to route payments in the cascade","examples":["weightedRoundRobin"]},"gateways":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateCascadeGatewayCascadeDTO"},"description":"Gateway profiles that are utilised by the cascade and their configuration"},"active":{"type":"boolean","description":"Whether the cascade is active and available for routing"}}},"CreateAddressDTO":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"companyName":{"type":"string"},"line1":{"type":"string"},"line2":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"postalCode":{"type":"string"},"country":{"type":"string"}}},"UpdateCustomerRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"email":{"type":"string","format":"email","description":"The customer's email. Stored lowercased.","examples":["user@gmail.com"]},"name":{"type":"string","description":"The customer's name","examples":["John Doe"]},"phoneNumber":{"type":"string","description":"The customer's phone number. Stored in E.164 format (`+` followed by digits) when it can be validated as a phone number; a number without a country code is resolved against the billing or shipping address country. A number that cannot be validated is stored as sent.","examples":["+12015550123"]},"dateOfBirth":{"type":"string","format":"date-time","description":"The customer's date of birth","examples":["2020-01-01"]},"gender":{"enum":["male","female","other"],"type":"string","description":"The customer's gender","examples":["male"]},"billingAddress":{"$ref":"#/components/schemas/CreateAddressDTO"},"shippingAddress":{"$ref":"#/components/schemas/CreateAddressDTO"}}},"ManageCustomerRestrictionsRequestDTO":{"type":"object","properties":{"customer":{"type":"string","description":"ID of the customer to manage restrictions for","examples":["cus_2R0uWz4tu9wxTMBXxj9CJfSE9vV"]},"restrictMit":{"type":"boolean","description":"Whether to restrict the customer from making merchant-initiated payments, e.g recurring subscription payments."},"restrictCit":{"type":"boolean","description":"Whether to restrict the customer from making customer-initiated payments, e.g payments made through the Checkout SDK."},"restrictReason":{"type":"string","description":"Reason for restricting the customer.","examples":["The customer is restricted due to compliance issues"]}},"required":["customer"]},"CreateGatewayProfileRequestDTO":{"type":"object","properties":{"title":{"type":"string","description":"Display name for the gateway profile","examples":["Stripe Test mode"]},"integration":{"enum":["stripe","adyen","checkout","paypal"],"type":"string","description":"Gateway integration type","examples":["stripe"]},"configuration":{"description":"Gateway integration configuration","oneOf":[{"$ref":"#/components/schemas/GatewayIntegrationStripeConfigurationDTO"},{"$ref":"#/components/schemas/GatewayIntegrationAdyenConfigurationDTO"},{"$ref":"#/components/schemas/GatewayIntegrationCheckoutConfigurationDTO"},{"$ref":"#/components/schemas/GatewayIntegrationPaypalConfigurationDTO"}]}},"required":["title","integration","configuration"]},"GatewayIntegrationStripeConfigurationDTO":{"type":"object","properties":{"type":{"default":"stripe","enum":["stripe"],"type":"string","description":"Gateway integration type","examples":["stripe"]},"environment":{"enum":["live","test"],"type":"string","description":"Gateway environment","examples":["test"]},"secretKey":{"type":"string","pattern":"sk_(test|live)_.","description":"Stripe secret key","examples":["sk_test_..."]},"webhookSecret":{"type":"string","description":"The secret for validating webhooks (Stripe -> Developer -> Webhooks)","examples":["whsec_w051d0fwarc"]},"useStatementDescriptorSuffix":{"type":"boolean","description":"Whether card payments send the payment's `statementDescriptorSuffix` to Stripe instead of its `statementDescriptor`. Stripe appends the suffix to your account's shortened descriptor, so the statement reads `PREFIX* SUFFIX`. Turn this on if Stripe rejects payments that set a full statement descriptor: newer Stripe accounts accept only the suffix. When it is on, a payment without a suffix uses your Stripe account's descriptor. Defaults to `false`.","examples":[false]}},"required":["type","environment","secretKey"]},"GatewayIntegrationAdyenConfigurationDTO":{"type":"object","properties":{"type":{"default":"adyen","enum":["adyen"],"type":"string","description":"Gateway integration type","examples":["adyen"]},"environment":{"enum":["live","test"],"type":"string","description":"Gateway environment","examples":["test"]},"merchantAccount":{"type":"string","description":"Adyen merchant account name","examples":["MerchantAccountName"]},"apiKey":{"type":"string","description":"Adyen API key","examples":["your-api-key"]},"liveUrlPrefix":{"type":"string","description":"The prefix of the live endpoint URL (Adyen Dashboard -> Developers -> API URLs -> Prefix)","examples":["0b3c1310cad152c9-MyCompany"]},"webhookSecret":{"type":"string","description":"The webhook hmac for validating webhooks (Adyen Dashboard -> Developers -> Webhooks -> Edit -> HMAC Key)","examples":["your-webhook-hmac-from-adyen-dashboard"]}},"required":["type","environment","merchantAccount","apiKey"]},"GatewayIntegrationCheckoutConfigurationDTO":{"type":"object","properties":{"type":{"default":"checkout","enum":["checkout"],"type":"string","description":"Gateway integration type","examples":["checkout"]},"environment":{"enum":["live","test"],"type":"string","description":"Gateway environment","examples":["test"]},"secretKey":{"type":"string","pattern":"^sk_(sbox_)?[a-z0-9]+$","description":"Checkout secret key","examples":["sk_sbox_..."]},"processingChannel":{"type":"string","pattern":"^pc_[a-z0-9]+$","description":"Checkout.com processing channel ID","examples":["pc_..."]},"webhookSecret":{"type":"string","description":"The secret for validating webhooks","examples":["whsec_w051d0fwarc"]},"merchantCity":{"type":"string","description":"Merchant city for billing descriptor","examples":["Tallinn"]}},"required":["type","environment","secretKey","processingChannel"]},"GatewayIntegrationPaypalConfigurationDTO":{"type":"object","properties":{"type":{"default":"paypal","enum":["paypal"],"type":"string","description":"Gateway integration type","examples":["paypal"]},"environment":{"enum":["live","test"],"type":"string","description":"Gateway environment","examples":["test"]},"clientId":{"type":"string","description":"PayPal application client ID","examples":["client-id-from-paypal-app"]},"secretKey":{"type":"string","description":"PayPal application secret key","examples":["secret-key-from-paypal-app"]},"integrationMode":{"enum":["vault","billingAgreement"],"type":"string","description":"Integration mode: \"vault\" uses PayPal Vaulting, \"billingAgreement\" uses Billing Agreements API","examples":["billingAgreement"]},"webhookId":{"type":"string","description":"The Webhook ID from PayPal Dashboard (used for signature verification)","examples":["0NH55953DH663215D"]},"collectShippingAddress":{"type":"boolean","description":"Whether to collect shipping address from PayPal. Only available for Vault integration mode.","examples":[false]},"cardProcessing":{"x-odus-openapi-non-nullable":true,"description":"Whether this profile also accepts card payments, processed by PayPal. Turn it on only after PayPal has enabled card processing on your PayPal account. When it is on, card payment options can use this profile. Card payments on this profile ask for 3-D Secure when the card requires it. Merchant-initiated card payments, such as subscription renewals, are charged from the saved card without 3-D Secure. They are declined when the card has no earlier approved payment with a card network reference, or no known brand. A Mastercard or Discover card is also declined when the date the card network approved that earlier payment is unknown. PayPal requires it on these networks, and ODUS records it only from payments taken through PayPal, so a card whose network reference came from another gateway is declined.","type":["boolean","null"],"examples":[false]}},"required":["type","environment","clientId","secretKey","integrationMode"]},"UpdateGatewayProfileRequestDTO":{"type":"object","properties":{"title":{"type":"string","description":"Display name for the gateway profile","examples":["Stripe Test mode"]},"active":{"type":"boolean","description":"Whether the gateway profile is active","examples":[true]},"configuration":{"description":"Gateway integration configuration (integrationMode cannot be changed for PayPal)","oneOf":[{"$ref":"#/components/schemas/GatewayIntegrationStripeConfigurationDTO"},{"$ref":"#/components/schemas/GatewayIntegrationAdyenConfigurationDTO"},{"$ref":"#/components/schemas/GatewayIntegrationCheckoutConfigurationDTO"},{"$ref":"#/components/schemas/UpdateGatewayIntegrationPaypalConfigurationDTO"}]}}},"UpdateGatewayIntegrationPaypalConfigurationDTO":{"type":"object","properties":{"type":{"default":"paypal","enum":["paypal"],"type":"string","description":"Gateway integration type","examples":["paypal"]},"environment":{"enum":["live","test"],"type":"string","description":"Gateway environment","examples":["test"]},"clientId":{"type":"string","description":"PayPal application client ID","examples":["client-id-from-paypal-app"]},"secretKey":{"type":"string","description":"PayPal application secret key","examples":["secret-key-from-paypal-app"]},"webhookId":{"type":"string","description":"The Webhook ID from PayPal Dashboard (used for signature verification)","examples":["0NH55953DH663215D"]},"collectShippingAddress":{"type":"boolean","description":"Whether to collect shipping address from PayPal. Only available for Vault integration mode.","examples":[false]},"cardProcessing":{"x-odus-openapi-non-nullable":true,"description":"Whether this profile also accepts card payments, processed by PayPal. Turn it on only after PayPal has enabled card processing on your PayPal account. When it is on, card payment options can use this profile. Card payments on this profile ask for 3-D Secure when the card requires it. Merchant-initiated card payments, such as subscription renewals, are charged from the saved card without 3-D Secure. They are declined when the card has no earlier approved payment with a card network reference, or no known brand. A Mastercard or Discover card is also declined when the date the card network approved that earlier payment is unknown. PayPal requires it on these networks, and ODUS records it only from payments taken through PayPal, so a card whose network reference came from another gateway is declined.","type":["boolean","null"],"examples":[false]}},"required":["type","environment","clientId","secretKey"]},"VoidInvoiceRequestDTO":{"type":"object","properties":{"reason":{"default":"No reason provided","type":"string","description":"Reason for voiding the invoice","examples":["Customer requested cancellation"]}}},"UpdateMerchantConfigRequestDTO":{"type":"object","properties":{"defaultPaymentMethodOptions":{"description":"Default payment method options","allOf":[{"$ref":"#/components/schemas/CreatePaymentMethodOptionsDTO"}]},"displayCurrency":{"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"type":"string","description":"Display currency to be used for the merchant. If not provided, will be set to USD.","examples":["usd"]},"timezone":{"type":"string","description":"Timezone for the merchant, in IANA format. If not provided, will be set to UTC.","examples":["Europe/Paris"]},"enableRecurringPaymentBundling":{"type":"boolean","description":"Whether to bundle recurring payments for the same customer into a single charge.","examples":[false]},"preferCaptureAtNight":{"type":"boolean","description":"Whether delayed captures should be scheduled at night in the shopper's local time, derived from the UTC offset their browser reported at authorization. Captures fall back to the standard schedule when no offset was reported.","examples":[false]},"blacklistCustomerOnChargeback":{"type":"boolean","description":"Whether recording a chargeback always blacklists the customer. While this is `true`, the `blacklistCustomer` field of a chargeback request is ignored. If not provided, will be set to true.","examples":[true]},"lineItemDescriptionSource":{"enum":["price","product"],"type":"string","description":"Which name a line item description defaults to when none is supplied on the request: the name of the price it references, or the name of the product behind that price. If not provided, will be set to price.","examples":["price"]},"relatedSubscriptionWindowMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"How many minutes apart two of the same customer's subscriptions may be created and still be presented as related in the dashboard. 0 disables the time window; subscriptions sharing a setup payment are grouped regardless. If not provided, will be set to 0.","examples":[0]}}},"CreatePaymentMethodOptionsDTO":{"type":"object","properties":{"card":{"description":"Card-specific processing options","allOf":[{"$ref":"#/components/schemas/CreateCardPaymentMethodOptionsDTO"}]},"paypal":{"description":"PayPal-specific processing options","allOf":[{"$ref":"#/components/schemas/CreatePaypalPaymentMethodOptionsDTO"}]},"applePay":{"description":"Apple Pay-specific processing options","allOf":[{"$ref":"#/components/schemas/CreateApplePayPaymentMethodOptionsDTO"}]},"captureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Default capture method to use for this payment. If provided on a payment method level, it will override this value."},"captureDelay":{"type":"number","maximum":5,"description":"Default capture delay to use for this payment. If provided on a payment method level, it will override this value."},"recurringCaptureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method to use for recurring charges on this payment. If provided on a payment method level, it will override this value."},"recurringCaptureDelay":{"type":"number","maximum":5,"description":"Capture delay to use for recurring charges on this payment. If provided on a payment method level, it will override this value."}}},"CreateCardPaymentMethodOptionsDTO":{"type":"object","properties":{"mode":{"enum":["cascade","direct","route"],"type":"string","description":"The processing mode for card payments","examples":["cascade"]},"gatewayProfile":{"type":"string","description":"Specific gateway profile to use, bypassing cascade routing. Required for `direct` processing and ignored otherwise"},"cascade":{"type":"string","description":"The cascade to use for gateway routing. Required for `cascade` processing and ignored otherwise"},"captureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method for card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","examples":["automatic"]},"captureDelay":{"type":"number","maximum":5,"description":"Delay in days before capture occurs. Only applicable when captureMethod is 'automaticDelayed'.","examples":[7]},"recurringCaptureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method to use for recurring card payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","examples":["automatic"]},"recurringCaptureDelay":{"type":"number","maximum":5,"description":"Delay in days before capture occurs for recurring card charges. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","examples":[7]},"route":{"type":"string","description":"The route that chooses the gateway for each card payment. Required for `route` processing and ignored otherwise. The route must be active and have an active version.","examples":["rte_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]}}},"CreatePaypalPaymentMethodOptionsDTO":{"type":"object","properties":{"gatewayProfile":{"type":"string","description":"Gateway profile ID for PayPal processing"},"captureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method for PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","examples":["automatic"]},"captureDelay":{"type":"number","maximum":15,"description":"Delay in days before capture occurs for PayPal payments. Only applicable when captureMethod is 'automaticDelayed'.","examples":[7]},"recurringCaptureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method to use for recurring PayPal payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","examples":["automatic"]},"recurringCaptureDelay":{"type":"number","maximum":15,"description":"Delay in days before capture occurs for recurring PayPal payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","examples":[7]}}},"CreateApplePayPaymentMethodOptionsDTO":{"type":"object","properties":{"gatewayProfile":{"type":"string","description":"Gateway profile ID for Apple Pay processing"},"captureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method for Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a configurable delay, 'manual' requires a separate capture request.","examples":["automatic"]},"captureDelay":{"type":"number","maximum":5,"description":"Delay in days before capture occurs for Apple Pay payments. Only applicable when captureMethod is 'automaticDelayed'.","examples":[7]},"recurringCaptureMethod":{"enum":["automatic","automaticDelayed","manual"],"type":"string","description":"Capture method to use for recurring Apple Pay payments. 'automatic' captures immediately, 'automaticDelayed' captures after a delay, 'manual' requires a separate capture request.","examples":["automatic"]},"recurringCaptureDelay":{"type":"number","maximum":5,"description":"Delay in days before capture occurs for recurring Apple Pay payments. Only applicable when recurringCaptureMethod is 'automaticDelayed'.","examples":[7]}}},"CreatePaymentRequestDTO":{"type":"object","properties":{"customer":{"type":"string","description":"ID of the customer associated with the payment","examples":["cus_2R0uWz4tu9wxTMBXxj9CJfSE9vV"]},"customerData":{"description":"Customer data for the payment. Required if customer ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/CreateCustomerDTO"}]},"paymentMethod":{"type":"string","description":"ID of the payment method to use for the payment. Can only be provided at the creation time.","examples":["pm_2RTUw7lL6IuBUwGQOD1EB0OAmx7"]},"paymentMethodData":{"description":"Payment method data for the payment. Required if payment method ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/PaymentCreatePaymentMethodDTO"}]},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"amount":{"type":"number","description":"Payment amount in minor currency, e.g. cents for USD. Required if no `cart` is provided.","examples":[1500]},"note":{"type":"string","description":"Optional note for the payment.","examples":["This is a note for the payment"]},"cart":{"description":"Cart data for the payment. Required if no `amount` is provided.","allOf":[{"$ref":"#/components/schemas/CreatePaymentCartDTO"}]},"currency":{"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"type":"string","description":"Payment currency. Required when no `cart.items` are provided. When `cart.items` are provided, currency is derived from the items and must be the same across all items. Any value supplied here is ignored and stripped when `cart.items` are present.","examples":["usd"]},"paymentMethodOptions":{"description":"Payment method options for the payment.","allOf":[{"$ref":"#/components/schemas/CreatePaymentMethodOptionsDTO"}]},"initiator":{"default":"customer","enum":["customer","merchant"],"type":"string","description":"Determines whether the payment is on- or off-session. Set to `customer` for on-session payments where the customer is actively involved in the payment process, and is ready to provide authentication (e.g., 3D Secure) if required. Set to `merchant` for off-session payments where the customer is not actively involved or is unable to provide authentication at the time of payment. Note that if any authentication is required for an off-session payment, the payment will be declined.","examples":["customer"]},"offSessionType":{"enum":["recurring","unscheduled"],"type":"string","description":"The off-session type for merchant-initiated payments. Only applies when `initiator` is `merchant`; defaults to `unscheduled` if omitted. Null for customer-initiated payments.","examples":["unscheduled"]},"statementDescriptor":{"type":"string","maxLength":22,"description":"Statement descriptor for the payment. Max 22 characters.","examples":["Some statement descriptor"]},"statementDescriptorSuffix":{"type":"string","maxLength":22,"description":"Statement descriptor suffix for the payment, for gateways that append a per-payment suffix to your account's descriptor. Defaults to the product's suffix. Max 22 characters.","examples":["PRO PLAN"]}}},"CreateCustomerDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"email":{"type":"string","format":"email","description":"The customer's email. Stored lowercased.","examples":["user@gmail.com"]},"name":{"type":"string","description":"The customer's name","examples":["John Doe"]},"phoneNumber":{"type":"string","description":"The customer's phone number. Stored in E.164 format (`+` followed by digits) when it can be validated as a phone number; a number without a country code is resolved against the billing or shipping address country. A number that cannot be validated is stored as sent.","examples":["+12015550123"]},"dateOfBirth":{"type":"string","format":"date-time","description":"The customer's date of birth","examples":["2020-01-01"]},"gender":{"enum":["male","female","other"],"type":"string","description":"The customer's gender","examples":["male"]},"billingAddress":{"$ref":"#/components/schemas/CreateAddressDTO"},"shippingAddress":{"$ref":"#/components/schemas/CreateAddressDTO"}},"required":["email"]},"PaymentCreatePaymentMethodDTO":{"type":"object","properties":{"type":{"enum":["card","paypal","applePay"],"type":"string","description":"Payment method type","examples":["card"]},"card":{"description":"Card details. Required when creating a card payment method","allOf":[{"$ref":"#/components/schemas/CreatePaymentMethodCardDTO"}]},"applePay":{"description":"Apple Pay details. Required when creating an Apple Pay payment method","allOf":[{"$ref":"#/components/schemas/CreatePaymentMethodApplePayDTO"}]},"context":{"description":"Context of the successful payment used to create the payment method","allOf":[{"$ref":"#/components/schemas/CreatePaymentContextDTO"}]},"metadata":{"type":"object","additionalProperties":true}},"required":["type"]},"CreatePaymentMethodCardDTO":{"type":"object","properties":{"vgsCardId":{"type":"string","description":"Reference to a card the ODUS Checkout SDK collected in the browser. The SDK sets this field for you — collecting card details yourself is not supported, which is what keeps card numbers off your servers and reduces your PCI DSS scope."},"expMonth":{"type":"string","description":"Expiration month. Optional: when omitted, the expiry stored against `vgsCardId` is used. When both are present the stored expiry wins, so a value sent here is not guaranteed to be kept.","examples":["08"]},"expYear":{"type":"string","description":"Expiration year. Optional: when omitted, the expiry stored against `vgsCardId` is used. When both are present the stored expiry wins, so a value sent here is not guaranteed to be kept.","examples":["2026"]},"cardholderName":{"type":"string","description":"Card holder name","examples":["John Doe"]}},"required":["vgsCardId"]},"CreatePaymentMethodApplePayDTO":{"type":"object","properties":{"paymentData":{"type":"string","description":"Base64-encoded Apple Pay payment data taken from `session.onpaymentauthorized` event from the Apple Pay JS API. Stringify and base64-encode the entire `event.payment.token.paymentData` object."},"displayName":{"type":"string","description":"The display name of the Apple Pay payment method","examples":["MasterCard 1234"]}},"required":["paymentData"]},"CreatePaymentContextDTO":{"type":"object","properties":{"returnUrl":{"type":"string","description":"The URL to return to after the payment process is completed","examples":["https://example.com/return"]},"shopperIp":{"type":"string","description":"The IP address of the shopper. If not provided, will be set to the request IP","examples":["192.168.1.1"]},"userAgent":{"type":"string","description":"The user agent string of the shopper. If not provided, will be set to the request user agent","examples":["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"]},"acceptHeader":{"type":"string","description":"The accept header string of the shopper. If not provided, will be set to the request accept header","examples":["text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"]},"browserInfo":{"description":"Browser information of the shopper","allOf":[{"$ref":"#/components/schemas/CreateBrowserInfoDTO"}]},"attribution":{"description":"Attribution data for marketing tracking","allOf":[{"$ref":"#/components/schemas/CreateAttributionDTO"}]}},"required":["returnUrl"]},"CreateBrowserInfoDTO":{"type":"object","properties":{"language":{"type":"string","description":"The language setting of the browser","examples":["en-US"]},"colorDepth":{"type":"number","description":"Color depth of the browser","examples":[24]},"screenHeight":{"type":"number","description":"Screen height of the browser window in pixels","examples":[1080]},"screenWidth":{"type":"number","description":"Screen width of the browser window in pixels","examples":[1920]},"timeZoneOffset":{"type":"string","description":"Time zone offset in minutes","examples":["-120"]},"javaEnabled":{"type":"boolean","description":"Whether Java is enabled in the browser","examples":[true]}}},"CreateAttributionDTO":{"type":"object","properties":{"utm_source":{"type":"string","maxLength":255,"description":"Traffic source (platform/site)","examples":["google"]},"utm_medium":{"type":"string","maxLength":255,"description":"Marketing medium/channel","examples":["cpc"]},"utm_campaign":{"type":"string","maxLength":255,"description":"Campaign name/identifier","examples":["summer_sale"]},"utm_term":{"type":"string","maxLength":255,"description":"Paid search keywords","examples":["running+shoes"]},"utm_content":{"type":"string","maxLength":255,"description":"Differentiates ads/links","examples":["banner_a"]},"utm_id":{"type":"string","maxLength":255,"description":"Campaign identifier","examples":["utm_123"]},"utm_contentid":{"type":"string","maxLength":255,"description":"Content ID for tracking","examples":["content_123"]},"fbclid":{"type":"string","maxLength":255,"description":"Facebook click identifier","examples":["fbclid_abc"]},"ref_id":{"type":"string","maxLength":255,"description":"Reference ID for tracking","examples":["ref_abc"]},"cmpid":{"type":"string","maxLength":255,"description":"Campaign ID","examples":["cmp_123"]},"sub1":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 1"},"sub2":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 2"},"sub3":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 3"},"sub4":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 4"},"sub5":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 5"},"sub6":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 6"},"sub7":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 7"},"sub8":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 8"},"sub9":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 9"},"sub10":{"type":"string","maxLength":255,"description":"Sub-tracking parameter 10"}}},"CreateCartLineItemDTO":{"type":"object","properties":{"amount":{"type":"number"},"description":{"type":"string","minLength":1,"maxLength":127},"quantity":{"type":"number"},"price":{"type":"string"}},"required":["quantity","price"]},"CreatePaymentCartDTO":{"type":"object","properties":{"items":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateCartLineItemDTO"}}},"required":["items"]},"UpdatePaymentRequestDTO":{"type":"object","properties":{"customer":{"type":"string","description":"ID of the customer associated with the payment","examples":["cus_2R0uWz4tu9wxTMBXxj9CJfSE9vV"]},"customerData":{"description":"Customer data for the payment. Required if customer ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/CreateCustomerDTO"}]},"paymentMethod":{"type":"string","description":"ID of the payment method to use for the payment. Can only be provided at the creation time.","examples":["pm_2RTUw7lL6IuBUwGQOD1EB0OAmx7"]},"paymentMethodData":{"description":"Payment method data for the payment. Required if payment method ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/PaymentCreatePaymentMethodDTO"}]},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"paymentMethodOptions":{"description":"Payment method options for the payment.","allOf":[{"$ref":"#/components/schemas/CreatePaymentMethodOptionsDTO"}]}}},"AuthPaymentRequestDTO":{"type":"object","properties":{"customerData":{"description":"Customer data for the payment. Required if customer ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/CreateCustomerDTO"}]},"paymentMethodData":{"description":"Payment method data for the payment. Required if payment method ID wasn't provided at the creation time. Meant to only be used by the Checkout SDK.","allOf":[{"$ref":"#/components/schemas/PaymentCreatePaymentMethodDTO"}]},"context":{"description":"Payment context for authorization, optional for merchant-initiated payments","allOf":[{"$ref":"#/components/schemas/CreatePaymentContextDTO"}]}}},"CapturePaymentRequestDTO":{"type":"object","properties":{}},"ReversePaymentRequestDTO":{"type":"object","properties":{"amount":{"type":"number","description":"Amount to reverse in minor units (e.g., cents for USD). Only applies to refundable payments that have been captured. Payments that are still pending capture will be fully voided.","examples":[1500]},"isExternal":{"type":"boolean","description":"If true, no requests will be made to the gateway. Use this when you have already completed the refund outside of ODUS and want to update the payment record to reflect the actual state.","examples":[false]}}},"RecordPaymentChargebackRequestDTO":{"type":"object","properties":{"blacklistCustomer":{"type":"boolean","description":"Whether to also blacklist the customer associated with the payment. Ignored when the merchant configuration's `blacklistCustomerOnChargeback` is `true`: the customer is blacklisted either way."},"customerRestrictions":{"description":"Customer restrictions to apply in case of a chargeback","allOf":[{"$ref":"#/components/schemas/ManageCustomerRestrictionsChargebackDTO"}]}}},"ManageCustomerRestrictionsChargebackDTO":{"type":"object","properties":{"restrictMit":{"type":"boolean","description":"Whether to restrict the customer from making merchant-initiated payments, e.g recurring subscription payments."},"restrictCit":{"type":"boolean","description":"Whether to restrict the customer from making customer-initiated payments, e.g payments made through the Checkout SDK."},"restrictReason":{"type":"string","description":"Reason for restricting the customer.","examples":["The customer is restricted due to compliance issues"]}}},"CreateApplePaySessionRequestDTO":{"type":"object","properties":{"domainName":{"type":"string","description":"The domain name for which the Apple Pay session is being created.","examples":["example.com"]},"displayName":{"type":"string","description":"The merchant name to be displayed in the Apple Pay sheet.","examples":["My Store"]}},"required":["domainName","displayName"]},"CreatePriceRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"name":{"type":"string","description":"Price name","examples":["Some price"]},"type":{"enum":["one_time","recurring"],"type":"string","description":"Price type","examples":["one_time"]},"amount":{"type":"number","description":"Payment amount in minor units (e.g., cents). For recurring prices, this is the amount charged each billing cycle. `0` makes the price free: it can be bundled alongside a paid item, and a free recurring price renews every cycle without ever reaching a payment provider.","examples":[1500]},"quantity":{"default":1,"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so referencing this price creates a line item of this quantity with a per-unit amount of `amount / quantity`. Defaults to `1`.","examples":[4]},"currency":{"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"type":"string","description":"Payment currency","examples":["usd"]},"product":{"type":"string","description":"Product ID","examples":["prod_2QGNGy637hJ9MnD5cK7thAjSvPV"]},"recurringSchedule":{"description":"Recurring schedule, required for recurring prices","allOf":[{"$ref":"#/components/schemas/CreateRecurringScheduleDTO"}]}},"required":["name","type","currency","product"]},"CreateRecurringScheduleDTO":{"type":"object","properties":{"intervalUnit":{"enum":["minute","hour","day","week","month","year"],"type":"string","description":"Recurring interval unit","examples":["month"]},"intervalCount":{"type":"number","description":"Recurring interval count","examples":[1]},"trial":{"description":"Trial schedule details","allOf":[{"$ref":"#/components/schemas/CreateRecurringScheduleTrialDTO"}]}},"required":["intervalUnit","intervalCount"]},"CreateRecurringScheduleTrialDTO":{"type":"object","properties":{"intervalUnit":{"enum":["minute","hour","day","week","month","year"],"type":"string","description":"Trial interval unit","examples":["day"]},"intervalCount":{"type":"number","description":"Trial interval count","examples":[7]},"amount":{"type":"number","description":"Initial setup/trial payment amount in minor units (e.g., cents). This is the amount charged during the first billing cycle before the regular recurring amount takes effect.","examples":[199]}},"required":["intervalUnit","intervalCount","amount"]},"UpdatePriceRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"name":{"type":"string","description":"Price name","examples":["Some price"]},"type":{"enum":["one_time","recurring"],"type":"string","description":"Price type","examples":["one_time"]},"amount":{"type":"number","description":"Payment amount in minor units (e.g., cents). For recurring prices, this is the amount charged each billing cycle. `0` makes the price free: it can be bundled alongside a paid item, and a free recurring price renews every cycle without ever reaching a payment provider.","examples":[1500]},"quantity":{"default":1,"type":"number","description":"Number of units this price represents. The `amount` covers all of them, so referencing this price creates a line item of this quantity with a per-unit amount of `amount / quantity`. Defaults to `1`.","examples":[4]},"currency":{"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"type":"string","description":"Payment currency","examples":["usd"]},"product":{"type":"string","description":"Product ID","examples":["prod_2QGNGy637hJ9MnD5cK7thAjSvPV"]},"active":{"type":"boolean","description":"Whether the price is active","examples":[true]},"recurringSchedule":{"description":"Recurring schedule for recurring prices","allOf":[{"$ref":"#/components/schemas/CreateRecurringScheduleDTO"}]}}},"CreateProductRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"name":{"type":"string","description":"Name of the product","examples":["My product"]},"description":{"type":"string","description":"Description of the product. Not visible to end customers","examples":["..."]},"statementDescriptor":{"type":"string","maxLength":22,"description":"Statement descriptor for the product. Max 22 characters.","examples":["Some statement descriptor"]},"statementDescriptorSuffix":{"type":["string","null"],"maxLength":22,"description":"Statement descriptor suffix for the product, for gateways that append a per-payment suffix to your account's descriptor instead of replacing it. Keep it short: the account's prefix, a separator and the suffix together must fit in 22 characters. Max 22 characters. Send `null` to clear it.","examples":["PRO PLAN"]},"category":{"enum":["digital","physical"],"type":"string","description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment.","examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Defaults to false. Settable whether or not the Order Management addon is enabled, so a catalogue can be prepared before switching it on.","examples":[false]},"sku":{"type":["string","null"],"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships. The same SKU covers every price of the product — 1-pack, 3-pack and per-currency variants all ship the same item. Send `null` to clear it.","examples":["FY-YOGA-MAT-01"]}},"required":["name"]},"UpdateProductRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"name":{"type":"string","description":"Name of the product","examples":["My product"]},"description":{"type":"string","description":"Description of the product. Not visible to end customers","examples":["..."]},"statementDescriptor":{"description":"Statement descriptor for the product. Max 22 characters. Send `null` to clear it.","type":["string","null"],"maxLength":22,"examples":["Some statement descriptor"]},"statementDescriptorSuffix":{"type":["string","null"],"maxLength":22,"description":"Statement descriptor suffix for the product, for gateways that append a per-payment suffix to your account's descriptor instead of replacing it. Keep it short: the account's prefix, a separator and the suffix together must fit in 22 characters. Max 22 characters. Send `null` to clear it.","examples":["PRO PLAN"]},"category":{"enum":["digital","physical"],"type":"string","description":"Category of the product, sent to the payment provider so the VAT split between digital services and physical goods can be reconstructed from the provider reports. Plays no part in fulfillment.","examples":["digital"]},"shippable":{"type":"boolean","description":"Whether the product takes part in Order Management: a payment for one of its prices becomes an order item. Defaults to false. Settable whether or not the Order Management addon is enabled, so a catalogue can be prepared before switching it on.","examples":[false]},"sku":{"type":["string","null"],"description":"Stock Keeping Unit the warehouse ships this product under, used on the 3PL manifest. For a shippable product it decides whether the resulting order item physically ships. The same SKU covers every price of the product — 1-pack, 3-pack and per-currency variants all ship the same item. Send `null` to clear it.","examples":["FY-YOGA-MAT-01"]},"active":{"type":"boolean","description":"Whether the product is active","examples":[true]}}},"CreateRetryPolicyDTO":{"type":"object","properties":{"title":{"type":"string","description":"Comment for the configuration","examples":["Simple Recovery configuration that uses multiple different rules"]},"steps":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/CreateRetryPolicyStepRetryPolicyDTO"},"description":"Recovery rules associated with the configuration","examples":[[]]}},"required":["title","steps"]},"CreateRetryPolicyStepRetryPolicyDTO":{"type":"object","properties":{"position":{"type":"number","description":"Position of the rule. Rules are executed from lowest to highest position number."},"useInitialGateway":{"type":"boolean","description":"Whether to use the last successful gateway or a specific gateway profile. If false, gatewayProfileId must be provided."},"gatewayProfile":{"type":"string","description":"ID of the gateway profile to use. Required if useInitialGateway is false.","examples":["gwp_2QUGPTQo8As1cNIvgKlSFDxjJDd"]},"priceReductionPercentage":{"type":"number","description":"Percentage to reduce the price by when retrying the payment."},"retryDelay":{"type":"number","description":"Number of days to wait from the last failed payment before retrying."}},"required":["position","retryDelay"]},"CreateSecretKeyRequestDTO":{"type":"object","properties":{"note":{"type":"string","description":"A user-provided note to help identify this secret key","examples":["Production backend key"]},"permissions":{"type":"array","items":{"enum":["customer:read","customer:create","customer:update","customer:manage_restrictions","payment:read","payment:create","payment:authorize","payment:update","payment:capture","payment:reverse","payment:record_chargeback","payment:create_apple_pay_session","price:read","price:create","price:update","price:delete","job:read","product:read","product:create","product:update","secret_key:read","secret_key:create","secret_key:update","secret_key:delete","publishable_key:read","publishable_key:roll","publishable_key:update","invoice:read","invoice:void","gateway_profile:read","gateway_profile:create","gateway_profile:update","gateway_operation:read","customer_blacklist:read","customer_blacklist:create","customer_blacklist:delete","payment_method:read","request_log:read","cascade:read","cascade:create","cascade:update","route:read","route:create","route:update","webhook_subscriber:read","webhook_subscriber:create","webhook_subscriber:update","retry_policy:read","retry_policy:create","retry_policy:update","user:read","user:create","user:update","user:delete","subscription:read","subscription:cancel","subscription:resume","subscription:force_bill","subscription:preview","subscription:update","checkout_profile:read","checkout_profile:create","checkout_profile:update","merchant_config:read","merchant_config:update","search:read","report:read"],"type":"string"},"description":"Permissions granted to this secret key, controlling which API operations it can perform","examples":[["payment:read","payment:create"]]}},"required":["permissions"]},"UpdateSecretKeyRequestDTO":{"type":"object","properties":{"note":{"type":"string","description":"A user-provided note to help identify this secret key","examples":["Production backend key"]},"permissions":{"type":"array","items":{"enum":["customer:read","customer:create","customer:update","customer:manage_restrictions","payment:read","payment:create","payment:authorize","payment:update","payment:capture","payment:reverse","payment:record_chargeback","payment:create_apple_pay_session","price:read","price:create","price:update","price:delete","job:read","product:read","product:create","product:update","secret_key:read","secret_key:create","secret_key:update","secret_key:delete","publishable_key:read","publishable_key:roll","publishable_key:update","invoice:read","invoice:void","gateway_profile:read","gateway_profile:create","gateway_profile:update","gateway_operation:read","customer_blacklist:read","customer_blacklist:create","customer_blacklist:delete","payment_method:read","request_log:read","cascade:read","cascade:create","cascade:update","route:read","route:create","route:update","webhook_subscriber:read","webhook_subscriber:create","webhook_subscriber:update","retry_policy:read","retry_policy:create","retry_policy:update","user:read","user:create","user:update","user:delete","subscription:read","subscription:cancel","subscription:resume","subscription:force_bill","subscription:preview","subscription:update","checkout_profile:read","checkout_profile:create","checkout_profile:update","merchant_config:read","merchant_config:update","search:read","report:read"],"type":"string"},"description":"Permissions granted to this secret key, controlling which API operations it can perform","examples":[["payment:read","payment:create"]]}}},"CancelSubscriptionRequestDTO":{"type":"object","properties":{"cancelAt":{"enum":["immediately","end_of_current_cycle","end_of_next_cycle"],"type":"string","description":"Which period boundary the cancellation lands on. `end_of_next_cycle` lets the upcoming renewal charge go through and cancels once that period ends. Takes precedence over the deprecated `cancelImmediately`; defaults to `end_of_current_cycle`."}}},"GenerateUpdatePreviewRequestDTO":{"type":"object","properties":{"price":{"type":"string","description":"The ID of the price to apply to the subscription update","examples":["price_2R4e2xDqbww8ewmkIYWE1A6Zcfp"]},"nextBillingDate":{"type":"string","format":"date-time","description":"The date of the next recurring payment. Must be in the future and after the current period start.","examples":["2026-06-01T00:00:00.000Z"]},"applyTrial":{"type":"boolean","description":"Bill the next cycle on the new price's trial, using the trial's amount and interval. Later cycles follow the price's regular schedule. Requires `price`, and that price must have a trial. Defaults to `false`, which skips the trial.","examples":[true]}}},"UpdateSubscriptionPlanRequestDTO":{"type":"object","properties":{"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"Metadata used by merchants to store additional information about the entity.","examples":[{"orderId":"12345","notes":"Urgent delivery"}]},"previewId":{"type":"string","description":"The ID of the preview obtained from the generate preview endpoint. Used to apply the plan change preview."}}},"CreateWebhookSubscriberRequestDTO":{"type":"object","properties":{"recipientUrl":{"type":"string","description":"The URL to send the webhook to. Must be a valid HTTPS URL","examples":["https://my-be-url.com/webhooks"]},"subscribedTo":{"type":"array","items":{"enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"],"type":"string"},"examples":[["customer.created"]]},"payloadVersion":{"default":1,"enum":[1,2],"type":"number","description":"The version of the webhook payload this subscriber receives. It is set when the subscriber is created and cannot be changed afterwards, so a later change to the payload never alters what this subscriber is sent. Omit it to get the current default.","examples":[1]}},"required":["recipientUrl","subscribedTo"]},"UpdateWebhookSubscriberRequestDTO":{"type":"object","properties":{"recipientUrl":{"type":"string","description":"The URL to send the webhook to. Must be a valid HTTPS URL","examples":["https://my-be-url.com/webhooks"]},"subscribedTo":{"type":"array","items":{"enum":["customer.created","customer.updated","blacklist.added","blacklist.removed","subscription.active","subscription.cancelled","subscription.updated","payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed","transaction.reverse_failed","transaction.capture_failed","invoice.created","invoice.paid","invoice.voided","invoice.updated","product.created","product.updated","price.created","price.updated","price.deleted"],"type":"string"},"examples":[["customer.created"]]},"active":{"type":"boolean","description":"Whether the webhook subscriber is active. Deactivating pauses webhook delivery to this subscriber rather than cancelling it: events queued while it is inactive are held, and reactivating the subscriber resumes their delivery. A held event is not held indefinitely — one that stays undelivered past the delivery deadline is abandoned."}}},"CreateRouteRequestDTO":{"type":"object","properties":{"name":{"type":"string","description":"The route's name","examples":["Card routing"]},"description":{"type":"string","description":"What the route is for","examples":["Sends US-issued cards to a domestic gateway"]}},"required":["name"]},"UpdateRouteRequestDTO":{"type":"object","properties":{"name":{"type":"string","description":"The route's name","examples":["Card routing"]},"description":{"type":"string","description":"What the route is for","examples":["Sends US-issued cards to a domestic gateway"]},"active":{"type":"boolean","description":"Whether the route is active. A route is available for routing only while it is active and has an active version."}}},"PublishRouteVersionRequestDTO":{"type":"object","properties":{"tree":{"description":"The version's decision tree. It cannot be changed once published: to change the route, publish a new version.","allOf":[{"$ref":"#/components/schemas/RouteNodeDTO"}]},"activate":{"type":"boolean","description":"Make this version the active one as soon as it is published. When `false` or omitted, the active version stays as it is."}},"required":["tree"]},"RouteConditionDTO":{"description":"A test on the payment: a single comparison, or `all`, `any` or `not` over other conditions. A fact the payment does not have makes the comparison unknown, never false, and an unknown condition does not match.","anyOf":[{"type":"object","properties":{"all":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/RouteConditionDTO"}}},"required":["all"]},{"type":"object","properties":{"any":{"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/RouteConditionDTO"}}},"required":["any"]},{"type":"object","properties":{"not":{"$ref":"#/components/schemas/RouteConditionDTO"}},"required":["not"]},{"type":"object","properties":{"field":{"type":"string","minLength":1,"description":"The payment fact to test: `card.brand`, `card.bin`, `card.issuerName`, `card.issuerCountry`, `card.fundingType`, `amount`, `currency`, `initiator`, `statementDescriptor`, `statementDescriptorSuffix`, or `metadata.<key>`.","examples":["card.issuerCountry"]},"op":{"enum":["eq","ne","in","nin","gt","gte","lt","lte","contains","startsWith","exists"],"type":"string","description":"How the fact is compared with `value`. Each field supports its own operators."},"value":{"description":"What the fact is compared with: a list for `in` and `nin`; a prefix or a list of prefixes for `startsWith`; a number in minor units for `amount`; omitted for `exists`.","anyOf":[{"type":"string","minLength":1},{"type":"integer","minimum":0,"maximum":9007199254740991},{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1}}],"examples":["US"]}},"required":["field","op"]}]},"RouteNodeDTO":{"description":"One step of a route: a `condition`, a `split`, a `pool` or a `gateway`.","oneOf":[{"type":"object","properties":{"type":{"enum":["condition"],"type":"string"},"branches":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"when":{"$ref":"#/components/schemas/RouteConditionDTO"},"then":{"$ref":"#/components/schemas/RouteNodeDTO"}},"required":["when","then"]},"description":"Tested in order. The payment follows the first branch whose condition matches. A decline inside that branch does not move on to a later branch."},"else":{"description":"Followed when no branch matches. Without it, the route ends there.","allOf":[{"$ref":"#/components/schemas/RouteNodeDTO"}]}},"required":["type","branches"],"description":"Sends the payment down the first branch that matches it."},{"type":"object","properties":{"type":{"enum":["split"],"type":"string"},"outputs":{"minItems":2,"maxItems":20,"type":"array","items":{"type":"object","properties":{"percent":{"type":"integer","minimum":1,"maximum":99,"description":"The share of payments that follow this output, as a whole percentage. The percentages of one split add up to 100.","examples":[20]},"then":{"$ref":"#/components/schemas/RouteNodeDTO"}},"required":["percent","then"]},"description":"Each payment follows exactly one output, chosen in proportion to `percent`. The same payment follows the same output each time it reaches this split. A decline inside that output does not move on to another output."}},"required":["type","outputs"],"description":"Sends a fixed share of payments down each output, such as 20% down one and 80% down the other."},{"type":"object","properties":{"type":{"enum":["pool"],"type":"string"},"strategy":{"enum":["ordered","roundRobin","weighted"],"type":"string","description":"The order the children are tried in. `ordered` keeps the written order; `roundRobin` starts at a position that moves on from one payment to the next; `weighted` picks the order at random, in proportion to `weights`."},"children":{"minItems":1,"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/RouteNodeDTO"},"description":"Tried in turn. When a child declines, the pool fails over to the next one; a child that is not attempted, such as an inactive gateway, is passed over."},"weights":{"type":"array","items":{"type":"integer","minimum":1,"maximum":100},"description":"One weight per child, for a `weighted` pool only."},"maxAttempts":{"type":"integer","minimum":1,"maximum":11,"description":"The most gateway attempts this pool may make, including those of its children."}},"required":["type","strategy","children"],"description":"Tries its children in turn, failing over from one that declined."},{"type":"object","properties":{"type":{"enum":["gateway"],"type":"string"},"gatewayProfileId":{"type":"string","minLength":1,"description":"The gateway profile to attempt. It must be active and support card payments when the version is published.","examples":["gwp_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]}},"required":["type","gatewayProfileId"],"description":"Attempts the payment at one gateway profile. A route attempts each gateway profile at most once per payment."}]},"ActivateRouteVersionRequestDTO":{"type":"object","properties":{"version":{"type":"string","minLength":1,"description":"The ID of the version to activate. It must be a version of this route.","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]}},"required":["version"]},"SaveRouteDraftRequestDTO":{"type":"object","properties":{"revision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The `revision` of the draft you edited this tree from, or `0` if the Route had no draft when you started. When you send it and the draft's current `revision` is different, the Route has no draft, or you sent `0` and the Route now has a draft, the save is refused with `409` and the draft is left unchanged. Leave it out to save the tree whatever the draft's revision."},"tree":{"description":"The decision tree as edited so far, shaped as a published tree. It may be incomplete: whether it is complete and correct is checked only when the draft is published. Each save replaces the whole tree.","allOf":[{"$ref":"#/components/schemas/RouteDraftNodeDTO"}]}},"required":["tree"]},"RouteDraftConditionDTO":{"description":"A test on the payment: a single comparison, or `all`, `any` or `not` over other conditions. A fact the payment does not have makes the comparison unknown, never false, and an unknown condition does not match.","anyOf":[{"type":"object","properties":{"all":{"type":"array","items":{"$ref":"#/components/schemas/RouteDraftConditionDTO"}}},"required":["all"]},{"type":"object","properties":{"any":{"type":"array","items":{"$ref":"#/components/schemas/RouteDraftConditionDTO"}}},"required":["any"]},{"type":"object","properties":{"not":{"$ref":"#/components/schemas/RouteDraftConditionDTO"}},"required":["not"]},{"type":"object","properties":{"field":{"type":"string","minLength":1,"description":"The payment fact to test: `card.brand`, `card.bin`, `card.issuerName`, `card.issuerCountry`, `card.fundingType`, `amount`, `currency`, `initiator`, `statementDescriptor`, `statementDescriptorSuffix`, or `metadata.<key>`.","examples":["card.issuerCountry"]},"op":{"enum":["eq","ne","in","nin","gt","gte","lt","lte","contains","startsWith","exists"],"type":"string","description":"How the fact is compared with `value`. Each field supports its own operators."},"value":{"description":"What the fact is compared with: a list for `in` and `nin`; a prefix or a list of prefixes for `startsWith`; a number in minor units for `amount`; omitted for `exists`.","anyOf":[{"type":"string","minLength":1},{"type":"integer","minimum":0,"maximum":9007199254740991},{"maxItems":1000,"type":"array","items":{"type":"string","minLength":1}}],"examples":["US"]}}}]},"RouteDraftNodeDTO":{"description":"One step of a draft route: a `condition`, a `split`, a `pool` or a `gateway`, shaped as in a published route. Every field except `type` may be left out, and any list may be empty, until the draft is published.","oneOf":[{"type":"object","properties":{"type":{"enum":["condition"],"type":"string"},"branches":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"when":{"$ref":"#/components/schemas/RouteDraftConditionDTO"},"then":{"$ref":"#/components/schemas/RouteDraftNodeDTO"}}},"description":"Tested in order. The payment follows the first branch whose condition matches. A decline inside that branch does not move on to a later branch."},"else":{"description":"Followed when no branch matches. Without it, the route ends there.","allOf":[{"$ref":"#/components/schemas/RouteDraftNodeDTO"}]}},"required":["type"],"description":"Sends the payment down the first branch that matches it."},{"type":"object","properties":{"type":{"enum":["split"],"type":"string"},"outputs":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"percent":{"type":"integer","minimum":1,"maximum":99,"description":"The share of payments that follow this output, as a whole percentage. The percentages of one split add up to 100.","examples":[20]},"then":{"$ref":"#/components/schemas/RouteDraftNodeDTO"}}},"description":"Each payment follows exactly one output, chosen in proportion to `percent`. The same payment follows the same output each time it reaches this split. A decline inside that output does not move on to another output."}},"required":["type"],"description":"Sends a fixed share of payments down each output, such as 20% down one and 80% down the other."},{"type":"object","properties":{"type":{"enum":["pool"],"type":"string"},"strategy":{"enum":["ordered","roundRobin","weighted"],"type":"string","description":"The order the children are tried in. `ordered` keeps the written order; `roundRobin` starts at a position that moves on from one payment to the next; `weighted` picks the order at random, in proportion to `weights`."},"children":{"maxItems":20,"type":"array","items":{"$ref":"#/components/schemas/RouteDraftNodeDTO"},"description":"Tried in turn. When a child declines, the pool fails over to the next one; a child that is not attempted, such as an inactive gateway, is passed over."},"weights":{"maxItems":20,"type":"array","items":{"type":"integer","minimum":1,"maximum":100},"description":"One weight per child, for a `weighted` pool only."},"maxAttempts":{"type":"integer","minimum":1,"maximum":11,"description":"The most gateway attempts this pool may make, including those of its children."}},"required":["type"],"description":"Tries its children in turn, failing over from one that declined."},{"type":"object","properties":{"type":{"enum":["gateway"],"type":"string"},"gatewayProfileId":{"type":"string","minLength":1,"description":"The gateway profile to attempt. It must be active and support card payments when the version is published.","examples":["gwp_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]}},"required":["type"],"description":"Attempts the payment at one gateway profile. A route attempts each gateway profile at most once per payment."}]},"DeleteRouteDraftRequestDTO":{"type":"object","properties":{"revision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The `revision` of the draft you mean to discard. When you send it and the draft's current `revision` is different, or the Route has no draft, nothing is deleted and the request is refused with `409`. Leave it out, or send no body, to discard the draft whatever its revision."}}},"PublishRouteDraftRequestDTO":{"type":"object","properties":{"revision":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The `revision` of the draft you reviewed. When you send it and the draft's current `revision` is different, or the Route has no draft, nothing is published, the draft is kept and the request is refused with `409`. `0` means you expect no draft, so it is refused with `409` whenever the Route has one. Leave it out to publish the draft whatever its revision."},"activate":{"type":"boolean","description":"Make the new version the active one as soon as it is published. When `false` or omitted, the active version stays as it is."}}},"EvaluateRouteRequestDTO":{"type":"object","properties":{"version":{"type":"string","minLength":1,"description":"The ID of a published version of this route to evaluate. Leave out both `version` and `tree` to evaluate the route's active version.","examples":["rtv_2mXGTxXIkqv4uSdbm8DJCzvHUIu"]},"tree":{"description":"A decision tree to evaluate instead of a published version, such as one you have not published yet. It takes the same shape as `tree` in Publish a Route version.","allOf":[{"$ref":"#/components/schemas/RouteNodeDTO"}]},"facts":{"type":"object","properties":{"amount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"The amount of the payment, in minor units","examples":[1000]},"currency":{"enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"],"type":"string","description":"The currency of the payment","examples":["usd"]},"initiator":{"enum":["customer","merchant"],"type":"string","description":"Who initiates the payment","examples":["customer"]},"card":{"type":"object","properties":{"brand":{"enum":["visa","mastercard","amex","discover"],"type":"string","description":"The brand of the card","examples":["visa"]},"bin":{"type":"string","pattern":"^\\d{6,8}$","description":"The first 6 to 8 digits of the card number. Never send the full card number.","examples":["41472000"]},"issuerName":{"type":"string","minLength":1,"maxLength":255,"description":"The name of the bank that issued the card","examples":["Capital One"]},"issuerCountry":{"type":"string","pattern":"^[A-Za-z]{2}$","description":"The country of the bank that issued the card, as an ISO 3166-1 alpha-2 code","examples":["US"]},"fundingType":{"type":"string","minLength":1,"maxLength":50,"description":"How the card is funded, such as `credit`, `debit`, `prepaid` or `charge`","examples":["credit"]}},"description":"What is known about the card. A condition on a card field you leave out cannot be decided, so it does not match."},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"},"description":"The payment's metadata, for conditions on `metadata.<key>`","examples":[{"channel":"web"}]},"statementDescriptor":{"type":"string","minLength":1,"maxLength":22,"description":"The payment's statement descriptor. A condition on `statementDescriptor` cannot be decided without it, so it does not match.","examples":["Some product"]},"statementDescriptorSuffix":{"type":"string","minLength":1,"maxLength":22,"description":"The payment's statement descriptor suffix. A condition on `statementDescriptorSuffix` cannot be decided without it, so it does not match.","examples":["PRO PLAN"]}},"required":["amount","currency","initiator"],"description":"The payment to evaluate the route's conditions against"}},"required":["facts"]},"WebhookSubjectReference":{"type":"object","description":"An object that could not be captured and no longer exists, reduced to its ID.","properties":{"id":{"type":"string","description":"The ID of the object."}},"required":["id"],"additionalProperties":false},"PaymentWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"status":{"type":"string","enum":["open","requires_action","succeeded","cancelled"]},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount, in the smallest unit of the currency."},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"]},"amountCaptured":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount captured so far."},"amountReversed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount refunded or voided so far."},"initiator":{"type":"string","enum":["customer","merchant"]},"offSessionType":{"type":["string","null"],"enum":["recurring","unscheduled",null]},"captureMethod":{"description":"How the payment is captured.","type":["string","null"],"enum":["automatic","automaticDelayed","manual",null]},"captureAt":{"description":"When a delayed capture is scheduled.","type":["string","null"],"format":"date-time"},"authorizedAt":{"type":["string","null"],"format":"date-time"},"capturedAt":{"type":["string","null"],"format":"date-time"},"reversedAt":{"type":["string","null"],"format":"date-time"},"chargebackRecordedAt":{"type":["string","null"],"format":"date-time"},"cancellationReason":{"type":["string","null"]},"latestTransaction":{"type":["string","null"],"description":"The ID of the latest transaction. Retrieve it from the API for the full object."},"latestDeclineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"latestDeclineCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"latestMessage":{"type":["string","null"]},"customer":{"type":["string","null"],"description":"The ID of the customer. Retrieve it from the API for the full object."},"paymentMethod":{"type":["string","null"],"description":"The ID of the payment method. Retrieve it from the API for the full object."},"action":{"description":"The action the customer must take, such as a 3D Secure challenge, or `null`.","type":["object","null"],"properties":{"redirectUrl":{"type":"string","description":"Where to send the customer to complete the action."}},"required":["redirectUrl"]},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","status","amount","currency","amountCaptured","amountReversed","initiator","offSessionType","captureMethod","captureAt","authorizedAt","capturedAt","reversedAt","chargebackRecordedAt","cancellationReason","latestTransaction","latestDeclineType","latestDeclineCode","latestMessage","customer","paymentMethod","action","metadata"],"description":"A payment as the event left it."},"PaymentWebhookEvent":{"type":"object","description":"The body of every `payment.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["payment.created","payment.succeeded","payment.captured","payment.attempt_failed","payment.requires_action","payment.updated","payment.cancelled","payment.chargebacked","payment.reversed"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The payment as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the payment no longer exists.","anyOf":[{"$ref":"#/components/schemas/PaymentWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"TransactionWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"status":{"type":"string","enum":["pending","confirmation_requested","authorized","failed"]},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The amount, in the smallest unit of the currency."},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"]},"initiator":{"type":"string","enum":["customer","merchant"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"]},"captureDelay":{"description":"The capture delay, in hours.","type":["integer","null"],"minimum":-9007199254740991,"maximum":9007199254740991},"amountCaptured":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amountReversed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"isCaptureFailed":{"type":"boolean"},"isReverseFailed":{"type":"boolean"},"chargebackRecordedAt":{"type":["string","null"],"format":"date-time"},"processorId":{"description":"The processor's reference for the transaction.","type":["string","null"]},"outcome":{"description":"The result of the transaction, or `null` while it has none.","type":["object","null"],"properties":{"status":{"type":"string","enum":["success","partial","failure"]},"errorCode":{"type":["string","null"],"enum":["internal_error","not_supported","generic_decline","insufficient_funds","authentication_failed","authentication_cancelled","authentication_unavailable","cancelled","invalid_card_details","expired_card","authentication_required","transaction_not_permitted","generic_issuer_error","generic_processor_error","processor_rate_limited","processor_timeout","fraud_suspected","card_restricted","authentication_rejected","payment_method_unusable","generic_hard_decline","already_captured","merchant_account_restricted","merchant_configuration_error","invalid_request","blocked_by_policy","order_not_permitted","stored_credential_revoked",null]},"declineType":{"type":["string","null"],"enum":["soft_decline","hard_decline","not_attempted",null]},"safeErrorMessage":{"description":"An error message that can be shown to the customer.","type":["string","null"]},"authCode":{"type":["string","null"]}},"required":["status","errorCode","declineType","safeErrorMessage","authCode"]},"action":{"description":"The action the customer must take, such as a 3D Secure challenge, or `null`.","type":["object","null"],"properties":{"redirectUrl":{"type":"string","description":"Where to send the customer to complete the action."}},"required":["redirectUrl"]},"payment":{"type":"string","description":"The ID of the payment. Retrieve it from the API for the full object."},"customer":{"type":["string","null"],"description":"The ID of the customer. Retrieve it from the API for the full object."},"paymentMethod":{"type":"string","description":"The ID of the payment method. Retrieve it from the API for the full object."},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","status","amount","currency","initiator","captureMethod","captureDelay","amountCaptured","amountReversed","isCaptureFailed","isReverseFailed","chargebackRecordedAt","processorId","outcome","action","payment","customer","paymentMethod","metadata"],"description":"A transaction as the event left it."},"TransactionWebhookEvent":{"type":"object","description":"The body of every `transaction.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["transaction.reverse_failed","transaction.capture_failed"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The transaction as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the transaction no longer exists.","anyOf":[{"$ref":"#/components/schemas/TransactionWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"CustomerWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"email":{"type":"string"},"name":{"type":["string","null"]},"phoneNumber":{"type":["string","null"]},"dateOfBirth":{"format":"date","description":"A date, as `YYYY-MM-DD`.","type":["string","null"]},"gender":{"type":["string","null"],"enum":["male","female","other",null]},"restrictMit":{"type":"boolean","description":"Whether merchant-initiated payments are blocked."},"restrictCit":{"type":"boolean","description":"Whether customer-initiated payments are blocked."},"restrictReason":{"type":["string","null"]},"billingAddress":{"type":["object","null"],"properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"shippingAddress":{"type":["object","null"],"properties":{"firstName":{"type":["string","null"]},"lastName":{"type":["string","null"]},"companyName":{"type":["string","null"]},"line1":{"type":["string","null"]},"line2":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["firstName","lastName","companyName","line1","line2","city","state","postalCode","country"]},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","email","name","phoneNumber","dateOfBirth","gender","restrictMit","restrictCit","restrictReason","billingAddress","shippingAddress","metadata"],"description":"A customer as the event left it."},"CustomerWebhookEvent":{"type":"object","description":"The body of every `customer.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["customer.created","customer.updated"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The customer as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the customer no longer exists.","anyOf":[{"$ref":"#/components/schemas/CustomerWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"BlacklistWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"email":{"type":"string"},"reason":{"type":["string","null"]},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","email","reason","metadata"],"description":"A blacklist entry as the event left it. On `blacklist.removed`, as it was when removed."},"BlacklistWebhookEvent":{"type":"object","description":"The body of every `blacklist.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["blacklist.added","blacklist.removed"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The blacklist as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the blacklist no longer exists.","anyOf":[{"$ref":"#/components/schemas/BlacklistWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"SubscriptionWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"status":{"type":"string","enum":["active","cancelled"]},"autoBillingEnabled":{"type":"boolean"},"autoBillingDisabledAt":{"type":["string","null"],"format":"date-time"},"autoBillingDisabledReason":{"type":["string","null"],"enum":["recurring_payment_errored","subscription_cancelled","latest_invoice_retrying",null]},"startDate":{"type":"string","format":"date-time"},"endDate":{"type":["string","null"],"format":"date-time"},"currentPeriodStart":{"type":"string","format":"date-time"},"currentPeriodEnd":{"type":"string","format":"date-time"},"currentCycle":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cancelAtPeriodEnd":{"type":"boolean"},"cancelAtCycle":{"type":["integer","null"],"minimum":-9007199254740991,"maximum":9007199254740991},"cancellationReason":{"description":"Why the subscription was cancelled. `null` while it is active. Absent on events recorded before this field was introduced.","type":["string","null"],"enum":["requested","payment_failed","chargeback","customer_blacklisted",null]},"customer":{"type":"string","description":"The ID of the customer. Retrieve it from the API for the full object."},"price":{"type":"string","description":"The ID of the price. Retrieve it from the API for the full object."},"setupInvoice":{"type":["string","null"],"description":"The ID of the setup invoice. Retrieve it from the API for the full object."},"setupLineItem":{"description":"The ID of the setup line item. It has no retrieve endpoint of its own.","type":["string","null"]},"billingSettings":{"type":["object","null"],"properties":{"paymentMethodType":{"type":"string","enum":["card","paypal","applePay"]},"captureMethod":{"type":"string","enum":["automatic","automaticDelayed","manual"]},"captureDelay":{"type":["integer","null"],"minimum":-9007199254740991,"maximum":9007199254740991}},"required":["paymentMethodType","captureMethod","captureDelay"]},"upcomingInvoice":{"type":["object","null"],"properties":{"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"]},"periodStart":{"type":"string","format":"date-time"},"periodEnd":{"type":"string","format":"date-time"},"comment":{"type":["string","null"]}},"required":["amount","currency","periodStart","periodEnd","comment"]},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","status","autoBillingEnabled","autoBillingDisabledAt","autoBillingDisabledReason","startDate","endDate","currentPeriodStart","currentPeriodEnd","currentCycle","cancelAtPeriodEnd","cancelAtCycle","customer","price","setupInvoice","setupLineItem","billingSettings","upcomingInvoice","metadata"],"description":"A subscription as the event left it."},"SubscriptionWebhookEvent":{"type":"object","description":"The body of every `subscription.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["subscription.active","subscription.cancelled","subscription.updated"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The subscription as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the subscription no longer exists.","anyOf":[{"$ref":"#/components/schemas/SubscriptionWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"InvoiceWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"number":{"type":"string"},"type":{"type":"string","enum":["setup","recurring"]},"status":{"type":"string","enum":["open","paid","voided"]},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"]},"comment":{"type":["string","null"]},"voidedReason":{"type":["string","null"]},"periodStart":{"type":["string","null"],"format":"date-time"},"periodEnd":{"type":["string","null"],"format":"date-time"},"subscription":{"type":["string","null"],"description":"The ID of the subscription. Retrieve it from the API for the full object."},"payment":{"type":["string","null"],"description":"The ID of the payment. Retrieve it from the API for the full object."},"customer":{"type":"string","description":"The ID of the customer. Retrieve it from the API for the full object."},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","number","type","status","amount","currency","comment","voidedReason","periodStart","periodEnd","subscription","payment","customer","metadata"],"description":"An invoice as the event left it."},"InvoiceWebhookEvent":{"type":"object","description":"The body of every `invoice.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["invoice.created","invoice.paid","invoice.voided","invoice.updated"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The invoice as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the invoice no longer exists.","anyOf":[{"$ref":"#/components/schemas/InvoiceWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"ProductWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"name":{"type":"string"},"description":{"type":["string","null"]},"category":{"type":["string","null"],"enum":["digital","physical",null]},"shippable":{"type":"boolean"},"sku":{"type":["string","null"]},"active":{"type":"boolean"},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","name","description","category","shippable","sku","active","metadata"],"description":"A product as the event left it."},"ProductWebhookEvent":{"type":"object","description":"The body of every `product.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["product.created","product.updated"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The product as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the product no longer exists.","anyOf":[{"$ref":"#/components/schemas/ProductWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]},"PriceWebhookSnapshot":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the object."},"createdAt":{"type":"string","format":"date-time","description":"When the object was created."},"updatedAt":{"description":"When the object was last updated.","type":["string","null"],"format":"date-time"},"type":{"type":"string","enum":["one_time","recurring"]},"name":{"type":"string"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"quantity":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"currency":{"type":"string","enum":["usd","eur","gbp","cad","aud","pln","czk","sek","dkk"]},"active":{"type":"boolean"},"product":{"type":"string","description":"The ID of the product. Retrieve it from the API for the full object."},"billingSchedule":{"description":"The ID of the billing schedule. It has no retrieve endpoint of its own.","type":["string","null"]},"recurringSchedule":{"type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"]},"intervalCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"trial":{"type":["object","null"],"properties":{"intervalUnit":{"type":"string","enum":["minute","hour","day","week","month","year"]},"intervalCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["intervalUnit","intervalCount","amount"]}},"required":["intervalUnit","intervalCount","trial"]},"metadata":{"description":"Your metadata on the object, after the change that caused the event.","type":["object","null"],"additionalProperties":true}},"required":["id","createdAt","updatedAt","type","name","amount","quantity","currency","active","product","billingSchedule","recurringSchedule","metadata"],"description":"A price as the event left it. On `price.deleted`, as it was when deleted."},"PriceWebhookEvent":{"type":"object","description":"The body of every `price.*` webhook.","properties":{"profile":{"type":"string","description":"The ID of the webhook subscriber the delivery is for. Use it to choose the shared secret that verifies the signature."},"merchantId":{"type":"string","description":"The ID of your merchant account."},"eventId":{"type":"string","description":"The ID of the event. It is the same for every delivery of the event, so use it to skip duplicates."},"eventType":{"type":"string","enum":["price.created","price.updated","price.deleted"]},"timestamp":{"type":"string","format":"date-time","description":"When the event happened."},"data":{"description":"The price as the event left it. Rarely, when the event could not be captured at that moment, `data` is read when the webhook is built instead, or contains only `id` if the price no longer exists.","anyOf":[{"$ref":"#/components/schemas/PriceWebhookSnapshot"},{"$ref":"#/components/schemas/WebhookSubjectReference"}]}},"required":["profile","merchantId","eventId","eventType","timestamp","data"]}}},"openapi":"3.1.1","paths":{"/v2/accounts":{"get":{"operationId":"AccountController_findAllPaginated","summary":"List accessible accounts","description":"Retrieve a paginated list of accounts the authenticated principal can access. Identity-token callers receive every active account in their organization so they can pick one to supply via the X-Odus-Merchant header; access-key callers receive only their current account.","tags":["Accounts"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","name","createdAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/accounts/self":{"get":{"operationId":"AccountController_getSelf","summary":"Get currently logged in to account details","description":"Retrieve details of the account associated with the currently authenticated user","tags":["Accounts"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/blacklist":{"get":{"operationId":"BlacklistController_findAllPaginated","summary":"Find all Blacklist entries","description":"Retrieve a paginated list of Customer Blacklist entries","tags":["Customer Blacklist"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"email","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"reason","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","email"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerBlacklistDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"BlacklistController_create","summary":"Create a Blacklist entry","description":"Create a new Customer Blacklist entry with the provided details","tags":["Customer Blacklist"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomerBlacklistDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBlacklistDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/blacklist/{id}":{"get":{"operationId":"BlacklistController_findOne","summary":"Find one Blacklist entry","description":"Retrieve a Customer Blacklist entry by its ID","tags":["Customer Blacklist"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerBlacklistDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/blacklist/{id}/delete":{"post":{"operationId":"BlacklistController_deleteEntry","summary":"Delete a Blacklist entry","description":"Delete an existing Customer Blacklist entry by its ID","tags":["Customer Blacklist"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityRemovedDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/cascades":{"get":{"operationId":"CascadeController_findAllPaginated","summary":"Find all Cascades","description":"Retrieve a paginated list of Cascades","tags":["Cascades"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"active","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"algorithm","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","active","name"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CascadePartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"CascadeController_create","summary":"Create a Cascade","description":"Create a new Cascade with the provided details","tags":["Cascades"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCascadeRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CascadeDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/cascades/{id}":{"get":{"operationId":"CascadeController_findOne","summary":"Find one Cascade","description":"Retrieve a Cascade by its ID","tags":["Cascades"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CascadeDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"CascadeController_update","summary":"Update a Cascade","description":"Update an existing Cascade by its ID","tags":["Cascades"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCascadeRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CascadeDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/customers":{"get":{"operationId":"CustomerController_findAllPaginated","summary":"Find all Customers","description":"Retrieve a paginated list of Customers","tags":["Customers"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"email","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"phoneNumber","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"dateOfBirth","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"restrictCit","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"restrictMit","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"restrictReason","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"metadata","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerPartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/customers/{id}":{"get":{"operationId":"CustomerController_findOne","summary":"Find one Customer","description":"Retrieve a Customer by its ID","tags":["Customers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"CustomerController_update","summary":"Update a Customer","description":"Update an existing Customer with the provided details","tags":["Customers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/customers/{id}/restrictions":{"post":{"operationId":"CustomerController_manageRestrictions","summary":"Manage Customer Restrictions","description":"Manage payment restrictions for a Customer, such as blocking new or recurring subscription payments","tags":["Customers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageCustomerRestrictionsRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/events":{"get":{"operationId":"EventController_findAllPaginated","summary":"List Events","description":"Retrieve a paginated list of what happened to one or more objects, in order — every recorded event of the payments, transactions, customers, subscriptions, invoices, products, prices or blacklist entries named in `subjectId`, whether or not a webhook was sent for it. This is how an activity timeline is built: pass a payment and its transactions to see it created, attempted at a processor and declined, sent to customer authentication and back, authorized, captured, refunded or voided, cancelled, charged back, including the failed captures and refunds recorded against its transactions. Each event carries the `type`, when it happened, the object it was recorded against, and a curated `details` object rather than the full event data. Sorted oldest first by default; pass `sortDirection=DESC` for newest first. Filter by `type` to leave out the event types you do not show — `type[nin][]=payment.updated`.","tags":["Events"],"parameters":[{"name":"subjectId","in":"query","required":true,"style":"deepObject","explode":true,"description":"The objects whose events to list, by id — a payment, transaction, customer, subscription, invoice, product, price or blacklist entry (`pay_…`, `tx_…`, `cus_…`, `bl_…`, `sub_…`, `inv_…`, `prod_…`, `price_…`). Pass one with `subjectId[eq]` or several with `subjectId[in][]`, up to 100. Reading an object's events needs the permission that reads the object; a request naming an object you may not read is refused as a whole.","schema":{"anyOf":[{"type":"object","properties":{"eq":{"type":"string","minLength":1}},"required":["eq"]},{"type":"object","properties":{"in":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":100}},"required":["in"]}]}},{"name":"type","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","required":false,"schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string","enum":["createdAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","required":false,"schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/EventDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/gateway-operations":{"get":{"operationId":"GatewayOperationController_findAllPaginated","summary":"Find all Gateway Operations","description":"Retrieve a paginated list of raw payment service provider operations, optionally filtered by transaction","tags":["Gateway Operations"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"type","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"transaction","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","type","status"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/GatewayOperationDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/gateway-operations/{id}":{"get":{"operationId":"GatewayOperationController_findOne","summary":"Find one Gateway Operation","description":"Retrieve a Gateway Operation by its ID","tags":["Gateway Operations"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayOperationDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/gateway-profiles":{"get":{"operationId":"GatewayProfileController_findAllPaginated","summary":"Find all Gateway Profiles","description":"Retrieve a paginated list of Gateway Profiles","tags":["Gateway Profiles"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"title","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"integration","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"active","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"supportedPaymentMethods","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}},"contains":{"type":"string"}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/GatewayProfilePartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"GatewayProfileController_create","summary":"Create a Gateway Profile","description":"Create a Gateway Profile with the provided details","tags":["Gateway Profiles"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGatewayProfileRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayProfileDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/gateway-profiles/{id}":{"get":{"operationId":"GatewayProfileController_findOne","summary":"Find one Gateway Profile","description":"Retrieve a Gateway Profile by its ID","tags":["Gateway Profiles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayProfileDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"GatewayProfileController_update","summary":"Update a Gateway Profile","description":"Update an existing Gateway Profile with the provided details","tags":["Gateway Profiles"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGatewayProfileRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayProfileDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/invoices":{"get":{"operationId":"InvoiceController_findAllPaginated","summary":"Find all Invoices","description":"Retrieve a paginated list of Invoices","tags":["Invoices"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"voidedReason","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"periodStart","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"periodEnd","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"payment","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"number","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"subscription","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","status"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/InvoicePartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/invoices/{id}":{"get":{"operationId":"InvoiceController_findOne","summary":"Find one Invoice","description":"Retrieve an Invoice by its ID","tags":["Invoices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/invoices/{id}/void":{"post":{"operationId":"InvoiceController_void","summary":"Void an Invoice","description":"Void an Invoice by its ID with the provided reason","tags":["Invoices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoidInvoiceRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/merchant-config":{"get":{"operationId":"MerchantConfigController_get","summary":"Get the Merchant Configuration","description":"Retrieve the configuration of the authenticated merchant.","tags":["Merchant Configuration"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantConfigDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"MerchantConfigController_set","summary":"Update the Merchant Configuration","description":"Update the configuration of the authenticated merchant.","tags":["Merchant Configuration"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMerchantConfigRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MerchantConfigDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments":{"get":{"operationId":"PaymentController_findAllPaginated","summary":"Find all Payments","description":"Retrieve a paginated list of Payments","tags":["Payments"],"parameters":[{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","amount","status","currency"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"displayStatus","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"amountCaptured","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"amountReversed","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"captureMethod","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"captureDelay","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"captureAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"statementDescriptor","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"isCaptured","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isReversed","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isFullyReversed","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isChargebacked","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isRedirectRequired","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"initiator","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"offSessionType","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.processorId","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"in":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.outcome.authCode","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"in":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.gatewayProfile.id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.gatewayProfile.title","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.email","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.type","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.lastFour","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.bin","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}},"gte":{"type":"string"},"lte":{"type":"string"}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.brand","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.expYear","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.expMonth","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.gatewayProfile","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.cascade","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.mode","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.paypal.gatewayProfile","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product.name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"metadata","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestDeclineType","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PaymentPartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"PaymentController_create","summary":"Create a Payment","description":"Create a Payment with the provided details. This payment will be in `open` state and can be authorized later.","tags":["Payments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}":{"get":{"operationId":"PaymentController_findOne","summary":"Find one Payment","description":"Retrieve a Payment by its ID","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"PaymentController_update","summary":"Update a Payment","description":"Update a Payment with the provided details. Only payments in `open` or `requires_action` state can be updated, except for metadata which can be updated in any state.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePaymentRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/authorize":{"post":{"operationId":"PaymentController_authorize","summary":"Authorize a Payment","description":"Authorize a previously created Payment by its ID. This operation will attempt to charge the payment method associated with the Payment.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthPaymentRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The payment was refused by the issuer, the processor or risk. The request itself was correct, so retrying it unchanged will be refused again. `type` is `payment_error`. Under v1 this same failure is answered with `400`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/capture":{"post":{"operationId":"PaymentController_capture","summary":"Capture a Payment","description":"Capture a previously authorized Payment by its ID","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapturePaymentRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/reverse":{"post":{"operationId":"PaymentController_reverse","summary":"Reverse a Payment","description":"Reverse a previously captured Payment by its ID. For captured payments, this will refund the provided `amount` or full amount, and for authorized payments, it will void the authorization.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReversePaymentRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/chargebacks":{"post":{"operationId":"PaymentController_createChargeback","summary":"Record a Chargeback","description":"Record a chargeback for a Payment by its ID, and optionally restrict the Customer from making new or recurring payments. Recording a chargeback does not prevent any further operations on the payment, such as capture or reversal.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPaymentChargebackRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/checkout-details":{"get":{"operationId":"PaymentController_startCheckoutSession","summary":"Start Checkout Session","description":"Start a checkout session for the Payment by its ID. This provides necessary details for initializing a checkout process on the client side.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutDetailsDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/apple-pay-sessions":{"post":{"operationId":"PaymentController_startApplePaySession","summary":"Create Apple Pay Session","description":"Create an Apple Pay session for the Payment by its ID. This session is required to initiate Apple Pay transactions on the client side.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplePaySessionRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApplePaySessionResponseDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payments/{id}/route-executions":{"get":{"operationId":"PaymentController_findAllRouteExecutionsPaginated","summary":"Find the route executions of a Payment","description":"Retrieve a paginated list of the Route executions of a Payment: one for each time the Payment was sent for authorization through a Route, whatever the result, oldest first unless you sort otherwise. Each one names the Route version that ran and lists every step it took: the branches that matched or did not, the nodes it skipped and why, and the gateway attempts it made, in order.","tags":["Payments"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"outcome","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","required":false,"schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string","enum":["id","createdAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","required":false,"schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/RouteExecutionDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payment-methods":{"get":{"operationId":"PaymentMethodController_findAllPaginated","summary":"Find all Payment Methods","description":"Retrieve a paginated list of Payment Methods","tags":["Payment Methods"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"isDefault","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"customer","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"card.lastFour","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"card.brand","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"card.expYear","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"card.expMonth","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","isDefault","customer"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PaymentMethodDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/payment-methods/{id}":{"get":{"operationId":"PaymentMethodController_findOne","summary":"Find one Payment Method","description":"Retrieve a Payment Method by its ID","tags":["Payment Methods"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/prices":{"get":{"operationId":"PriceController_findAllPaginated","summary":"Find all Prices","description":"Retrieve a paginated list of Prices","tags":["Prices"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"type","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product.name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"active","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"metadata","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","amount","type"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PricePartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"PriceController_create","summary":"Create a Price","description":"Create a new Price with the provided details","tags":["Prices"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePriceRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/prices/{id}":{"get":{"operationId":"PriceController_findOne","summary":"Find one Price","description":"Retrieve a Price by its ID","tags":["Prices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"PriceController_update","summary":"Update a Price","description":"Update an existing Price by its ID","tags":["Prices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePriceRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/prices/{id}/delete":{"post":{"operationId":"PriceController_delete","summary":"Delete a Price","description":"Delete an existing Price by its ID","tags":["Prices"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityRemovedDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/products":{"get":{"operationId":"ProductController_findAllPaginated","summary":"Find all Products","description":"Retrieve a paginated list of Products","tags":["Products"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"active","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"shippable","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"category","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sku","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"metadata","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","name","active"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"ProductController_create","summary":"Create a Product","description":"Create a new Product with the provided details","tags":["Products"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/products/{id}":{"get":{"operationId":"ProductController_findOne","summary":"Find one Product","description":"Retrieve a Product by its ID","tags":["Products"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"ProductController_update","summary":"Update a Product","description":"Update an existing Product with the provided details","tags":["Products"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProductRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/reports/payment-summary":{"get":{"operationId":"ReportingController_getPaymentSummaryReport","summary":"Payment summary report","description":"Generates a payment summary report with flexible grouping and metric calculations.","tags":["Reports"],"parameters":[{"name":"groupBy","in":"query","required":true,"schema":{"type":"string","examples":["currency"]},"description":"Field to group results by.\n\n**Available fields:** `currency`, `status`, `displayStatus`, `createdAt`, `authorizedAt`, `capturedAt`, `customer`, `gatewayProfile`, `product.name`, `customer.shippingAddress.country`, `attribution.utmSource`, `attribution.utmCampaign`, `latestDeclineCode`"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `groupBy` when it is a date field. Defaults to `day`. `hour` additionally requires the query to be bounded to a `createdAt` range of at most two days. Accepts `hour`, `day`, `week`, `month`, `quarter`, `year`; anything else falls back to the default."},{"name":"secondaryGroupBy","in":"query","required":false,"schema":{"type":"string"},"description":"Optional second axis for pivoting (must differ from groupBy). Each row will then carry both the primary `groupBy` value and a `secondaryGroupBy` value.\n\n**Available fields:** `currency`, `status`, `displayStatus`, `createdAt`, `authorizedAt`, `capturedAt`, `customer`, `gatewayProfile`, `product.name`, `customer.shippingAddress.country`, `attribution.utmSource`, `attribution.utmCampaign`, `latestDeclineCode`"},{"name":"secondaryGranularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `secondaryGroupBy` when it is a date field. Defaults to `day`."},{"name":"measures","in":"query","required":false,"schema":{"type":"string","examples":["fcPaymentsCount,fcSuccessfulCount,fcSuccessfulItemCount,fcIncompleteCount,fcFailedCount,fcRefundAmount,fcChargebackAmount,fcRevenue,fcApprovalRate,recurringPaymentsCount,recurringSuccessfulCount,recurringSuccessfulItemCount,recurringDeclinedCount,recurringRefundAmount,recurringChargebackAmount,recurringRevenue,recurringApprovalRate,refundedPaymentsCount,refundAmount,refundPercentage,chargebacksCount,chargebackAmount,chargebackPercentage,totalGrossRevenue,totalNetRevenue"]},"description":"Metrics to include in the results. Multiple measures can be specified as comma-separated values. If `measures` is not provided, all metrics specified in the config will be calculated.\n\n**Available metrics:** `fcPaymentsCount`, `fcSuccessfulCount`, `fcSuccessfulItemCount`, `fcIncompleteCount`, `fcFailedCount`, `fcRefundAmount`, `fcChargebackAmount`, `fcRevenue`, `fcApprovalRate`, `recurringPaymentsCount`, `recurringSuccessfulCount`, `recurringSuccessfulItemCount`, `recurringDeclinedCount`, `recurringRefundAmount`, `recurringChargebackAmount`, `recurringRevenue`, `recurringApprovalRate`, `refundedPaymentsCount`, `refundAmount`, `refundPercentage`, `chargebacksCount`, `chargebackAmount`, `chargebackPercentage`, `totalGrossRevenue`, `totalNetRevenue`"},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean","default":true},"description":"Whether to include a rollup row aggregating every group. Pass `false` to omit it."},{"name":"id","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"displayStatus","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"amountCaptured","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"amountReversed","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"product","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"price","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"offSessionType","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentType","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestDeclineType","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"retry.attempts","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"customer.email","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.billingAddress.country","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.shippingAddress.country","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.type","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"invoice.type","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"captureMethod","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"captureDelay","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"captureAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"statementDescriptor","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"isCaptured","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isReversed","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isFullyReversed","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isChargebacked","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"isRedirectRequired","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"latestTransaction","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.processorId","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"latestTransaction.gatewayProfile","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.lastFour","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.bin","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}},"gte":{"type":"string"},"lte":{"type":"string"}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.brand","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.expYear","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.expMonth","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.gatewayProfile","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.cascade","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.card.mode","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethodOptions.paypal.gatewayProfile","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmSource","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmMedium","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmCampaign","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmTerm","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmContent","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmId","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmContentid","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentSummaryReportResponseDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/reports/customer-value":{"get":{"operationId":"ReportingController_getCustomerValueReport","summary":"Customer value report","description":"Generates a customer value report with flexible grouping and metric calculations.","tags":["Reports"],"parameters":[{"name":"groupBy","in":"query","required":true,"schema":{"type":"string","examples":["createdAt"]},"description":"Field to group results by.\n\n**Available fields:** `createdAt`, `currency`, `product.name`, `price.name`, `attribution.utmSource`, `attribution.utmCampaign`"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `groupBy` when it is a date field. Defaults to `day`. `hour` additionally requires the query to be bounded to a `createdAt` range of at most two days. Accepts `hour`, `day`, `week`, `month`, `quarter`, `year`; anything else falls back to the default."},{"name":"secondaryGroupBy","in":"query","required":false,"schema":{"type":"string"},"description":"Optional second axis for pivoting (must differ from groupBy). Each row will then carry both the primary `groupBy` value and a `secondaryGroupBy` value.\n\n**Available fields:** `createdAt`, `currency`, `product.name`, `price.name`, `attribution.utmSource`, `attribution.utmCampaign`"},{"name":"secondaryGranularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `secondaryGroupBy` when it is a date field. Defaults to `day`."},{"name":"measures","in":"query","required":false,"schema":{"type":"string","examples":["fcQuantity,fcAmount,fcAov,upsellsQuantity,upsellsItemsCount,upsellsAmount,upsellsAov,totalAov,rebillsQuantity,rebillsItemsCount,rebillsAmount,ltv"]},"description":"Metrics to include in the results. Multiple measures can be specified as comma-separated values. If `measures` is not provided, all metrics specified in the config will be calculated.\n\n**Available metrics:** `fcQuantity`, `fcAmount`, `fcAov`, `upsellsQuantity`, `upsellsItemsCount`, `upsellsAmount`, `upsellsAov`, `totalAov`, `rebillsQuantity`, `rebillsItemsCount`, `rebillsAmount`, `ltv`"},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean","default":true},"description":"Whether to include a rollup row aggregating every group. Pass `false` to omit it."},{"name":"createdAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"displayStatus","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"gatewayProfile","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.type","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"price","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.billingAddress.country","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.shippingAddress.country","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmSource","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmMedium","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmCampaign","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmTerm","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmContent","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmId","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attribution.utmContentid","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerValueReportResponseDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/reports/projected-billing":{"get":{"operationId":"ReportingController_getProjectedBillingReport","summary":"Projected billing report","description":"Projects upcoming rebill and recycle (retry) attempts for active subscriptions in the queried period, using user-supplied approval-rate inputs (`rebillProjections` and `recycleProjections`, each a comma-separated list of 4 percentages 0..100 corresponding to Rebill/Recycle #1, #2, #3 and #4+).","tags":["Reports"],"parameters":[{"name":"groupBy","in":"query","required":true,"schema":{"type":"string","examples":["billingDate"]},"description":"Field to group results by.\n\n**Available fields:** `billingDate`, `currency`, `gatewayProfile`, `product.name`"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `groupBy` when it is a date field. Defaults to `day`. `hour` additionally requires the query to be bounded to a `createdAt` range of at most two days. Accepts `hour`, `day`, `week`, `month`, `quarter`, `year`; anything else falls back to the default."},{"name":"secondaryGroupBy","in":"query","required":false,"schema":{"type":"string"},"description":"Optional second axis for pivoting (must differ from groupBy). Each row will then carry both the primary `groupBy` value and a `secondaryGroupBy` value.\n\n**Available fields:** `billingDate`, `currency`, `gatewayProfile`, `product.name`"},{"name":"secondaryGranularity","in":"query","required":false,"schema":{"type":"string"},"description":"Date granularity for `secondaryGroupBy` when it is a date field. Defaults to `day`."},{"name":"measures","in":"query","required":false,"schema":{"type":"string","examples":["rebillsCount,projectedRevenue,rebillBucket1Count,rebillBucket1BaseAmount,rebillBucket2Count,rebillBucket2BaseAmount,rebillBucket3Count,rebillBucket3BaseAmount,rebillBucketAdditionalCount,rebillBucketAdditionalBaseAmount,recycleBucket1Count,recycleBucket1BaseAmount,recycleBucket2Count,recycleBucket2BaseAmount,recycleBucket3Count,recycleBucket3BaseAmount,recycleBucketAdditionalCount,recycleBucketAdditionalBaseAmount"]},"description":"Metrics to include in the results. Multiple measures can be specified as comma-separated values. If `measures` is not provided, all metrics specified in the config will be calculated.\n\n**Available metrics:** `rebillsCount`, `projectedRevenue`, `rebillBucket1Count`, `rebillBucket1BaseAmount`, `rebillBucket2Count`, `rebillBucket2BaseAmount`, `rebillBucket3Count`, `rebillBucket3BaseAmount`, `rebillBucketAdditionalCount`, `rebillBucketAdditionalBaseAmount`, `recycleBucket1Count`, `recycleBucket1BaseAmount`, `recycleBucket2Count`, `recycleBucket2BaseAmount`, `recycleBucket3Count`, `recycleBucket3BaseAmount`, `recycleBucketAdditionalCount`, `recycleBucketAdditionalBaseAmount`"},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean","default":true},"description":"Whether to include a rollup row aggregating every group. Pass `false` to omit it."},{"name":"billingDate","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"gatewayProfile","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"dueAmount","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"attemptType","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"attemptBucket","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"price","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"product","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"recycleProjections","in":"query","required":false,"schema":{"type":"string","examples":["25,15,10,5"]},"description":"Comma-separated list of exactly 4 approval-rate percentages (0..100) for upcoming Recycle #1, #2, #3 and #4+ attempts. Example: `25,15,10,5`. Defaults to `0,0,0,0`."},{"name":"rebillProjections","in":"query","required":false,"schema":{"type":"string","examples":["45,30,20,10"]},"description":"Comma-separated list of exactly 4 approval-rate percentages (0..100) for upcoming Rebill #1, #2, #3 and #4+ attempts. Example: `45,30,20,10`. Defaults to `0,0,0,0`."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectedBillingReportResponseDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/logs":{"get":{"operationId":"RequestLogController_findAllPaginated","summary":"Find all Request Logs","description":"Retrieve a paginated list of Request Logs. Each call is itself recorded as a Request Log, without a response body.","tags":["Logs"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"requestId","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"url","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"in":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"method","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"clientIp","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"statusCode","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"initiator","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/RequestLogDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/logs/{id}":{"get":{"operationId":"RequestLogController_findOne","summary":"Find one Request Log","description":"Retrieve a Request Log by its ID. Each call is itself recorded as a Request Log, without a response body.","tags":["Logs"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestLogDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/retry-policy":{"get":{"operationId":"RetryPolicyController_get","summary":"Get the Retry Policy","description":"Retrieve the retry policy of the authenticated merchant. Answers `404` until one is created.","tags":["Retry Policies"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryPolicyDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"RetryPolicyController_set","summary":"Set the Retry Policy","description":"Create the retry policy of the authenticated merchant, or replace it if one already exists.","tags":["Retry Policies"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRetryPolicyDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetryPolicyDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/search":{"get":{"operationId":"SearchController_search","summary":"Global search","description":"Search across payments, customers, subscriptions, and gateways. Results are filtered by the caller's permissions.","tags":["Search"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3,"examples":["john@example.com"]},"description":"Search query string to find matching payments, customers, subscriptions, invoices, and prices"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResultsDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/secret-keys":{"get":{"operationId":"SecretKeyController_findAllPaginated","summary":"Find all Secret Keys","description":"Retrieve a paginated list of Secret Keys","tags":["Secret Keys"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/SecretKeyDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"SecretKeyController_create","summary":"Create a Secret Key","description":"Create a new Secret Key","tags":["Secret Keys"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretKeyRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretKeyWithKeyDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/secret-keys/{id}":{"get":{"operationId":"SecretKeyController_findOne","summary":"Find one Secret Key","description":"Retrieve a Secret Key by its ID","tags":["Secret Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretKeyDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"SecretKeyController_update","summary":"Update a Secret Key","description":"Update an existing Secret Key by its ID","tags":["Secret Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretKeyRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretKeyDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/secret-keys/{id}/delete":{"post":{"operationId":"SecretKeyController_delete","summary":"Delete a Secret Key","description":"Delete a Secret Key by its ID","tags":["Secret Keys"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityRemovedDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/statistics/calendar":{"get":{"operationId":"StatisticsController_getCalendarData","summary":"Get data for upcoming calendar events","tags":["Statistics"],"parameters":[{"name":"startDate","in":"query","required":true,"schema":{"type":"string","examples":["2026-01-01"]},"description":"Start date in ISO 8601 format"},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","examples":["2026-01-31"]},"description":"End date in ISO 8601 format. Defaults to the end of the current month if not provided."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarDataDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions":{"get":{"operationId":"SubscriptionController_findAllPaginated","summary":"List all Subscriptions","description":"Returns a list of Subscriptions","tags":["Subscriptions"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"startDate","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"endDate","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"autoBillingEnabled","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"autoBillingDisabledAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"autoBillingDisabledReason","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"cancelAtPeriodEnd","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"cancelAtCycle","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"currentPeriodStart","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"currentPeriodEnd","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"currentCycle","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"metadata","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer.email","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"price","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"price.product","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"setupInvoice.payment","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"price.product.name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"upcomingInvoice.periodStart","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"invoices.payment.retry.nextAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","status","currentPeriodStart","currentPeriodEnd","startDate","endDate"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionPartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}":{"get":{"operationId":"SubscriptionController_findOne","summary":"Retrieve a Subscription","description":"Retrieves a Subscription by its ID","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"SubscriptionController_update","summary":"Update a Subscription","description":"Updates a Subscription based on previously generated preview","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriptionPlanRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}/related":{"get":{"operationId":"SubscriptionController_findRelated","summary":"List related Subscriptions","description":"Returns the other Subscriptions of the same Customer that were bought together with this one: those sharing its setup payment, plus — when the merchant has configured a grouping window — those created within that many minutes of it. Read-only; nothing is cancelled or changed.","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelatedSubscriptionsDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}/cancel":{"post":{"operationId":"SubscriptionController_cancel","summary":"Cancel a Subscription","description":"Schedules a Subscription cancellation for the end of the current billing cycle (the default), for the end of the next one, or applies it immediately","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}/resume":{"post":{"operationId":"SubscriptionController_resume","summary":"Resume a Subscription","description":"Reverts a scheduled cancellation for a Subscription, whichever cycle it was booked against","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}/reactivate":{"post":{"operationId":"SubscriptionController_reactivate","summary":"Reactivate a Subscription","description":"Restarts billing on an active Subscription whose billing has stopped. A new billing period starts now, and its charge is taken within a few minutes. Periods that were not paid while billing was stopped are not charged. Fails with `invalid_state_error` if the Subscription is not active, is still billing, is scheduled for cancellation, has an open invoice that can still be paid, has a paid period that has not ended or had its latest renewal paid by a retry, is still processing the outcome of its latest renewal (try again in a few minutes), or is in a billing period that has not started yet","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/subscriptions/{id}/preview":{"post":{"operationId":"SubscriptionController_generateUpdatePreview","summary":"Preview a Subscription update","description":"Generates a preview of the changes that would occur if the Subscription is updated","tags":["Subscriptions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateUpdatePreviewRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePreviewDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/transactions":{"get":{"operationId":"TransactionController_findAllPaginated","summary":"Find all Transactions","description":"Retrieve a paginated list of Transactions","tags":["Transactions"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"amount","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"currency","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"status","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"processorId","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"in":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"payment","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"gatewayProfile","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"customer","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"execution","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"outcome.authCode","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"in":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.bin","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"paymentMethod.card.brand","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","amount","status"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TransactionPartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/transactions/{id}":{"get":{"operationId":"TransactionController_findOne","summary":"Find one Transaction","description":"Retrieve a Transaction by its ID","tags":["Transactions"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/webhook-subscribers":{"get":{"operationId":"WebhookSubscriberController_findAllPaginated","summary":"Find all Webhook Subscribers","description":"Retrieve a paginated list of Webhook Subscribers","tags":["Webhook Subscribers"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookSubscriberDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"WebhookSubscriberController_create","summary":"Create a Webhook Subscriber","description":"Create a new Webhook Subscriber","tags":["Webhook Subscribers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookSubscriberRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriberWithSecretDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/webhook-subscribers/{id}":{"get":{"operationId":"WebhookSubscriberController_findOne","summary":"Find one Webhook Subscriber","description":"Retrieve a Webhook Subscriber by its ID","tags":["Webhook Subscribers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriberDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"WebhookSubscriberController_update","summary":"Update a Webhook Subscriber","description":"Update an existing Webhook Subscriber by its ID","tags":["Webhook Subscribers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookSubscriberRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookSubscriberDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/webhook-deliveries":{"get":{"operationId":"WebhookController_findAllDeliveriesPaginated","summary":"Find all Webhook Deliveries","description":"Retrieve a paginated list of webhook delivery records","tags":["Webhook Deliveries"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"firstDispatchedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"lastDispatchedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"abandonedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"success","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"attempts","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"latestResponseStatus","in":"query","schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"event.type","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"event","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"subscriber","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","firstDispatchedAt","lastDispatchedAt","abandonedAt","attempts"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookResponseDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes":{"get":{"operationId":"RouteController_findAllPaginated","summary":"Find all Routes","description":"Retrieve a paginated list of Routes, each with its active version.","tags":["Routes"],"parameters":[{"name":"id","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"name","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"like":{"type":"string"},"ilike":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"active","in":"query","schema":{"type":"object","properties":{"eq":{"type":"boolean"},"ne":{"type":"boolean"}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"updatedAt","in":"query","schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","schema":{"type":"string","enum":["id","createdAt","updatedAt","name","active"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/RoutePartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"RouteController_create","summary":"Create a Route","description":"Create a Route. A new Route has no versions: publish one to give it a decision tree.","tags":["Routes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRouteRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}":{"get":{"operationId":"RouteController_findOne","summary":"Find one Route","description":"Retrieve a Route by its ID, with the decision tree of its active version.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"RouteController_update","summary":"Update a Route","description":"Update a Route's name, description or active flag. To change its decision tree, publish a new version.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRouteRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/versions":{"post":{"operationId":"RouteController_publishVersion","summary":"Publish a Route version","description":"Publish a new version of a Route. A version cannot be changed once published. Every gateway profile it names must exist, be active and support card payments. Unless `activate` is `true`, the Route's active version stays as it is.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRouteVersionRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteVersionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"get":{"operationId":"RouteController_findAllVersionsPaginated","summary":"Find all versions of a Route","description":"Retrieve a paginated list of a Route's versions, without their decision trees.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string"},"ne":{"type":"string"},"in":{"type":"array","items":{"type":"string"}},"nin":{"type":"array","items":{"type":"string"}}}},"style":"deepObject","explode":true},{"name":"number","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"number"},"ne":{"type":"number"},"gt":{"type":"number"},"gte":{"type":"number"},"lt":{"type":"number"},"lte":{"type":"number"},"in":{"type":"array","items":{"type":"number"}},"nin":{"type":"array","items":{"type":"number"}}}},"style":"deepObject","explode":true},{"name":"createdAt","in":"query","required":false,"schema":{"type":"object","properties":{"eq":{"type":"string","format":"date-time"},"ne":{"type":"string","format":"date-time"},"gt":{"type":"string","format":"date-time"},"gte":{"type":"string","format":"date-time"},"lt":{"type":"string","format":"date-time"},"lte":{"type":"string","format":"date-time"},"in":{"type":"array","items":{"type":"string","format":"date-time"}},"nin":{"type":"array","items":{"type":"string","format":"date-time"}}}},"style":"deepObject","explode":true},{"name":"sortDirection","in":"query","required":false,"schema":{"type":"string","enum":["ASC","DESC","asc","desc"]},"description":"Sort direction. Defaults to ASC."},{"name":"sortBy","in":"query","required":false,"schema":{"type":"string","enum":["id","createdAt","number"]},"description":"Field to sort by. Defaults to createdAt."},{"name":"limit","in":"query","required":false,"schema":{"type":"number"},"description":"Number of items per page. Defaults to 10, capped at 100. Send 0 to return no items, which is how you ask for \"withTotal\"'s count without fetching a page you do not need."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Opaque cursor from a previous response (\"nextCursor\" or \"prevCursor\"). Send it back with the same \"sortBy\" and \"sortDirection\" — the cursor encodes them and a request that disagrees is rejected. \"limit\" may change between pages and simply changes the page size. Omit \"cursor\" for the first page."},{"name":"withTotal","in":"query","required":false,"schema":{"type":"boolean"},"description":"Set to true to also return how many items match the filters, as \"totalCount\" in the response's pagination. The count ignores \"cursor\", so it does not change as you page — fetch it once per set of filters rather than on every page. Counting stops at 10000, above which \"totalCountIsExact\" is false. Omit this parameter to skip the count entirely."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"properties":{"pagination":{"$ref":"#/components/schemas/CursorPageMetaDTO"},"data":{"type":"array","items":{"$ref":"#/components/schemas/RouteVersionPartialDTO"}}}}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/versions/{version}":{"get":{"operationId":"RouteController_findVersion","summary":"Find one version of a Route","description":"Retrieve one version of a Route by its ID, with its decision tree.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteVersionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/activate":{"post":{"operationId":"RouteController_activate","summary":"Activate a Route version","description":"Make one of the Route's versions the active one. To roll back, activate an earlier version.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateRouteVersionRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/draft":{"get":{"operationId":"RouteController_findDraft","summary":"Find a Route's draft","description":"Retrieve the Route's draft: the unfinished edit last saved with Save a Route draft. Answers `404` when the Route has no draft.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDraftDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]},"post":{"operationId":"RouteController_saveDraft","summary":"Save a Route draft","description":"Save an unfinished edit of the decision tree, to come back to later. A Route has at most one draft: this creates it, or replaces its tree. A draft is not a version. No payment is routed by it, and it cannot be activated until you publish it. Each save gives the draft a higher `revision`, and a Route never gives the same `revision` to two drafts. Send the `revision` you edited from, or `0` when the Route had no draft, and a save made after someone else's is refused instead of replacing their tree.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRouteDraftRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteDraftDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will). It is also answered when you send `revision` and the draft is at a different revision, the Route has no draft, or you sent `0` and the Route has a draft (`code` is `stale_revision`). The draft is left unchanged. Retrying will not help: read the draft again, then save against its current `revision`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/draft/delete":{"post":{"operationId":"RouteController_deleteDraft","summary":"Delete a Route draft","description":"Discard the Route's draft. Its versions are not affected. Send the draft's `revision` you mean to discard, so a draft someone saved after you read it is not deleted. The body is optional: without it, the draft is discarded whatever its revision.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteRouteDraftRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityRemovedDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will). It is also answered when you send `revision` and the draft is at a different revision, or the Route has no draft (`code` is `stale_revision`). Nothing is deleted. Retrying will not help: read the draft again before you decide to discard its current `revision`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/draft/publish":{"post":{"operationId":"RouteController_publishDraft","summary":"Publish a Route draft","description":"Publish the Route's draft as a new version and delete the draft. The draft's tree must pass every check Publish a Route version applies. If it does not, nothing is published and the draft is kept. Unless `activate` is `true`, the Route's active version stays as it is. Send the draft's `revision` you reviewed, so a draft saved after you read it is not published.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRouteDraftRequestDTO"}}}},"responses":{"201":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteVersionDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`type` is `conflict_error`. The supplied `X-Idempotency-Key` was already used with a different request body (`code` is `idempotency_conflict`, and retrying will not help), or the resource is being modified by another in-flight request (`code` is `resource_locked`, and retrying with backoff will). It is also answered when you send `revision` and the draft is at a different revision, the Route has no draft, or you sent `0` and the Route has a draft (`code` is `stale_revision`). Nothing is published, the active version stays as it is and the draft is kept. Retrying will not help: read the draft again and check it before you publish its current `revision`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}},"/v2/routes/{id}/evaluation":{"post":{"operationId":"RouteEvaluationController_evaluate","summary":"Evaluate a Route","description":"Shows where a Route would send a payment, without creating one. Send the payment's facts, and either a published `version`, a `tree` you have not published, or neither to use the active version. The answer lists the gateway profiles the payment would be sent to, in order, and every node the Route reached on the way. Nothing is charged or stored. Gateway profiles are taken as they are now, so an inactive one is skipped. A `roundRobin` pool starts where the next payment would start it. A `weighted` pool draws a new random order on every request, as each payment does.","tags":["Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRouteRequestDTO"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RouteEvaluationDTO"}}}},"202":{"description":"The merchant is entitled but its environment is not provisioned yet. Provisioning has been kicked off (exactly once) and is in progress; retry the request — it succeeds once the environment is ready. Returned only for identity-token (dashboard) requests bound to a merchant, not for secret-key API calls; any such endpoint can return it while provisioning is underway.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningInProgress"}}}},"400":{"description":"The request was rejected. `type` is `invalid_request_error` when the request itself is at fault — `errors` then lists every problem found, with field-attributable entries prefixed by the field’s path; or `invalid_state_error` when the request was well-formed but the resource is not in a state that allows it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"401":{"description":"No API key was supplied, or the key is not valid. `type` is `authentication_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The API key is valid but lacks the permission this operation requires. `type` is `permission_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No resource exists with the requested identifier. `type` is `not_found_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests. A limit applies per operation; requests to other operations are unaffected. `type` is `rate_limit_error`. Use the `Retry-After-global` header to know when to retry.","headers":{"Retry-After-global":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"The request could not be completed because of an unexpected error. `type` is `api_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The request could not be served right now: the API is temporarily at capacity, or a dependency needed to authorize the request is unavailable — the auth service that verifies credentials, or the entitlement lookup behind it. `type` is `api_error`. It is raised before the operation runs, so the request had no effect, and unlike a plain 500 the condition is transient: retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"The request exceeded the processing time limit and was abandoned. `type` is `api_error` and `code` is `timeout` — unlike a plain 500 the request may still have taken effect, so retry with the same idempotency key rather than blindly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"bearer":[]}]}}},"webhooks":{"customer.created":{"post":{"operationId":"Webhook_customer_created","summary":"customer.created","description":"Sent when a customer is created.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CustomerWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["customer.created"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"customer.updated":{"post":{"operationId":"Webhook_customer_updated","summary":"customer.updated","description":"Sent when the customer changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CustomerWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["customer.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"blacklist.added":{"post":{"operationId":"Webhook_blacklist_added","summary":"blacklist.added","description":"Sent when an email address is added to the blacklist.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BlacklistWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["blacklist.added"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"blacklist.removed":{"post":{"operationId":"Webhook_blacklist_removed","summary":"blacklist.removed","description":"Sent when an email address is removed from the blacklist. `data` is the entry as it was when removed.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/BlacklistWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["blacklist.removed"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"subscription.active":{"post":{"operationId":"Webhook_subscription_active","summary":"subscription.active","description":"Sent when a subscription becomes active.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SubscriptionWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["subscription.active"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"subscription.cancelled":{"post":{"operationId":"Webhook_subscription_cancelled","summary":"subscription.cancelled","description":"Sent when a subscription is cancelled.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SubscriptionWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["subscription.cancelled"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"subscription.updated":{"post":{"operationId":"Webhook_subscription_updated","summary":"subscription.updated","description":"Sent when the subscription changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SubscriptionWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["subscription.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.created":{"post":{"operationId":"Webhook_payment_created","summary":"payment.created","description":"Sent when a payment is created.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.created"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.succeeded":{"post":{"operationId":"Webhook_payment_succeeded","summary":"payment.succeeded","description":"Sent when a payment is authorized.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.succeeded"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.captured":{"post":{"operationId":"Webhook_payment_captured","summary":"payment.captured","description":"Sent when a payment is captured and the funds are collected.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.captured"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.attempt_failed":{"post":{"operationId":"Webhook_payment_attempt_failed","summary":"payment.attempt_failed","description":"Sent when a payment attempt fails: the processor declined it, a payment awaiting customer action returned to `open` without being authorized, or the processor denied a payment it had held for review, which returns a payment already reported by `payment.succeeded` to `open`. When a cascade or route moves a payment on to another gateway, it is sent for each attempt that failed, so it can arrive before `payment.succeeded` for the same payment. Retrieve the payment to see whether it is still open.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.attempt_failed"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.requires_action":{"post":{"operationId":"Webhook_payment_requires_action","summary":"payment.requires_action","description":"Sent when a payment needs an action from the customer, such as a 3D Secure challenge.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.requires_action"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.updated":{"post":{"operationId":"Webhook_payment_updated","summary":"payment.updated","description":"Sent when the payment changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include. It can arrive alongside a more specific payment event, or on its own.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.cancelled":{"post":{"operationId":"Webhook_payment_cancelled","summary":"payment.cancelled","description":"Sent when a payment is cancelled.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.cancelled"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.chargebacked":{"post":{"operationId":"Webhook_payment_chargebacked","summary":"payment.chargebacked","description":"Sent when a payment is charged back.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.chargebacked"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"payment.reversed":{"post":{"operationId":"Webhook_payment_reversed","summary":"payment.reversed","description":"Sent when a payment is refunded or voided.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaymentWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["payment.reversed"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"transaction.reverse_failed":{"post":{"operationId":"Webhook_transaction_reverse_failed","summary":"transaction.reverse_failed","description":"Sent when a refund or void of a transaction fails.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/TransactionWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["transaction.reverse_failed"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"transaction.capture_failed":{"post":{"operationId":"Webhook_transaction_capture_failed","summary":"transaction.capture_failed","description":"Sent when a capture of a transaction fails.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/TransactionWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["transaction.capture_failed"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"invoice.created":{"post":{"operationId":"Webhook_invoice_created","summary":"invoice.created","description":"Sent when an invoice is created.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/InvoiceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["invoice.created"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"invoice.paid":{"post":{"operationId":"Webhook_invoice_paid","summary":"invoice.paid","description":"Sent when an invoice is paid.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/InvoiceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["invoice.paid"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"invoice.voided":{"post":{"operationId":"Webhook_invoice_voided","summary":"invoice.voided","description":"Sent when an invoice is voided.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/InvoiceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["invoice.voided"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"invoice.updated":{"post":{"operationId":"Webhook_invoice_updated","summary":"invoice.updated","description":"Sent when the invoice changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/InvoiceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["invoice.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"product.created":{"post":{"operationId":"Webhook_product_created","summary":"product.created","description":"Sent when a product is created.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ProductWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["product.created"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"product.updated":{"post":{"operationId":"Webhook_product_updated","summary":"product.updated","description":"Sent when the product changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ProductWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["product.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"price.created":{"post":{"operationId":"Webhook_price_created","summary":"price.created","description":"Sent when a price is created.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PriceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["price.created"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"price.updated":{"post":{"operationId":"Webhook_price_updated","summary":"price.updated","description":"Sent when the price changes. On payload version 2 that includes every change to a field of `data` other than `updatedAt`; it can also be sent for a change to a field `data` does not include.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PriceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["price.updated"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}},"price.deleted":{"post":{"operationId":"Webhook_price_deleted","summary":"price.deleted","description":"Sent when a price is deleted. `data` is the price as it was when deleted.\n\nThis describes webhook payload version 2. Version 1 sends the same envelope, with `data` in the shape of the object's retrieve endpoint; the Webhooks guide explains both.","tags":["Webhooks"],"parameters":[{"in":"header","name":"X-Webhook-HMAC","required":true,"description":"The HMAC-SHA256 of the raw request body, keyed with the subscriber's shared secret, as a hex string. Verify it before trusting the body.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Id","required":true,"description":"The ID of the delivery. It stays the same when the delivery is retried.","schema":{"type":"string"}},{"in":"header","name":"X-Webhook-Attempt","required":true,"description":"Which attempt this is, starting at 1.","schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PriceWebhookEvent"},{"type":"object","properties":{"eventType":{"type":"string","enum":["price.deleted"]}}}]}}}},"responses":{"2XX":{"description":"Acknowledges the delivery. Respond within 15 seconds; any other response, or none, is retried."}}}}},"jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema"}