Recurring
Manage recurring billing plans. First payment captures a gateway token via HPP; subsequent charges use the stored token. Retries are configurable per plan (soft decline + ACH R01).
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 <= 100Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/contracts"{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"merchant_name": "string",
"rail": "CARD",
"card_last4": "string",
"amount_per_period": 0,
"currency": "USD",
"period_unit": "WEEKLY",
"total_periods": 0,
"periods_completed": 0,
"state": "PENDING_ACTIVATION"
}
],
"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
curl -X POST "https://example.com/contracts" \ -H "Idempotency-Key: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5" \ -H "Content-Type: application/json" \ -d '{ "merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea", "payment_method_type": "string", "payment_method_token": "string", "amount": "42.50", "frequency": "string", "start_date": "2019-08-24" }'{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"partner_id": "6a3a39f6-861b-4a48-b868-5de838400e06",
"merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea",
"state": "PENDING_ACTIVATION",
"payment_method_type": "CARD",
"amount": "42.50",
"currency": "USD",
"frequency": "WEEKLY",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"total_amount": "42.50",
"remaining_installments": 0,
"amount_paid": "42.50",
"last_successful_charge_date": "2019-08-24",
"next_charge_date": "2019-08-24",
"retry_count": 0,
"max_retries": 0,
"created_at": "2019-08-24T14:15:22Z",
"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"
}
]
}
}{
"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/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"
}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/contracts/497f6eca-6276-4993-bfeb-53cbbbba6f08"{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"partner_id": "6a3a39f6-861b-4a48-b868-5de838400e06",
"merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea",
"state": "PENDING_ACTIVATION",
"payment_method_type": "CARD",
"amount": "42.50",
"currency": "USD",
"frequency": "WEEKLY",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"total_amount": "42.50",
"remaining_installments": 0,
"amount_paid": "42.50",
"last_successful_charge_date": "2019-08-24",
"next_charge_date": "2019-08-24",
"retry_count": 0,
"max_retries": 0,
"created_at": "2019-08-24T14:15:22Z",
"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"
}
]
}
}{
"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
curl -X PATCH "https://example.com/contracts/497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Idempotency-Key: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"partner_id": "6a3a39f6-861b-4a48-b868-5de838400e06",
"merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea",
"state": "PENDING_ACTIVATION",
"payment_method_type": "CARD",
"amount": "42.50",
"currency": "USD",
"frequency": "WEEKLY",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"total_amount": "42.50",
"remaining_installments": 0,
"amount_paid": "42.50",
"last_successful_charge_date": "2019-08-24",
"next_charge_date": "2019-08-24",
"retry_count": 0,
"max_retries": 0,
"created_at": "2019-08-24T14:15:22Z",
"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"
}
]
}
}{
"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/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"
}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
curl -X POST "https://example.com/contracts/497f6eca-6276-4993-bfeb-53cbbbba6f08/cancel" \ -H "Idempotency-Key: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"partner_id": "6a3a39f6-861b-4a48-b868-5de838400e06",
"merchant_id": "500924a8-3f5e-4c00-beb8-2efcde988aea",
"state": "PENDING_ACTIVATION",
"payment_method_type": "CARD",
"amount": "42.50",
"currency": "USD",
"frequency": "WEEKLY",
"start_date": "2019-08-24",
"end_date": "2019-08-24",
"total_amount": "42.50",
"remaining_installments": 0,
"amount_paid": "42.50",
"last_successful_charge_date": "2019-08-24",
"next_charge_date": "2019-08-24",
"retry_count": 0,
"max_retries": 0,
"created_at": "2019-08-24T14:15:22Z",
"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"
}
]
}
}{
"type": "https://docs.cresoracommerce.com/errors/idempotency_key_required",
"title": "Bad Request",
"status": 400,
"detail": "Idempotency-Key header is required on write operations",
"instance": "urn:cresora:trace:0191c8a2-aa3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "idempotency_key_required",
"retryable": false,
"error_id": "0191c8a2-aa3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"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/invalid_state_transition",
"title": "Unprocessable Entity",
"status": 422,
"detail": "Transaction already VOIDED — void cannot be applied again.",
"instance": "urn:cresora:trace:0191c8a2-bbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "invalid_state_transition",
"retryable": false,
"error_id": "0191c8a2-bbcd-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
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 <= 128Response 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
curl -X POST "https://example.com/contracts/497f6eca-6276-4993-bfeb-53cbbbba6f08/retry" \ -H "Idempotency-Key: 7f3e2a9c-b4c1-4e25-9ab3-d8f1e2c3a4b5"{
"outcome": "SUCCEEDED",
"transaction_id": "0fec1e58-b197-4052-99cf-2218496c5482",
"decline_code": "string",
"contract_final_state": "string",
"reason": "string"
}{
"type": "https://docs.cresoracommerce.com/errors/idempotency_key_required",
"title": "Bad Request",
"status": 400,
"detail": "Idempotency-Key header is required on write operations",
"instance": "urn:cresora:trace:0191c8a2-aa3e-7c21-9ab3-d8f1e2c3a4b5",
"code": "idempotency_key_required",
"retryable": false,
"error_id": "0191c8a2-aa3e-7c21-9ab3-d8f1e2c3a4b5"
}{
"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/invalid_state_transition",
"title": "Unprocessable Entity",
"status": 422,
"detail": "Transaction already VOIDED — void cannot be applied again.",
"instance": "urn:cresora:trace:0191c8a2-bbcd-7a31-8c44-d8f1e2c3a4b5",
"code": "invalid_state_transition",
"retryable": false,
"error_id": "0191c8a2-bbcd-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"
}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.
Certification
Request and track partner certification checks. Certification is the gate a partner clears before onboarding real merchants.