{"openapi":"3.0.0","paths":{"/v1/payments/auth-and-capture":{"post":{"description":"Authorizes and captures the requested amount in a single operation. The request can optionally save the payment method for future use. When the issuer requires 3-D Secure, the call returns 201 with status REQUIRES_ACTION and a nextAction redirect for the customer; the final state settles asynchronously (poll GET /payments/:id).","operationId":"authAndCapture_v1","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthAndCaptureDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthAndCaptureResponseDto"}}}},"400":{"description":"Validation failure, upstream provider decline, or merchant limit exceeded (per-transaction, daily, or monthly).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ValidationErrorResponseDto"},{"$ref":"#/components/schemas/AuthAndCaptureDeclinedResponseDto"}]}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}},"409":{"description":"A request with this Idempotency-Key is already in flight."},"422":{"description":"Idempotency-Key was reused with a different request body."},"429":{"description":"A velocity check refused the charge (`code: VELOCITY_LIMIT`, no `Retry-After`); nothing was charged and no payment was recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VelocityLimitErrorResponseDto"}}}}},"summary":"Authorize and capture a payment","tags":["Payments"]}},"/v1/payments/auth":{"post":{"description":"Authorizes the requested amount and leaves the payment in the AUTHORIZED state for later capture or void. The request can optionally save the payment method for future use. When the issuer requires 3-D Secure, the call returns 201 with status REQUIRES_ACTION and a nextAction redirect for the customer; the final state settles asynchronously (poll GET /payments/:id).","operationId":"auth_v1","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"400":{"description":"Validation failure, upstream provider decline, or merchant limit exceeded (per-transaction, daily, or monthly).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ValidationErrorResponseDto"},{"$ref":"#/components/schemas/AuthDeclinedResponseDto"}]}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}},"409":{"description":"A request with this Idempotency-Key is already in flight."},"422":{"description":"Idempotency-Key was reused with a different request body."},"429":{"description":"A velocity check refused the charge (`code: VELOCITY_LIMIT`, no `Retry-After`); nothing was charged and no payment was recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VelocityLimitErrorResponseDto"}}}}},"summary":"Authorize a payment","tags":["Payments"]}},"/v1/payments/charge-saved-method":{"post":{"description":"Charges an active saved payment method again, with the customer present — an upsell after the checkout that saved it. The payment method must belong to the supplied customer and authenticated merchant. Every reuse is bounded by the card, whichever of its ids is charged (a checkout that saves a card again may return a new one): accepted for 24 hours after the card was first saved (never extended), at most 2 approved reuses per card (in-progress ones included; a decline does not count) and at most 5 attempts in all, counted together with reuses through the SDK, each for at most the amount of the payment that first saved the card; a reuse outside those bounds answers 409 with a `reason` and charges nothing. The gateway finds the payment that first saved the card itself. Depending on how your account processes payments, the charge either captures immediately (response status CAPTURED) or is accepted and collected asynchronously (response status PENDING — the payment settles to CAPTURED or DECLINED shortly after; follow it with GET /payments/{paymentId}). An issuer that asks for authentication declines the reuse (`Additional authentication required`): this flow has no way to show a challenge.","operationId":"chargeSavedMethod_v1","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge. A 409 refusal is not stored: a retry under the same key is evaluated again.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargeSavedMethodDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChargeSavedMethodResponseDto"}}}},"400":{"description":"Validation failure; a refusal before any attempt — payment-method/customer mismatch, an expired or removed payment method, a method that is not chargeable on this account — which records no payment, carries no paymentId and spends no attempt; or a decline after the attempt — an issuer decline or a merchant limit — which carries the paymentId of the attempt and counts as an attempt (not as a reuse).","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ValidationErrorResponseDto"},{"$ref":"#/components/schemas/AuthAndCaptureDeclinedResponseDto"}]}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"404":{"description":"Unknown payment method, or another merchant’s (one answer for both), in the decline shape: `status: DECLINED` with `declinedReason: \"Payment method not found.\"`. Nothing was charged and no payment was recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedMethodNotFoundResponseDto"}}}},"409":{"description":"The reuse is outside its bounds (`reason`), or the payment method is still pending validation (`METHOD_NOT_READY`). Also, without a `reason`: a request with this Idempotency-Key is already in flight.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/SavedMethodReuseRefusedResponseDto"},{"$ref":"#/components/schemas/IdempotencyConflictErrorResponseDto"}]}}}},"422":{"description":"Idempotency-Key was reused with a different request body."},"429":{"description":"A velocity check refused the charge (`code: VELOCITY_LIMIT`, no `Retry-After`); nothing was charged and no payment was recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VelocityLimitErrorResponseDto"}}}}},"summary":"Charge a saved payment method","tags":["Payments"]}},"/v1/payments/checkout-session":{"post":{"description":"Creates a checkout for the supplied cart and returns the link to the page HighWire hosts for it. The total is computed here: the line items plus shipping and tax, minus the discount. Whoever holds the link can pay, on any device, until expiresAt, so hand it only to the shopper. It is returned once: a replay under the same Idempotency-Key answers without checkoutUrl, and POST /payments/{paymentId}/checkout-session/link issues a new one. Creating the link takes no money and checks none of your limits; the amount counts against them once the payment is captured. The payment settles asynchronously (poll GET /payments/{paymentId}). Answers 400 with code HW_UNSUPPORTED when hosted checkout is not enabled for the account.","operationId":"createCheckoutSession_v1","parameters":[{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge. A replay does not return checkoutUrl: the link is shown once.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionResponseDto"}}}},"400":{"description":"Validation failure, a total that disagrees with amount or falls outside the accepted range, or (code HW_UNSUPPORTED) an account the hosted checkout is not enabled for.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ValidationErrorResponseDto"},{"$ref":"#/components/schemas/BadRequestErrorResponseDto"},{"$ref":"#/components/schemas/HostedCheckoutUnsupportedResponseDto"}]}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"409":{"description":"A request with this Idempotency-Key is already in flight."},"422":{"description":"Idempotency-Key was reused with a different request body."}},"summary":"Create a hosted checkout link","tags":["Payments"]}},"/v1/payments/{id}/checkout-session/link":{"post":{"description":"Returns a new link for a hosted checkout that can still be paid and has not expired, and revokes the previous link at once: PENDING, REQUIRES_ACTION (a verification to resume), or DECLINED with a retry left (an issuer decline under the attempt limit). Use it when the link was lost (it is shown only once) or may have leaked; a payment already in progress on the old page (a wallet confirmation, for example) can still complete. The expiry does not change. Not idempotent: every call issues a new link, and an Idempotency-Key header is ignored.","operationId":"reissueCheckoutLink_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Payment id (UUID v7) of the hosted checkout","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReissueCheckoutLinkResponseDto"}}}},"400":{"description":"Malformed id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponseDto"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"404":{"description":"Unknown payment, another merchant’s, or not a HighWire-hosted checkout.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}},"409":{"description":"The checkout can no longer be paid (CAPTURED, EXPIRED, VOIDED, REFUNDED or a final decline), it has expired, or another reissue of it landed first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictErrorResponseDto"}}}}},"summary":"Reissue a hosted checkout link","tags":["Payments"]}},"/v1/payments/{id}/void":{"post":{"description":"Cancels an in-flight or authorized, uncaptured payment for its full amount. Captured payments cannot be voided and must be refunded instead.","operationId":"void_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Payment id (UUID v7)","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoidResponseDto"}}}},"400":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponseDto"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}}},"summary":"Void an authorized payment","tags":["Payments"]}},"/v1/payments/{id}/capture":{"post":{"description":"Captures the full amount of a successful, uncaptured authorization. Partial captures are not supported, and a payment that is already captured or being voided cannot be captured.","operationId":"capture_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Payment id (UUID v7)","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge. The exception is a 500 that says the operation was accepted: do not retry it; poll the payment.","required":false,"schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaptureResponseDto"}}}},"400":{"description":"Validation failure, the payment is not in a capturable state (not authorized, already captured, voided, or expired), or an upstream provider decline.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponseDto"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"403":{"description":"The account is limited to refunds and voids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}},"409":{"description":"A request with this Idempotency-Key is already in flight."},"422":{"description":"Idempotency-Key was reused with a different request body."}},"summary":"Capture an authorized payment","tags":["Payments"]}},"/v1/payments/{id}/refund":{"post":{"description":"Refunds a successfully captured payment. Provide an amount for a partial refund, or omit it to refund the entire remaining refundable balance; cumulative refunds cannot exceed the captured amount.","operationId":"refund_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Payment id","schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"Optional client-supplied retry key (≤255 chars; UUID v4 recommended). Don't use sensitive data — emails, PANs, or other personal identifiers. Identical requests retried with the same key return the original response. Mismatched bodies return 422; in-flight duplicates return 409. Keys are scoped per merchant + endpoint and expire after 24 hours. On 5xx, retry with the same key: a retry cannot create a duplicate charge. The exception is a 500 that says the operation was accepted: do not retry it; poll the payment.","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundResponseDto"}}}},"400":{"description":"Validation failure, refund not allowed (already refunded, wrong status, etc.), upstream provider decline, or merchant daily-refund limit exceeded.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ValidationErrorResponseDto"},{"$ref":"#/components/schemas/BadRequestErrorResponseDto"},{"$ref":"#/components/schemas/RefundDeclinedResponseDto"}]}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}},"409":{"description":"The payment has an open or lost dispute (`reason: PAYMENT_DISPUTED`; not stored against the Idempotency-Key, so the same key can be sent again once the dispute is won), or a request with this Idempotency-Key is already in flight."},"422":{"description":"Idempotency-Key was reused with a different request body."}},"summary":"Refund a captured payment","tags":["Payments"]}},"/v1/payments/{id}":{"get":{"description":"Returns the authenticated merchant's payment with status, amount totals, payment-method details, and transaction and refund history. Payments owned by another merchant are not returned.","operationId":"getPayment_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Payment id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPaymentResponseDto"}}}},"400":{"description":"Malformed id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponseDto"}}}},"401":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedErrorResponseDto"}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundErrorResponseDto"}}}}},"summary":"Retrieve a payment","tags":["Payments"]}}},"info":{"title":"High Wire Payments API","description":"Endpoints consumed by merchant payment integrations.","version":"1.0","contact":{}},"tags":[{"name":"Payments","description":"Create, manage, and retrieve merchant payments."}],"servers":[{"url":"https://api-payments-staging.highwirepayments.com","description":"Staging"},{"url":"https://api-payments.highwirepayments.com","description":"Production"}],"components":{"securitySchemes":{"basic":{"type":"http","scheme":"basic","description":"Basic HTTP authentication"}},"schemas":{"ValidationErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":400},"message":{"type":"string","example":"Some fields are invalid, please check the errors"},"fieldErrors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"example":{"amount":["amount must not be less than 1","amount must be an integer number"],"cardNumber":["cardNumber must be 12-19 digits with no spaces or separators"]}}},"required":["statusCode","message","fieldErrors"]},"BadRequestErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":400},"error":{"type":"string","example":"Bad Request"},"message":{"type":"string","example":"Payment has already been fully refunded"}},"required":["statusCode","error","message"]},"AuthAndCaptureDeclinedResponseDto":{"type":"object","properties":{"amount":{"type":"number","example":7200},"cardNumber":{"type":"string","example":"555555xxxxxxxx4444"},"cardExpiration":{"type":"string","example":"1133"},"cardholderName":{"type":"string","description":"Omitted on saved-PM declines (cardholderName not persisted).","example":"Jordan Example"},"paymentId":{"type":"string","description":"Saved-method reuses only: the payment the declined attempt filed (it counts as an attempt, not as a reuse).","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"customerId":{"type":"string","description":"Saved-method reuses only: the customer the saved card belongs to.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bcc"},"paymentMethodId":{"type":"string","description":"Saved-method reuses only: the saved card the declined attempt used.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bff"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"DECLINED"},"declinedReason":{"type":"string","description":"Human-readable reason for the decline, from a fixed set of HighWire wordings (for example \"Card declined\", \"Insufficient funds\", \"Additional authentication required\", \"Amount exceeds daily limit\"). Show it or log it; do not parse it.","example":"Card declined"}},"required":["amount","cardNumber","cardExpiration","status","declinedReason"]},"AuthDeclinedResponseDto":{"type":"object","properties":{"amount":{"type":"number","example":7200},"cardNumber":{"type":"string","example":"555555xxxxxxxx4444"},"cardExpiration":{"type":"string","example":"1133"},"cardholderName":{"type":"string","example":"Jordan Example"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"DECLINED"},"declinedReason":{"type":"string","description":"Human-readable reason for the decline, from a fixed set of HighWire wordings (for example \"Card declined\", \"Insufficient funds\", \"Additional authentication required\", \"Amount exceeds daily limit\"). Show it or log it; do not parse it.","example":"Card declined"}},"required":["amount","cardNumber","cardExpiration","status","declinedReason"]},"RefundDeclinedResponseDto":{"type":"object","properties":{"amount":{"type":"number","example":500},"paymentId":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"cardNumber":{"type":"string","nullable":true,"example":"555555xxxxxxxx4444"},"status":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","CANCELED"],"example":"FAILED","description":"The refund's own status. FAILED for a refund rejected on this call (provider decline or merchant limit). CANCELED only in the narrow race where the processor had already cancelled the refund — no money moved — before this call finished: the settled status is then reported instead of a synthetic FAILED."},"declinedReason":{"type":"string","description":"Human-readable reason for the failure, from a fixed set of HighWire wordings (for example \"Refund declined\", \"Insufficient funds\", \"Amount exceeds daily refund limit\"). Show it or log it; do not parse it.","example":"Refund declined"}},"required":["amount","paymentId","status","declinedReason"]},"HostedCheckoutUnsupportedResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":400},"error":{"type":"string","example":"Bad Request"},"code":{"type":"string","example":"HW_UNSUPPORTED"},"message":{"type":"string","example":"Hosted checkout is not enabled for this account"}},"required":["statusCode","error","code","message"]},"SavedMethodReuseRefusedResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":409},"message":{"type":"string","example":"This saved payment method has reached its reuse limit."},"reason":{"type":"string","enum":["ORIGINAL_NOT_SETTLED","ORIGINAL_NOT_ELIGIBLE","METHOD_NOT_READY","WINDOW_CLOSED","REUSE_LIMIT","ATTEMPT_LIMIT","AMOUNT_LIMIT"],"example":"REUSE_LIMIT","description":"ORIGINAL_NOT_SETTLED / METHOD_NOT_READY — the payment that saved the card has not been captured yet: retry later, the same Idempotency-Key included. ORIGINAL_NOT_ELIGIBLE — the payment that first saved the card was refunded in full, voided or otherwise not captured. WINDOW_CLOSED — more than 24 hours since the card was first saved. REUSE_LIMIT — the card was already charged again 2 times (approved or in progress). ATTEMPT_LIMIT — 5 attempts were already made with it, declined ones included. AMOUNT_LIMIT — the amount exceeds that of the payment that first saved the card; a smaller one may pass."}},"required":["statusCode","message","reason"]},"SavedMethodNotFoundResponseDto":{"type":"object","properties":{"amount":{"type":"number","example":7200,"description":"The amount in cents that was attempted."},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"DECLINED"},"declinedReason":{"type":"string","example":"Payment method not found."}},"required":["amount","status","declinedReason"]},"IdempotencyConflictErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":409},"error":{"type":"string","example":"Conflict"},"message":{"type":"string","example":"A request with this Idempotency-Key is already in progress"}},"required":["statusCode","error","message"]},"VelocityLimitErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":429},"message":{"type":"string","example":"Duplicate purchase blocked"},"code":{"type":"string","example":"VELOCITY_LIMIT","enum":["VELOCITY_LIMIT"]}},"required":["statusCode","message","code"]},"DeviceLocationDto":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"example":40.7128,"description":"Latitude in decimal degrees."},"lon":{"type":"number","minimum":-180,"maximum":180,"example":-74.006,"description":"Longitude in decimal degrees."}},"required":["lat","lon"]},"DeviceInfoDto":{"type":"object","properties":{"ip":{"type":"string","maxLength":45,"example":"203.0.113.42","description":"IP address of the cardholder, IPv4 or IPv6. Rejected if not a well-formed IP address."},"userAgent":{"type":"string","maxLength":1024,"example":"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) …","description":"Cardholder browser's User-Agent string."},"deviceFingerprint":{"type":"string","maxLength":128,"pattern":"^[\\w-]+$","example":"0199a1b2-c3d4-7e5f-8a9b-0c1d2e3f4a5b","description":"Reserved for integrations agreed with High Wire. Letters, digits, underscore and hyphen; max 128 characters."},"location":{"description":"The cardholder's approximate location.","allOf":[{"$ref":"#/components/schemas/DeviceLocationDto"}]}},"required":["ip","userAgent"]},"DeviceDataDto":{"type":"object","properties":{"device":{"$ref":"#/components/schemas/DeviceInfoDto"}},"required":["device"]},"AuthAndCaptureDto":{"type":"object","properties":{"amount":{"type":"number","minimum":1,"description":"Amount in cents","example":7200},"cardNumber":{"type":"string","pattern":"^\\d{12,19}$","example":"5555555555554444"},"cardExpiration":{"type":"string","example":"1133"},"cardCvv":{"type":"string","example":"456"},"cardholderName":{"type":"string","example":"Jordan Example"},"cardholderEmail":{"type":"string","example":"jordan@example.com"},"cardholderPhone":{"type":"string","example":"+14155550101"},"cardholderBillingAddress":{"type":"string","example":"100 Example Street"},"cardholderBillingZipcode":{"type":"string","example":"94105"},"cardholderBillingCity":{"type":"string","example":"Springfield"},"cardholderBillingState":{"type":"string","example":"CA"},"savePaymentMethodForFutureUse":{"type":"boolean","description":"Whether to save the payment method for future use. You must have the customer's consent to save the payment method.","default":false,"example":false},"deviceData":{"description":"Device + behavioral signals collected on the checkout page. When present, `device.ip` (IPv4 or IPv6) and `device.userAgent` are mandatory. See the Card payments guide for the full validated shape.","allOf":[{"$ref":"#/components/schemas/DeviceDataDto"}]},"riskSessionKey":{"type":"string","maxLength":100,"description":"The value riskSessionKey() returns from the HighWire collector (HighWireCollect from @highwirepayments/payment-sdk/collect) on your checkout page, forwarded unchanged; omit it when the collector returns null.","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"}},"required":["amount","cardNumber","cardExpiration","cardCvv","cardholderName","cardholderEmail","cardholderPhone","cardholderBillingAddress","cardholderBillingZipcode","cardholderBillingCity","cardholderBillingState"]},"PaymentNextActionDto":{"type":"object","properties":{"kind":{"type":"string","enum":["REDIRECT","REDIRECT_FORM"],"example":"REDIRECT"},"url":{"type":"string","example":"https://pay.gateway.example/3ds/redirect/…","description":"Challenge URL. Opaque and time-limited — do not parse or rewrite."},"method":{"type":"string","enum":["GET","POST"],"example":"GET"},"data":{"type":"object","additionalProperties":{"type":"string"},"description":"REDIRECT_FORM only: fields to POST to `url` as a form submit."},"fallbackUrl":{"type":"string","description":"Alternate URL to open when the primary redirect cannot be rendered."}},"required":["kind","url","method"]},"AuthAndCaptureResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"CAPTURED","description":"CAPTURED on settle; PENDING while the provider finalizes; REQUIRES_ACTION when the customer must complete a verification step (see nextAction)."},"amount":{"type":"number","example":7200,"description":"Amount in cents that was captured."},"cardNumber":{"type":"string","example":"555555xxxxxxxx4444","description":"Masked card number."},"cardExpiration":{"type":"string","example":"1133"},"cardholderName":{"type":"string","description":"Name on the card. Returned on the raw-card flow (auth-and-capture); omitted on charge-saved-method since cardholderName is not persisted.","example":"Jordan Example"},"customerId":{"type":"string","description":"Populated when the request saved a new payment method (auth-and-capture with savePaymentMethodForFutureUse=true) or charged an existing one (charge-saved-method). Persist this id alongside paymentMethodId to charge the customer again later.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bcc"},"paymentMethodId":{"type":"string","description":"Id of the saved payment method, paired with customerId. Send both to /payments/charge-saved-method to charge the customer again without re-collecting card data.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bff"},"nextAction":{"description":"Present only when status is REQUIRES_ACTION: the customer must complete a verification step (3-D Secure). Render it per its kind, then poll GET /payments/:id for the final state. When savePaymentMethodForFutureUse was true, the returned paymentMethodId is a pending save — not chargeable until the payment settles to its success state.","allOf":[{"$ref":"#/components/schemas/PaymentNextActionDto"}]}},"required":["paymentId","status","amount","cardNumber","cardExpiration"]},"UnauthorizedErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":401},"error":{"type":"string","example":"Unauthorized"},"message":{"type":"string","example":"Invalid credentials","description":"Also answered, with this same body, when the credentials are valid but the account is not active."}},"required":["statusCode","error","message"]},"ForbiddenErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":403},"error":{"type":"string","example":"Forbidden"},"message":{"type":"string","example":"Merchant account can only process refunds and voids"}},"required":["statusCode","error","message"]},"NotFoundErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":404},"error":{"type":"string","example":"Not Found"},"message":{"type":"string","example":"Payment not found: 01928e1c-2a4d-7c8e-8b1a-1234567890ab"}},"required":["statusCode","error","message"]},"AuthDto":{"type":"object","properties":{"amount":{"type":"number","minimum":1,"description":"Amount in cents","example":7200},"cardNumber":{"type":"string","pattern":"^\\d{12,19}$","example":"5555555555554444"},"cardExpiration":{"type":"string","example":"1133"},"cardCvv":{"type":"string","example":"456"},"cardholderName":{"type":"string","example":"Jordan Example"},"cardholderEmail":{"type":"string","example":"jordan@example.com"},"cardholderPhone":{"type":"string","example":"+14155550101"},"cardholderBillingAddress":{"type":"string","example":"100 Example Street"},"cardholderBillingZipcode":{"type":"string","example":"94105"},"cardholderBillingCity":{"type":"string","example":"Springfield"},"cardholderBillingState":{"type":"string","example":"CA"},"savePaymentMethodForFutureUse":{"type":"boolean","description":"Whether to save the payment method for future use. You must have the customer's consent to save the payment method.","default":false,"example":false},"deviceData":{"description":"Device + behavioral signals collected on the checkout page. When present, `device.ip` (IPv4 or IPv6) and `device.userAgent` are mandatory. See the Card payments guide for the full validated shape.","allOf":[{"$ref":"#/components/schemas/DeviceDataDto"}]},"riskSessionKey":{"type":"string","maxLength":100,"description":"The value riskSessionKey() returns from the HighWire collector (HighWireCollect from @highwirepayments/payment-sdk/collect) on your checkout page, forwarded unchanged; omit it when the collector returns null.","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"}},"required":["amount","cardNumber","cardExpiration","cardCvv","cardholderName","cardholderEmail","cardholderPhone","cardholderBillingAddress","cardholderBillingZipcode","cardholderBillingCity","cardholderBillingState"]},"AuthResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"AUTHORIZED","description":"AUTHORIZED on settle; PENDING while the provider finalizes; REQUIRES_ACTION when the customer must complete a verification step (see nextAction)."},"amount":{"type":"number","example":7200,"description":"Amount in cents that was authorized."},"cardNumber":{"type":"string","example":"555555xxxxxxxx4444","description":"Masked card number."},"cardExpiration":{"type":"string","example":"1133"},"cardholderName":{"type":"string","description":"Name on the card. Returned on the raw-card auth flow.","example":"Jordan Example"},"customerId":{"type":"string","description":"Populated when the request saved a new payment method (savePaymentMethodForFutureUse=true). Persist this id alongside paymentMethodId to charge the customer again later.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bcc"},"paymentMethodId":{"type":"string","description":"Id of the saved payment method, paired with customerId. Send both to /payments/charge-saved-method to charge the customer again without re-collecting card data.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bff"},"nextAction":{"description":"Present only when status is REQUIRES_ACTION: the customer must complete a verification step (3-D Secure). Render it per its kind, then poll GET /payments/:id for the final state. When savePaymentMethodForFutureUse was true, the returned paymentMethodId is a pending save — not chargeable until the payment settles to its success state.","allOf":[{"$ref":"#/components/schemas/PaymentNextActionDto"}]}},"required":["paymentId","status","amount","cardNumber","cardExpiration"]},"ChargeSavedMethodDto":{"type":"object","properties":{"amount":{"type":"number","minimum":100,"description":"Amount in cents. At least 100, and at most the amount of the payment that first saved the card, whichever of its ids is charged.","example":7200},"customerId":{"type":"string","format":"uuid","description":"Customer id returned by the checkout that saved the method.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"paymentMethodId":{"type":"string","format":"uuid","description":"Payment method id returned by the checkout that saved it (a direct charge with savePaymentMethodForFutureUse, or a Payment SDK checkout). Must belong to customerId.","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bff"}},"required":["amount","customerId","paymentMethodId"]},"ChargeSavedMethodResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"CAPTURED","description":"Current status of the payment as persisted. CAPTURED — the charge settled synchronously. PENDING — the charge was accepted and is collected asynchronously: the payment settles to CAPTURED or DECLINED shortly after; follow it with GET /payments/{paymentId}. When a concurrent settle landed first, this echoes that settled status."},"amount":{"type":"number","example":7200,"description":"Amount in cents that was charged."},"customerId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bcc"},"paymentMethodId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9bff"}},"required":["paymentId","status","amount","customerId","paymentMethodId"]},"HostedCheckoutLineItemDto":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"example":"Test Widget","minLength":1,"description":"Shown to the shopper on the checkout page."},"amount":{"type":"number","minimum":1,"description":"Unit price in cents.","example":2000},"quantity":{"type":"number","minimum":1,"example":1}},"required":["name","amount","quantity"]},"CreateCheckoutSessionDto":{"type":"object","properties":{"lineItems":{"minItems":1,"maxItems":100,"type":"array","items":{"$ref":"#/components/schemas/HostedCheckoutLineItemDto"}},"shippingAmount":{"type":"number","minimum":0,"description":"Shipping in cents. Defaults to 0.","example":500},"taxAmount":{"type":"number","minimum":0,"description":"Tax in cents. Defaults to 0.","example":600},"discountAmount":{"type":"number","minimum":0,"description":"Discount in cents, subtracted from the total. Defaults to 0.","example":1000},"amount":{"type":"number","minimum":1,"description":"Optional cross-check, in cents. The gateway computes the total itself (the line items plus shipping and tax, minus the discount); a different value here answers 400.","example":7200},"currency":{"type":"string","example":"usd","description":"ISO 4217, case-insensitive. Only usd is served today."},"customerEmail":{"type":"string","format":"email","description":"The customer's e-mail. Stored with the customer; the checkout page shows it only masked, and whoever pays may leave the page’s e-mail field blank to use it.","example":"customer@example.com"},"successUrl":{"type":"string","maxLength":2048,"description":"Where the checkout page sends the shopper once the payment is captured: https (http only on a loopback host).","example":"https://merchant.example.com/checkout/success"},"cancelUrl":{"type":"string","maxLength":2048,"description":"Where the checkout page sends a shopper who leaves without paying: https (http only on a loopback host).","example":"https://merchant.example.com/checkout/cancel"},"savePaymentMethodForFutureUse":{"type":"boolean","example":false,"description":"True shows the shopper an unticked save-card box with the card form; the card is saved only if they tick it and pay by card (a wallet never saves). False shows no box and saves nothing. Fixed for the life of the link. True is refused (400) on an account whose hosted checkout cannot save cards. Required: there is no default."},"expiresInMinutes":{"type":"number","minimum":30,"maximum":1440,"description":"How long the link stays payable, in minutes. Reissuing it does not extend it.","default":1440},"referenceId":{"type":"string","maxLength":128,"description":"The merchant's own reference for the order (an order number, a cart id).","example":"order-1042"},"metadata":{"type":"object","additionalProperties":true,"description":"Any JSON object of at most 4096 bytes, stored with the payment exactly as sent. HighWire never reads it.","example":{"cartId":"c_123"}}},"required":["lineItems","currency","successUrl","cancelUrl","savePaymentMethodForFutureUse"]},"CreateCheckoutSessionResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"PENDING"},"amount":{"type":"number","example":7200,"description":"The total in cents: the line items plus shipping and tax, minus the discount."},"currency":{"type":"string","example":"usd"},"checkoutUrl":{"type":"string","example":"https://checkout.highwirepayments.com/01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b#hw_hc_…","description":"The link to hand the shopper; whoever holds it can pay, on any device, so pass it on as you would a password reset link. Returned once — an Idempotency-Key replay answers without it, because the link is not stored; get a new one from POST /payments/{paymentId}/checkout-session/link, which also revokes this one."},"expiresAt":{"type":"string","example":"2026-09-30T12:00:00.000Z","description":"When the link stops being payable (ISO 8601)."},"customerId":{"type":"string","description":"Reserved for when the checkout page saves payment methods; absent while savePaymentMethodForFutureUse must be false."},"paymentMethodId":{"type":"string","description":"Reserved, like customerId, for when the checkout page saves payment methods."}},"required":["paymentId","status","amount","currency","expiresAt"]},"ReissueCheckoutLinkResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"checkoutUrl":{"type":"string","example":"https://checkout.highwirepayments.com/01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b#hw_hc_…","description":"The new link. The previous one stopped working when this one was issued."},"expiresAt":{"type":"string","example":"2026-09-30T12:00:00.000Z","description":"Unchanged by the reissue: the expiry set when the checkout was created."}},"required":["paymentId","checkoutUrl","expiresAt"]},"ConflictErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":409},"error":{"type":"string","example":"Conflict"},"message":{"type":"string","example":"The checkout can no longer be paid (payment CAPTURED); create a new one"}},"required":["statusCode","error","message"]},"VoidResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"VOIDED"},"amount":{"type":"number","example":7200,"description":"Amount in cents that was voided."},"cardNumber":{"type":"string","nullable":true,"example":"555555xxxxxxxx4444","description":"Masked card number of the voided payment; null for wallet payments."}},"required":["paymentId","status","amount"]},"CaptureResponseDto":{"type":"object","properties":{"paymentId":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"CAPTURED"},"amount":{"type":"number","example":7200,"description":"Amount in cents that was captured."},"cardNumber":{"type":"string","nullable":true,"example":"555555xxxxxxxx4444","description":"Masked card number of the captured payment; null for wallet payments."}},"required":["paymentId","status","amount"]},"RefundDto":{"type":"object","properties":{"amount":{"type":"number","minimum":1,"example":500,"description":"An amount in cents value may be provided that will only refund part of the payment. If this value is omitted, the entire remaining refundable balance will be refunded. The sum of partial refunds cannot exceed the original captured amount."},"reason":{"type":"string","maxLength":255,"example":"customer request","description":"Optional free-form reason recorded against the refund, for your own records."}}},"RefundResponseDto":{"type":"object","properties":{"refundId":{"type":"string","example":"01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b"},"paymentId":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"status":{"type":"string","enum":["PENDING","SUCCEEDED","FAILED","CANCELED"],"example":"SUCCEEDED","description":"This REFUND's own status, as persisted. SUCCEEDED — the money is on its way back. PENDING — the processor accepted the refund and is still settling it; it resolves to SUCCEEDED, FAILED or CANCELED asynchronously, so follow it with GET /payments/{paymentId} (the refund appears in the payment's history). The PAYMENT's own terminal state (PARTIALLY_REFUNDED / REFUNDED) lives on the payment row, not here."},"amount":{"type":"number","example":500,"description":"Amount in cents that was refunded."},"remainingRefundableAmount":{"type":"number","example":6500,"description":"Remaining refundable balance after this refund (in cents)."},"cardNumber":{"type":"string","nullable":true,"example":"555555xxxxxxxx4444","description":"Masked card number of the refunded payment; null for wallet payments."}},"required":["refundId","paymentId","status","amount","remainingRefundableAmount"]},"PaymentTransactionItemDto":{"type":"object","properties":{"id":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"object":{"type":"string","example":"transaction","description":"'transaction' or 'refund'."},"type":{"type":"string","example":"AUTH_AND_CAPTURE","description":"AUTH | CAPTURE | AUTH_AND_CAPTURE | VOID | REFUND."},"status":{"type":"string","example":"SUCCEEDED","description":"Transaction or refund status."},"amount":{"type":"number","example":2999,"description":"Amount for this entry (cents)."},"parentTransactionId":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab","description":"Parent transaction; for a refund, the captured transaction it refunds. Omitted when absent."},"declinedReason":{"type":"string","example":"Card declined","description":"HighWire decline reason, a fixed human-readable wording; omitted on success."},"reason":{"type":"string","example":"customer request","description":"Refund reason, as you sent it; refunds only."},"refundKind":{"type":"string","enum":["PARTIAL","FULL"],"description":"Refund classification; refunds only."},"createdAt":{"type":"string","example":"2026-06-23T12:00:00.000Z"},"updatedAt":{"type":"string","example":"2026-06-23T12:00:01.000Z"}},"required":["id","object","type","status","amount"]},"PaymentAmountsDto":{"type":"object","properties":{"requested":{"type":"number","nullable":true,"example":2999,"description":"Requested amount (cents)."},"authorized":{"type":"number","nullable":true,"example":2999,"description":"Authorized amount; null if never authorized."},"captured":{"type":"number","nullable":true,"example":2999,"description":"Captured amount; null if nothing captured."},"voided":{"type":"number","nullable":true,"example":null,"description":"Voided amount; null if not voided."},"refunded":{"type":"number","nullable":true,"example":1000,"description":"Sum of succeeded refunds; null if none."}},"required":["requested","authorized","captured","voided","refunded"]},"GetPaymentResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"01928e1c-2a4d-7c8e-8b1a-1234567890ab"},"object":{"type":"string","example":"payment"},"status":{"type":"string","enum":["PENDING","AUTHORIZED","CAPTURED","PARTIALLY_REFUNDED","REFUNDED","VOIDED","DECLINED","EXPIRED","REQUIRES_ACTION","DISPUTED"],"example":"CAPTURED"},"currency":{"type":"string","example":"usd"},"amount":{"type":"number","nullable":true,"example":2999,"description":"Requested amount (cents)."},"paymentMethodType":{"type":"string","nullable":true,"example":"CARD","description":"Payment method type for the payment; null if none was captured."},"paymentMethodDetails":{"type":"object","nullable":true,"additionalProperties":true,"description":"Tokenized, PCI-safe card/wallet details (brand, last4, bin, exp); null if none.","example":{"brand":"visa","bin":"411111","last4":"1111","expirationMonth":12,"expirationYear":2027}},"transactions":{"description":"Refunds first, then transactions; newest-first within each group.","type":"array","items":{"$ref":"#/components/schemas/PaymentTransactionItemDto"}},"amounts":{"$ref":"#/components/schemas/PaymentAmountsDto"},"createdAt":{"type":"string","nullable":true,"example":"2026-06-23T12:00:00.000Z"},"authorizedAt":{"type":"string","nullable":true,"example":"2026-06-23T12:00:00.000Z","description":"When authorized; null if never authorized."},"capturedAt":{"type":"string","nullable":true,"example":"2026-06-23T12:00:01.000Z","description":"When captured; null if not captured."},"voidedAt":{"type":"string","nullable":true,"example":null,"description":"When voided; null if not voided."},"updatedAt":{"type":"string","nullable":true,"example":"2026-06-23T12:00:01.000Z"},"nextAction":{"description":"Present only while status is REQUIRES_ACTION: the customer-verification step (3-D Secure) still pending on this payment. Omitted once the payment settles.","allOf":[{"$ref":"#/components/schemas/PaymentNextActionDto"}]}},"required":["id","object","status","currency","amount","paymentMethodType","paymentMethodDetails","transactions","amounts","createdAt","authorizedAt","capturedAt","voidedAt","updatedAt"]}}},"security":[{"basic":[]}]}