Transactions
Process card sales, refunds, voids, authorizations and captures. Batch close operations for settlement timing.
/transactionsAuthorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Query Parameters
Opaque pagination cursor from previous response. Do not parse.
length <= 256Items per page (1–100).
1 <= value <= 10025uuidFree-text search over opaque identifiers, trimmed before matching: case-insensitive substring on gateway_transaction_id; exact match on the transaction id or merchant_id when the value parses as a UUID; exact match on the ACH routing_number_last4 or account_number_last4 when the value is exactly 4 digits. Amount, state and type are not searched — use their dedicated parameters.
length <= 200Transaction lifecycle state. Maps to domain TransactionState. Aligned with implementation at T-3.10 (3DS2 authentication).
INITIATED— created, not yet submitted to gatewayTHREE_DS_PENDING— a 3DS challenge is outstanding, waiting for the customer to complete. Thethree_dsprojection carrieschallenge_url; the customer browser is redirected there and the ISV then callsPOST /transactions/{id}/three-ds/completeto resolve the transaction. 15-minute TTL; on timeout / abandonment the server-side sweep promotes the row toTHREE_DS_FAILEDwiththree_ds_failure_reason = callback_timeout. Also listen for thethree_ds.completedwebhook for an eventually-consistent ack path. No currentPOST /transactionscreate path issues a step-up — the saved-cardSALEcharges an already-authenticated vault credential; this state and the completion endpoint are retained for reserved card-authentication flows.THREE_DS_FAILED— terminal 3DS authentication failure. Thethree_ds_failure_reasonfield carries one of:challenge_failed,challenge_abandoned,callback_timeout,signature_invalid,unsupported_card,issuer_declined. The transaction is not authorized — no funds are held. Distinct from the genericFAILEDstate so chargeback / retry logic can dispatch on the 3DS-specific cause.AUTHORIZED— funds held, not yet capturedCAPTURED— capture submitted, awaiting settlementSUBMITTED— ACH entry accepted into the ODFI origination batch (T-4.2). Distinct fromCAPTUREDbecause card-rail void / refund / auth-reverse rules don't map onto ACH semantics. Clearing happens 1-3 banking days later via the settlement webhook (SUBMITTED → SETTLEDon cleared; a NACHA return drivesSUBMITTED → RETURNED/SETTLED → RETURNEDwith an R-code — see thetransaction.returnedwebhook).SETTLED— funds moved into the merchant batch (end of day)RETURNED— terminal: the ACH entry came back with a NACHA R-code, fromSUBMITTEDorSETTLEDVOIDED— cancelled pre-settlementREFUNDED— fully refunded post-settlement (cumulative refund equals original amount)PARTIALLY_REFUNDED— one or more partial refunds issued, remaining refundable capacity > 0. Re-entrant: additional partial refunds are accepted until cumulative == original amount, at which point the state advances toREFUNDED.REVERSED— authorization released (card) or NACHA reversal (ACH)FAILED— terminal failure state; seedecline_codefor cause (covers both 3DS-specific and non-3DS failures)DISPUTED— chargeback opened against a SETTLED transaction (Sprint 7 dispute lifecycle); evidence-gathering window open.CHARGED_BACK— chargeback lost / resolved against the merchant.VERIFIED— terminal state forCARD_VERIFICATION($0 auth). No auth hold, no settlement, no auth-reverse / void semantics apply. Inspectavs_response_code+cv_response_codefor the verification outcome.
Value in
- "INITIATED"
- "THREE_DS_PENDING"
- "THREE_DS_FAILED"
- "AUTHORIZED"
- "CAPTURED"
- "SUBMITTED"
- "SETTLED"
- "VOIDED"
- "REFUNDED"
- "PARTIALLY_REFUNDED"
- "REVERSED"
- "RETURNED"
- "FAILED"
- "DISPUTED"
- "CHARGED_BACK"
- "VERIFIED"
Transaction type. Maps 1:1 to the domain TransactionType
enum.
Value in
- "AUTHORIZATION"
- "SALE"
- "CAPTURE"
- "PARTIAL_CAPTURE"
- "CAPTURE_ALL"
- "AUTH_REVERSAL"
- "PARTIAL_AUTH_REVERSAL"
- "VOID"
- "REFUND"
- "PARTIAL_REFUND"
- "CARD_VERIFICATION"
- "SURCHARGE"
- "ACH_DEBIT"
- "ACH_REFUND"
- "ACH_REVERSAL"
- "ACH_VOID"
- "ACH_RETURN"
- "RECURRING_CREATE"
- "RECURRING_UPDATE"
- "RECURRING_CANCEL"
- "RECURRING_RETRY"
- "RECURRING_PAUSE"
- "RECURRING_RESUME"
- "RECURRING_COMPLETION"
- "REPEAT_SALE"
- "ADJUSTMENT"
- "BATCH_CLOSE"
Value in
- "ACH"
- "CARD"
Inclusive ISO-8601 lower bound on created_at.
date-timeInclusive ISO-8601 upper bound on created_at.
date-timeInclusive lower bound on amount (dollars).
Inclusive upper bound on amount (dollars).
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/transactions"{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea", "merchant_name": "string", "type": "AUTHORIZATION", "rail": "CARD", "amount": 0, "currency": "USD", "state": "INITIATED", "approval_code": "string", "decline_code": "insufficient_funds", "decline_reason": "string", "card_last4": "string", "routing_last4": "string", "account_last4": "string", "account_type": "CHECKING", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "created_at": "2019-08-24T14:15:22Z" } ], "pagination": { "next_cursor": "string", "has_more": true, "total_count": 0 }}/transactionsAuthorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Header Parameters
Client-generated unique key — a UUIDv4 is the recommended form. Cresora deduplicates within a 24-hour window scoped to the partner.
Format: 1–128 characters of letters, digits, . _ : -. Anything else is rejected with 400 validation_error. The character
set is narrower than base64: padded base64 (+ / =) is NOT
accepted, base64url is. The key is forwarded verbatim to the payment
gateway on transaction creates, so it must satisfy the gateway's key
contract too — rejecting locally gives you an actionable error instead
of an opaque upstream failure mid-request.
Reserved prefixes — rejected with 400 idempotency_key_reserved:
hpp:,recurring:— Cresora's own server-minted deterministic keys. A client key in these namespaces could collide with a platform-generated record.rb:,inv-charge:,inv-installment:— reserved by the payment gateway for its internally-minted keys.
Replay semantics:
- Same key + same request body → Cresora returns the cached
response from the original call. Response includes header
X-Idempotent-Replay: trueso the client can distinguish replays from fresh executions. Status code, body and side effects are identical to the original call. - Same key + different body →
422 idempotency_key_reused. Generate a new key and retry, or re-send the original body. - Key older than 24 hours → treated as a fresh key; no replay guarantee from beyond the window.
Retrying after an indeterminate failure. On 502 gateway_outcome_unknown the transaction is recorded as pending and
the outcome is not yet known — retry with the SAME key (a fresh key
risks a double charge) or poll the transaction. This is also what a
gateway-side "an earlier request with this key is still in flight"
response surfaces as.
Do NOT reuse keys across different partners. Scope is enforced
per partner_id so the same key in partner A and partner B
is independent.
^[A-Za-z0-9._:\-]+$1 <= length <= 128Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Polymorphic request body for POST /transactions,
discriminated on type. The wire format is one flat JSON
object (mirrors the gateway's POST /api/transactions); the
variants below pin per-operation required fields so
generated SDKs stay typed.
AUTHORIZATION and CARD_VERIFICATION on card are reserved and
currently return 501 — the only card instrument is a Cresora
vault token (cvt_, delivered by an HPP save-card flow), and the
gateway wire shapes for a vault-token authorize / $0-verify are
not yet vendor-confirmed. They carry no request variant until then.
Authorize + capture in one step on a saved card, referenced by
its Cresora vault token (cvt_…) — the opaque, partner-scoped
handle returned on an hpp_session.completed webhook (or via the
stored-credentials API). Raw PAN and raw gateway tokens are never
accepted at this boundary (ADR-014 — the Cresora-identity-only
surface): a card is first captured through an HPP save-card flow,
which vaults it and yields the cvt_… reference.
use_type declares the reuse intent and drives the network
CIT/MIT classification. It must be one of the uses the credential
was vaulted with — the credential_usages declared on the HPP
session that saved the card (readable as scope on the
stored-credentials API); an intent outside that scope is refused
with 422 stored_credential_scope_violation. Every credential
carries at least one usage: the session that saves it must declare
credential_usages (enforced at session create since 2026-08):
ONE_TIME_FUTURE— cardholder-initiated (the customer is present, paying with their saved card). Surcharge and convenience fee are computed server-side and the merchant's AVS policy is applied.RECURRING/INSTALLMENT/UNSCHEDULED_COF— merchant-initiated; the amount is billed as-is (no surcharge / convenience fee, no AVS policy — the payer is not at the checkout to satisfy a step-up).
A declined charge is still a 200 with state = FAILED and a
decline_code. A 422 stored_credential_not_chargeable with
retryable: true means the vault entry's owning-customer link is
still being established — retry shortly, do not re-enrol the payer. With retryable: false the vault entry predates the current
charge-identity requirements — the payer must re-establish the
payment method through a save hosted-page flow.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/transactions" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "merchant_id": "01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42", "type": "SALE", "amount": "50.00", "currency": "USD", "vault_token": "cvt_01885fec-4444-7a31-9bbb-3e5b9a1f8c42", "use_type": "ONE_TIME_FUTURE" }'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "transaction_id": "0fec1e58-b197-4052-99cf-2218496c5482", "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea", "type": "AUTHORIZATION", "state": "INITIATED", "amount": "string", "currency": "USD", "entry_mode": "KEYED", "surcharge_amount": "string", "surcharge_reversed_amount": "string", "convenience_fee_amount": "string", "convenience_fee_disclosure_acknowledged_at": "2019-08-24T14:15:22Z", "convenience_fee_disclosure_channel": "VIRTUAL_TERMINAL", "surcharge_disclosure_acknowledged_at": "2019-08-24T14:15:22Z", "surcharge_disclosure_channel": "VIRTUAL_TERMINAL", "tax_amount": "string", "decline_code": "insufficient_funds", "avs_response_code": "string", "cv_response_code": "string", "three_ds": { "challenge_url": "http://example.com", "acs_transaction_id": "string", "version": "2.1.0", "expires_at": "2019-08-24T14:15:22Z" }, "three_ds_failure_reason": "challenge_failed", "custom_fields": [ { "name": "string", "value": "string" } ], "level2_data": { "po_number": "string", "merchant_zip": "string" }, "level3_data": { "ship_from_zip": "string", "destination_zip": "string", "destination_country_code": "string", "invoice_number": "string", "order_number": "string", "duty_amount": "string", "freight_amount": "string", "discount_amount": "string", "line_items": [ { "product_code": "string", "commodity_code": "string", "description": "string", "upc": "string", "invoice_number": "string", "tax_type": "string", "quantity": "string", "unit_of_measure": "string", "unit_price": "string", "discount_amount": "string", "total_amount": "string", "tax_amount": "string", "tax_rate": "string", "extended_amount": "string", "freight_amount": "string", "duty_amount": "string", "tax_included": true } ] }, "created_at": "2019-08-24T14:15:22Z", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e"}/transactions/summaryAuthorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Query Parameters
uuidFree-text search over opaque identifiers, trimmed before matching: case-insensitive substring on gateway_transaction_id; exact match on the transaction id or merchant_id when the value parses as a UUID. Unlike the list operation, a 4-digit value does NOT match ACH routing/account last-4 — this read model carries no such columns. Amount, state and type are not searched — use their dedicated parameters.
length <= 200Transaction lifecycle state. Maps to domain TransactionState. Aligned with implementation at T-3.10 (3DS2 authentication).
INITIATED— created, not yet submitted to gatewayTHREE_DS_PENDING— a 3DS challenge is outstanding, waiting for the customer to complete. Thethree_dsprojection carrieschallenge_url; the customer browser is redirected there and the ISV then callsPOST /transactions/{id}/three-ds/completeto resolve the transaction. 15-minute TTL; on timeout / abandonment the server-side sweep promotes the row toTHREE_DS_FAILEDwiththree_ds_failure_reason = callback_timeout. Also listen for thethree_ds.completedwebhook for an eventually-consistent ack path. No currentPOST /transactionscreate path issues a step-up — the saved-cardSALEcharges an already-authenticated vault credential; this state and the completion endpoint are retained for reserved card-authentication flows.THREE_DS_FAILED— terminal 3DS authentication failure. Thethree_ds_failure_reasonfield carries one of:challenge_failed,challenge_abandoned,callback_timeout,signature_invalid,unsupported_card,issuer_declined. The transaction is not authorized — no funds are held. Distinct from the genericFAILEDstate so chargeback / retry logic can dispatch on the 3DS-specific cause.AUTHORIZED— funds held, not yet capturedCAPTURED— capture submitted, awaiting settlementSUBMITTED— ACH entry accepted into the ODFI origination batch (T-4.2). Distinct fromCAPTUREDbecause card-rail void / refund / auth-reverse rules don't map onto ACH semantics. Clearing happens 1-3 banking days later via the settlement webhook (SUBMITTED → SETTLEDon cleared; a NACHA return drivesSUBMITTED → RETURNED/SETTLED → RETURNEDwith an R-code — see thetransaction.returnedwebhook).SETTLED— funds moved into the merchant batch (end of day)RETURNED— terminal: the ACH entry came back with a NACHA R-code, fromSUBMITTEDorSETTLEDVOIDED— cancelled pre-settlementREFUNDED— fully refunded post-settlement (cumulative refund equals original amount)PARTIALLY_REFUNDED— one or more partial refunds issued, remaining refundable capacity > 0. Re-entrant: additional partial refunds are accepted until cumulative == original amount, at which point the state advances toREFUNDED.REVERSED— authorization released (card) or NACHA reversal (ACH)FAILED— terminal failure state; seedecline_codefor cause (covers both 3DS-specific and non-3DS failures)DISPUTED— chargeback opened against a SETTLED transaction (Sprint 7 dispute lifecycle); evidence-gathering window open.CHARGED_BACK— chargeback lost / resolved against the merchant.VERIFIED— terminal state forCARD_VERIFICATION($0 auth). No auth hold, no settlement, no auth-reverse / void semantics apply. Inspectavs_response_code+cv_response_codefor the verification outcome.
Value in
- "INITIATED"
- "THREE_DS_PENDING"
- "THREE_DS_FAILED"
- "AUTHORIZED"
- "CAPTURED"
- "SUBMITTED"
- "SETTLED"
- "VOIDED"
- "REFUNDED"
- "PARTIALLY_REFUNDED"
- "REVERSED"
- "RETURNED"
- "FAILED"
- "DISPUTED"
- "CHARGED_BACK"
- "VERIFIED"
Transaction type. Maps 1:1 to the domain TransactionType
enum.
Value in
- "AUTHORIZATION"
- "SALE"
- "CAPTURE"
- "PARTIAL_CAPTURE"
- "CAPTURE_ALL"
- "AUTH_REVERSAL"
- "PARTIAL_AUTH_REVERSAL"
- "VOID"
- "REFUND"
- "PARTIAL_REFUND"
- "CARD_VERIFICATION"
- "SURCHARGE"
- "ACH_DEBIT"
- "ACH_REFUND"
- "ACH_REVERSAL"
- "ACH_VOID"
- "ACH_RETURN"
- "RECURRING_CREATE"
- "RECURRING_UPDATE"
- "RECURRING_CANCEL"
- "RECURRING_RETRY"
- "RECURRING_PAUSE"
- "RECURRING_RESUME"
- "RECURRING_COMPLETION"
- "REPEAT_SALE"
- "ADJUSTMENT"
- "BATCH_CLOSE"
Value in
- "ACH"
- "CARD"
date-timedate-timeResponse Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/transactions/summary"{ "total_count": 0, "total_volume": 0, "count_by_state": { "property1": 0, "property2": 0 }, "count_by_rail": { "property1": 0, "property2": 0 }, "approved_count": 0, "declined_count": 0, "auth_rate": 0, "refund_count": 0, "refund_volume": 0, "open_dispute_count": 0}/transactions/exportAuthorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Query Parameters
uuidFree-text search over opaque identifiers, trimmed before matching: case-insensitive substring on gateway_transaction_id; exact match on the transaction id or merchant_id when the value parses as a UUID. Unlike the list operation, a 4-digit value does NOT match ACH routing/account last-4 — this read model carries no such columns. Amount, state and type are not searched — use their dedicated parameters.
length <= 200Transaction lifecycle state. Maps to domain TransactionState. Aligned with implementation at T-3.10 (3DS2 authentication).
INITIATED— created, not yet submitted to gatewayTHREE_DS_PENDING— a 3DS challenge is outstanding, waiting for the customer to complete. Thethree_dsprojection carrieschallenge_url; the customer browser is redirected there and the ISV then callsPOST /transactions/{id}/three-ds/completeto resolve the transaction. 15-minute TTL; on timeout / abandonment the server-side sweep promotes the row toTHREE_DS_FAILEDwiththree_ds_failure_reason = callback_timeout. Also listen for thethree_ds.completedwebhook for an eventually-consistent ack path. No currentPOST /transactionscreate path issues a step-up — the saved-cardSALEcharges an already-authenticated vault credential; this state and the completion endpoint are retained for reserved card-authentication flows.THREE_DS_FAILED— terminal 3DS authentication failure. Thethree_ds_failure_reasonfield carries one of:challenge_failed,challenge_abandoned,callback_timeout,signature_invalid,unsupported_card,issuer_declined. The transaction is not authorized — no funds are held. Distinct from the genericFAILEDstate so chargeback / retry logic can dispatch on the 3DS-specific cause.AUTHORIZED— funds held, not yet capturedCAPTURED— capture submitted, awaiting settlementSUBMITTED— ACH entry accepted into the ODFI origination batch (T-4.2). Distinct fromCAPTUREDbecause card-rail void / refund / auth-reverse rules don't map onto ACH semantics. Clearing happens 1-3 banking days later via the settlement webhook (SUBMITTED → SETTLEDon cleared; a NACHA return drivesSUBMITTED → RETURNED/SETTLED → RETURNEDwith an R-code — see thetransaction.returnedwebhook).SETTLED— funds moved into the merchant batch (end of day)RETURNED— terminal: the ACH entry came back with a NACHA R-code, fromSUBMITTEDorSETTLEDVOIDED— cancelled pre-settlementREFUNDED— fully refunded post-settlement (cumulative refund equals original amount)PARTIALLY_REFUNDED— one or more partial refunds issued, remaining refundable capacity > 0. Re-entrant: additional partial refunds are accepted until cumulative == original amount, at which point the state advances toREFUNDED.REVERSED— authorization released (card) or NACHA reversal (ACH)FAILED— terminal failure state; seedecline_codefor cause (covers both 3DS-specific and non-3DS failures)DISPUTED— chargeback opened against a SETTLED transaction (Sprint 7 dispute lifecycle); evidence-gathering window open.CHARGED_BACK— chargeback lost / resolved against the merchant.VERIFIED— terminal state forCARD_VERIFICATION($0 auth). No auth hold, no settlement, no auth-reverse / void semantics apply. Inspectavs_response_code+cv_response_codefor the verification outcome.
Value in
- "INITIATED"
- "THREE_DS_PENDING"
- "THREE_DS_FAILED"
- "AUTHORIZED"
- "CAPTURED"
- "SUBMITTED"
- "SETTLED"
- "VOIDED"
- "REFUNDED"
- "PARTIALLY_REFUNDED"
- "REVERSED"
- "RETURNED"
- "FAILED"
- "DISPUTED"
- "CHARGED_BACK"
- "VERIFIED"
Transaction type. Maps 1:1 to the domain TransactionType
enum.
Value in
- "AUTHORIZATION"
- "SALE"
- "CAPTURE"
- "PARTIAL_CAPTURE"
- "CAPTURE_ALL"
- "AUTH_REVERSAL"
- "PARTIAL_AUTH_REVERSAL"
- "VOID"
- "REFUND"
- "PARTIAL_REFUND"
- "CARD_VERIFICATION"
- "SURCHARGE"
- "ACH_DEBIT"
- "ACH_REFUND"
- "ACH_REVERSAL"
- "ACH_VOID"
- "ACH_RETURN"
- "RECURRING_CREATE"
- "RECURRING_UPDATE"
- "RECURRING_CANCEL"
- "RECURRING_RETRY"
- "RECURRING_PAUSE"
- "RECURRING_RESUME"
- "RECURRING_COMPLETION"
- "REPEAT_SALE"
- "ADJUSTMENT"
- "BATCH_CLOSE"
Value in
- "ACH"
- "CARD"
date-timedate-timeResponse Body
text/csv
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/transactions/export""string"/transactions/{transactionId}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Path Parameters
uuidResponse Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/transactions/497f6eca-6276-4993-bfeb-53cbbbba6f08"{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea", "type": "AUTHORIZATION", "rail": "CARD", "state": "INITIATED", "amount": 0, "surcharge_amount": 0, "surcharge_reversed_amount": 0, "tax_amount": 0, "currency": "USD", "entry_mode": "string", "approval_code": "string", "decline_code": "insufficient_funds", "decline_reason": "string", "avs_response_code": "string", "cv_response_code": "string", "card_last4": "string", "routing_last4": "string", "account_last4": "string", "account_type": "CHECKING", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e", "sec_code": "WEB", "idempotency_key": "string", "custom_fields": [ { "name": "string", "value": "string" } ], "level2_data": { "po_number": "string", "merchant_zip": "string" }, "level3_data": { "ship_from_zip": "string", "destination_zip": "string", "destination_country_code": "string", "invoice_number": "string", "order_number": "string", "duty_amount": "string", "freight_amount": "string", "discount_amount": "string", "line_items": [ { "product_code": "string", "commodity_code": "string", "description": "string", "upc": "string", "invoice_number": "string", "tax_type": "string", "quantity": "string", "unit_of_measure": "string", "unit_price": "string", "discount_amount": "string", "total_amount": "string", "tax_amount": "string", "tax_rate": "string", "extended_amount": "string", "freight_amount": "string", "duty_amount": "string", "tax_included": true } ] }, "parent_transaction_id": "2862f816-fb62-4845-833b-6951bbef56b3", "recurring_contract_id": "06e8cf01-8f38-4d73-81db-510f9724f797", "settled_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z", "available_actions": [ "capture" ], "refundable_balance": { "original": 0, "refunded_to_date": 0, "remaining": 0 }, "state_transitions": [ { "from_state": "string", "to_state": "string", "actor_type": "string", "reason": "string", "occurred_at": "2019-08-24T14:15:22Z" } ], "related_transactions": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "type": "AUTHORIZATION", "rail": "CARD", "state": "INITIATED", "amount": 0, "parent_transaction_id": "2862f816-fb62-4845-833b-6951bbef56b3", "created_at": "2019-08-24T14:15:22Z" } ], "disputes": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "state": "RECEIVED", "reason_category": "string", "reason_code": "string", "reason_description": "string", "amount": 0, "currency": "USD", "case_number": "string", "response_deadline": "2019-08-24", "open": true } ]}/transactions/{transactionId}/three-ds/completeAuthorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk_<prefix>_<random><prefix>— 8 URL-safe chars, shown in UI and logs for identification without revealing the full key (e.g.csk_Ab3kX9mQ…). UseApiKey.prefixto match.<random>— 24+ cryptographically random URL-safe chars.
Obtain via Partner Portal → Settings → API keys. Keys are only shown in full at creation/rotation time — Cresora does not retain the full value in retrievable form. Rotate any key that may have been exposed via logs, client code, or source control.
In: header
Path Parameters
uuidHeader Parameters
Client-generated unique key — a UUIDv4 is the recommended form. Cresora deduplicates within a 24-hour window scoped to the partner.
Format: 1–128 characters of letters, digits, . _ : -. Anything else is rejected with 400 validation_error. The character
set is narrower than base64: padded base64 (+ / =) is NOT
accepted, base64url is. The key is forwarded verbatim to the payment
gateway on transaction creates, so it must satisfy the gateway's key
contract too — rejecting locally gives you an actionable error instead
of an opaque upstream failure mid-request.
Reserved prefixes — rejected with 400 idempotency_key_reserved:
hpp:,recurring:— Cresora's own server-minted deterministic keys. A client key in these namespaces could collide with a platform-generated record.rb:,inv-charge:,inv-installment:— reserved by the payment gateway for its internally-minted keys.
Replay semantics:
- Same key + same request body → Cresora returns the cached
response from the original call. Response includes header
X-Idempotent-Replay: trueso the client can distinguish replays from fresh executions. Status code, body and side effects are identical to the original call. - Same key + different body →
422 idempotency_key_reused. Generate a new key and retry, or re-send the original body. - Key older than 24 hours → treated as a fresh key; no replay guarantee from beyond the window.
Retrying after an indeterminate failure. On 502 gateway_outcome_unknown the transaction is recorded as pending and
the outcome is not yet known — retry with the SAME key (a fresh key
risks a double charge) or poll the transaction. This is also what a
gateway-side "an earlier request with this key is still in flight"
response surfaces as.
Do NOT reuse keys across different partners. Scope is enforced
per partner_id so the same key in partner A and partner B
is independent.
^[A-Za-z0-9._:\-]+$1 <= length <= 128Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Completes a 3DS challenge after the customer returns from the
issuer's challenge page. The challenge_response is the
opaque token returned in the redirect query string (or
POSTed form parameter, depending on flow). merchant_id
is required so the use case can resolve the gateway
merchant context (gateway_merchant_id) without an
extra round-trip to the IAM key scope — the value MUST
match the merchant on the parent transaction, otherwise
the call is rejected as validation_error.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/transactions/497f6eca-6276-4993-bfeb-53cbbbba6f08/three-ds/complete" \ -H "Idempotency-Key: string" \ -H "Content-Type: application/json" \ -d '{ "challenge_response": "string", "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea" }'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "transaction_id": "0fec1e58-b197-4052-99cf-2218496c5482", "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea", "type": "AUTHORIZATION", "state": "INITIATED", "amount": "string", "currency": "USD", "entry_mode": "KEYED", "surcharge_amount": "string", "surcharge_reversed_amount": "string", "convenience_fee_amount": "string", "convenience_fee_disclosure_acknowledged_at": "2019-08-24T14:15:22Z", "convenience_fee_disclosure_channel": "VIRTUAL_TERMINAL", "surcharge_disclosure_acknowledged_at": "2019-08-24T14:15:22Z", "surcharge_disclosure_channel": "VIRTUAL_TERMINAL", "tax_amount": "string", "decline_code": "insufficient_funds", "avs_response_code": "string", "cv_response_code": "string", "three_ds": { "challenge_url": "http://example.com", "acs_transaction_id": "string", "version": "2.1.0", "expires_at": "2019-08-24T14:15:22Z" }, "three_ds_failure_reason": "challenge_failed", "custom_fields": [ { "name": "string", "value": "string" } ], "level2_data": { "po_number": "string", "merchant_zip": "string" }, "level3_data": { "ship_from_zip": "string", "destination_zip": "string", "destination_country_code": "string", "invoice_number": "string", "order_number": "string", "duty_amount": "string", "freight_amount": "string", "discount_amount": "string", "line_items": [ { "product_code": "string", "commodity_code": "string", "description": "string", "upc": "string", "invoice_number": "string", "tax_type": "string", "quantity": "string", "unit_of_measure": "string", "unit_price": "string", "discount_amount": "string", "total_amount": "string", "tax_amount": "string", "tax_rate": "string", "extended_amount": "string", "freight_amount": "string", "duty_amount": "string", "tax_included": true } ] }, "created_at": "2019-08-24T14:15:22Z", "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e"}Merchants
Merchant lifecycle — create, submit for underwriting review, update, and close merchant accounts. Merchants progress through a state machine owned by Cresora Operations.
H P P
Hosted Payment Pages — Cresora-hosted checkout. PCI scope stays with Cresora + the gateway. The partner only handles the session redirect and the callback on completion.