Error Codes
Reference for all error codes returned by the ACP API.
Error Response Format
{
"error": {
"code": "error_code",
"message": "Human-readable description",
"details": {}
}
}Authentication Errors (4xx)
| Code | HTTP Status | Description |
|---|---|---|
invalid_signature | 401 | Request signature verification failed |
missing_signature | 401 | Required signature header missing |
expired_timestamp | 401 | Timestamp outside acceptable window |
invalid_agent | 403 | Agent not authorized for this merchant |
Example
{
"error": {
"code": "invalid_signature",
"message": "The request signature could not be verified"
}
}Session Errors
| Code | HTTP Status | Description |
|---|---|---|
session_not_found | 404 | Checkout session does not exist |
session_expired | 410 | Session has expired |
session_cancelled | 410 | Session was cancelled |
invalid_session_state | 400 | Operation not valid for current state |
Example
{
"error": {
"code": "session_expired",
"message": "This checkout session has expired",
"details": {
"expired_at": "2024-01-15T10:30:00Z"
}
}
}Cart Errors
| Code | HTTP Status | Description |
|---|---|---|
product_not_found | 400 | Product ID does not exist |
product_unavailable | 400 | Product not available for purchase |
insufficient_inventory | 400 | Not enough stock |
invalid_quantity | 400 | Quantity must be positive integer |
cart_empty | 400 | Cart has no items |
Example
{
"error": {
"code": "insufficient_inventory",
"message": "Only 2 items available",
"details": {
"product_id": "prod_123",
"requested": 5,
"available": 2
}
}
}Payment Errors
| Code | HTTP Status | Description |
|---|---|---|
payment_declined | 400 | Payment was declined |
invalid_payment_token | 400 | Payment token is invalid or expired |
payment_amount_mismatch | 400 | Token amount doesn’t match total |
payment_currency_mismatch | 400 | Token currency doesn’t match |
payment_already_captured | 400 | Token has already been used |
Example
{
"error": {
"code": "payment_declined",
"message": "The payment method was declined",
"details": {
"decline_code": "insufficient_funds"
}
}
}Shipping Errors
| Code | HTTP Status | Description |
|---|---|---|
shipping_address_required | 400 | Shipping address needed |
shipping_address_invalid | 400 | Address validation failed |
shipping_not_available | 400 | Cannot ship to this address |
shipping_option_invalid | 400 | Selected shipping option not valid |
Example
{
"error": {
"code": "shipping_not_available",
"message": "We cannot ship to this address",
"details": {
"country": "XX",
"supported_countries": ["US", "CA", "GB"]
}
}
}Rate Limit Errors
| Code | HTTP Status | Description |
|---|---|---|
rate_limit_exceeded | 429 | Too many requests |
Example
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 60 seconds",
"details": {
"retry_after": 60
}
}
}Server Errors
| Code | HTTP Status | Description |
|---|---|---|
internal_error | 500 | Unexpected server error |
service_unavailable | 503 | Service temporarily unavailable |
Handling Errors
JavaScript/TypeScript
try {
const session = await createCheckoutSession(cart);
} catch (error) {
if (error.code === 'insufficient_inventory') {
// Show user available quantity
const available = error.details.available;
showMessage(`Only ${available} items available`);
} else if (error.code === 'payment_declined') {
// Request different payment method
requestNewPaymentMethod();
} else {
// Generic error handling
showError(error.message);
}
}Python
try:
session = create_checkout_session(cart)
except ACPError as e:
if e.code == 'insufficient_inventory':
available = e.details['available']
print(f"Only {available} items available")
elif e.code == 'payment_declined':
request_new_payment_method()
else:
print(f"Error: {e.message}")