Transactions
Process card sales, refunds, voids, authorizations and captures. Batch close operations for settlement timing.
404 (or 501) today; do not build against them yet. This spec is generated from the canonical contract — see the stable /api/v1 reference for production-ready endpoints.Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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).
251 <= value <= 100uuidFree-text search: case-insensitive substring on gateway_transaction_id, OR exact transaction-id match when the value parses as a UUID. Identical semantics on the list, summary, and export operations.
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 thetransaction.three_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, or→ FAILEDwith an R-code on NACHA return).SETTLED— funds moved into the merchant batch (end of day)VOIDED— 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.
"INITIATED" | "THREE_DS_PENDING" | "THREE_DS_FAILED" | "AUTHORIZED" | "CAPTURED" | "SUBMITTED" | "SETTLED" | "VOIDED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "REVERSED" | "FAILED" | "DISPUTED" | "CHARGED_BACK" | "VERIFIED"Transaction type. Maps 1:1 to the domain TransactionType
enum.
"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""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_reason": "string",
"card_last4": "string",
"routing_last4": "string",
"created_at": "2019-08-24T14:15:22Z"
}
],
"pagination": {
"next_cursor": "eyJpZCI6IjAxSFhZWi4uLiJ9",
"has_more": true,
"total_count": 0
}
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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
Idempotency-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 →
409 idempotency_key_conflict. Generate a new key and retry. - 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.
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: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5" \ -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" }'{
"transaction_id": "01918a2f-3e7c-7219-bbb3-d8f1e2c3a4b6",
"merchant_id": "01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42",
"type": "SALE",
"state": "CAPTURED",
"amount": "42.50",
"currency": "USD",
"entry_mode": "KEYED",
"decline_code": null,
"avs_response_code": "Y",
"cv_response_code": "M",
"surcharge_amount": "0.00",
"convenience_fee_amount": "0.00",
"tax_amount": "0.00",
"three_ds": null,
"three_ds_failure_reason": null,
"custom_fields": [
{
"name": "patientId",
"value": "PT48213"
}
],
"created_at": "2026-04-29T18:42:11Z"
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/idempotency_key_conflict",
"title": "Conflict",
"status": 409,
"detail": "Idempotency-Key was used 5 minutes ago with a different request body.",
"instance": "urn:cresora:trace:0191c8a2-cbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "idempotency_key_conflict",
"retryable": false,
"error_id": "0191c8a2-cbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/gateway_unavailable",
"title": "Bad Gateway",
"status": 502,
"detail": "Payment gateway temporarily unavailable.",
"instance": "urn:cresora:trace:0191c8a2-ebcd-7a31-8c44-d8f1e2c3a4b5",
"code": "gateway_unavailable",
"retryable": true,
"error_id": "0191c8a2-ebcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/feature_disabled",
"title": "Service Unavailable",
"status": 503,
"detail": "HPP CARD session creation is temporarily unavailable",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "feature_disabled",
"retryable": false,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/gateway_timeout",
"title": "Gateway Timeout",
"status": 504,
"detail": "Payment gateway read timeout - outcome indeterminate, replay only via idempotency key",
"instance": "urn:cresora:trace:0191c8a2-abcd-7a31-8c44-d8f1e2c3a4b5",
"code": "gateway_timeout",
"retryable": true,
"error_id": "0191c8a2-abcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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: case-insensitive substring on gateway_transaction_id, OR exact transaction-id match when the value parses as a UUID. Identical semantics on the list, summary, and export operations.
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 thetransaction.three_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, or→ FAILEDwith an R-code on NACHA return).SETTLED— funds moved into the merchant batch (end of day)VOIDED— 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.
"INITIATED" | "THREE_DS_PENDING" | "THREE_DS_FAILED" | "AUTHORIZED" | "CAPTURED" | "SUBMITTED" | "SETTLED" | "VOIDED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "REVERSED" | "FAILED" | "DISPUTED" | "CHARGED_BACK" | "VERIFIED"Transaction type. Maps 1:1 to the domain TransactionType
enum.
"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""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
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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: case-insensitive substring on gateway_transaction_id, OR exact transaction-id match when the value parses as a UUID. Identical semantics on the list, summary, and export operations.
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 thetransaction.three_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, or→ FAILEDwith an R-code on NACHA return).SETTLED— funds moved into the merchant batch (end of day)VOIDED— 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.
"INITIATED" | "THREE_DS_PENDING" | "THREE_DS_FAILED" | "AUTHORIZED" | "CAPTURED" | "SUBMITTED" | "SETTLED" | "VOIDED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "REVERSED" | "FAILED" | "DISPUTED" | "CHARGED_BACK" | "VERIFIED"Transaction type. Maps 1:1 to the domain TransactionType
enum.
"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""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"{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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,
"tax_amount": 0,
"currency": "USD",
"entry_mode": "string",
"approval_code": "string",
"decline_reason": "string",
"avs_response_code": "string",
"cv_response_code": "string",
"routing_last4": "string",
"idempotency_key": "string",
"custom_fields": [
{
"name": "patientId",
"value": "PT48213"
}
],
"level2_data": {
"po_number": "PO4711",
"merchant_zip": "78701"
},
"level3_data": {
"ship_from_zip": "78701",
"destination_zip": "90210",
"destination_country_code": "USA",
"invoice_number": "INV-42",
"freight_amount": "5.00",
"line_items": [
{
"product_code": "SVC-001",
"description": "Consulting",
"quantity": "2",
"unit_price": "50.00",
"tax_amount": "8.25",
"extended_amount": "100.00",
"total_amount": "108.25"
}
]
},
"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
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/merchant_not_found",
"title": "Not Found",
"status": 404,
"detail": "Merchant 01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42 does not exist or is not accessible.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "merchant_not_found",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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
Idempotency-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 →
409 idempotency_key_conflict. Generate a new key and retry. - 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.
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: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5" \ -H "Content-Type: application/json" \ -d '{ "challenge_response": "cres_3ds_pARf8UXu0Wm9qQPDfT4bP0Vk", "merchant_id": "01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42" }'{
"transaction_id": "01918a2f-3e7c-7219-bbb3-d8f1e2c3a4b6",
"merchant_id": "01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42",
"type": "SALE",
"state": "CAPTURED",
"amount": "42.50",
"currency": "USD",
"entry_mode": "KEYED",
"decline_code": null,
"avs_response_code": "Y",
"cv_response_code": "M",
"surcharge_amount": "0.00",
"convenience_fee_amount": "0.00",
"tax_amount": "0.00",
"three_ds": null,
"three_ds_failure_reason": null,
"custom_fields": [
{
"name": "patientId",
"value": "PT48213"
}
],
"created_at": "2026-04-29T18:42:11Z"
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/merchant_not_found",
"title": "Not Found",
"status": 404,
"detail": "Merchant 01885fec-8c0f-7a31-9bbb-3e5b9a1f8c42 does not exist or is not accessible.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "merchant_not_found",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/idempotency_key_conflict",
"title": "Conflict",
"status": 409,
"detail": "Idempotency-Key was used 5 minutes ago with a different request body.",
"instance": "urn:cresora:trace:0191c8a2-cbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "idempotency_key_conflict",
"retryable": false,
"error_id": "0191c8a2-cbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/gateway_unavailable",
"title": "Bad Gateway",
"status": 502,
"detail": "Payment gateway temporarily unavailable.",
"instance": "urn:cresora:trace:0191c8a2-ebcd-7a31-8c44-d8f1e2c3a4b5",
"code": "gateway_unavailable",
"retryable": true,
"error_id": "0191c8a2-ebcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/feature_disabled",
"title": "Service Unavailable",
"status": 503,
"detail": "HPP CARD session creation is temporarily unavailable",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "feature_disabled",
"retryable": false,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/gateway_timeout",
"title": "Gateway Timeout",
"status": 504,
"detail": "Payment gateway read timeout - outcome indeterminate, replay only via idempotency key",
"instance": "urn:cresora:trace:0191c8a2-abcd-7a31-8c44-d8f1e2c3a4b5",
"code": "gateway_timeout",
"retryable": true,
"error_id": "0191c8a2-abcd-7a31-8c44-d8f1e2c3a4b5"
}Authorization
BearerAuth Cresora API key, sent as an opaque bearer token in the
Authorization header. Format:
csk__
<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
uuidDecimal amount with exactly 2 digits after the point. Always positive. Represented as string to avoid floating-point precision loss in JavaScript clients.
^\d+\.\d{2}$US state code (e.g. TX, CA).
^[A-Z]{2}$Optional brand hint (from client-side tokenization metadata). When supplied, the brand cap participates in the rate computation and Amex merchant-eligibility is checked; when omitted, the preview uses state + merchant inputs only.
"VISA" | "MASTERCARD" | "DISCOVER" | "AMEX" | "OTHER"Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/surcharge/rules?merchant_id=497f6eca-6276-4993-bfeb-53cbbbba6f08&amount=42.50&state=string"{
"applicable": true,
"reason": "APPLIED",
"surcharge_amount": "3.00",
"rate_percent": "3.00",
"total_amount": "103.00",
"disclosure_required": false,
"disclosure_text": null
}{
"type": "https://docs.cresoracommerce.com/errors/validation_error",
"title": "Bad Request",
"status": 400,
"detail": "Validation failed for 1 field(s)",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b6",
"code": "validation_error",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b6",
"errors": [
{
"field": "merchant_category_code",
"code": "Pattern",
"message": "must match pattern ^[0-9]{4}$"
}
]
}{
"type": "https://docs.cresoracommerce.com/errors/invalid_api_key",
"title": "Unauthorized",
"status": 401,
"detail": "API key not recognized or revoked.",
"instance": "urn:cresora:trace:0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "invalid_api_key",
"retryable": false,
"error_id": "0191c8a2-7f3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/permission_denied",
"title": "Forbidden",
"status": 403,
"detail": "API key lacks scope 'transactions.write' required for this endpoint.",
"instance": "urn:cresora:trace:0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5",
"code": "permission_denied",
"retryable": false,
"error_id": "0191c8a2-9b7c-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/rate_limit_exceeded",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Retry after 60 seconds.",
"instance": "urn:cresora:trace:0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "rate_limit_exceeded",
"retryable": true,
"error_id": "0191c8a2-dbcd-7a31-8c44-d8f1e2c3a4b5"
}{
"type": "https://docs.cresoracommerce.com/errors/internal_error",
"title": "Internal Server Error",
"status": 500,
"detail": "An internal error occurred. Please retry; if the error persists, contact support with the error_id.",
"instance": "urn:cresora:trace:0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "internal_error",
"retryable": true,
"error_id": "0191c8a2-fbcd-7a31-8c44-d8f1e2c3a4b5"
}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.