Skip to content

Payment / Card

H2H#

POST https://payments.apipro.io/v2/payment

The ApiPro API allows you to process card payments directly via server-to-server communication. This documentation describes the H2H (Host-to-Host) flow, where you collect card details on your own secure checkout page.

When creating a payment, you must set method = card in your request body. After the request, you will receive a response indicating the next step. For card payments, this often involves a 3-D Secure challenge.

Initial Success Response (200 OK)#

After a successful request, first inspect the error_code field. If it is not 0, the transaction has failed. If there are no errors, the status will typically be created or pending. You must then inspect the challenge object to handle any required authentication steps.


The redirect 3-D Secure Flow#

For H2H card payments, a redirect challenge is used to handle 3-D Secure authentication. Your application must redirect the customer to the provided URL to complete the security verification.

Example of a 'redirect' challenge for 3DS:

{
    "request_id": "564889b8-d61f-4e8e-a573-598739feafbb",
    "reference": "CardPayment-H2H-123",
    "status": {
        "name": "pending",
        "date": "2025-08-10T12:00:00Z"
    },
    "challenge": {
        "challenge_type": "redirect",
        "challenge_redirect": {
            "url": "https://secure.3ds-provider.com/challenge/ey..."
        }
    },
    "error_code": 0
}

Process Overview:

  1. Your application sends a payment request containing the customer's card details to ApiPro.
  2. ApiPro processes the request and returns a redirect_url for 3-D Secure authentication.
  3. You must redirect the customer's browser to this URL.
  4. The customer completes the 3-D Secure challenge (e.g., by entering a code from their banking app).
  5. After completion, ApiPro sends a final status callback to your callback_url.

Headers#

Header Value
Content-Type application/json
Authorization {{authorization}}
Digest {{digest}}
Host {{host}}
Date {{date}}

See Authentication & Signature for how to build the signed headers.

Request body#

Annotations in the example are the field requirements: required, optional or conditional. Comments are stripped automatically by the Postman collection before signing; remove them in your own requests.

{
    "method": "card", // required, snake_case / lower case only: "card" (not "CARD" or "Card")
    "reference": "CardTestStage#16", // required, unique
    "currency": "EUR", // required
    "amount": 1000, // required
    "description": "My order payin", // optional
    "card": { // conditional
        "pan": "4242424242424242", // required
        "exp_month": "12", // required
        "exp_year": "2026", // required
        "holder_name": "Darth", // required
        "cvv": "322" // required
    },
    "customer": { // required
        "identifier": "1111-1111-2211-2211", // required
        "email": "juancarlos@hotmail.com", // required
        "phone": "+5491123456789", // required
        "first_name": "Juan", // required
        "last_name": "García Rodríguez", // required
        "middle_name": "Carlos", // optional
        "country": "UA", // required
        "state_code": "B", // required
        "city": "Buenos Aires", // required
        "address": "Calle Emilio Mitre 3256", // required
        "zip_code": "C1407", // required
        "itn": "12345678910", // optional
        "birthday": "2006-01-02", // required
        "ip": "192.168.0.1", // required
        "gender": "male" // optional
    },
    "redirect_url": "https://merchant.shop.com/", // optional
    "cancel_url": "https://merchant.shop.com/cancel", // optional
    "error_url": "https://merchant.shop.com/error", // optional
    "callback_url": "https://merchant.shop.com/callback/success", // conditional
    "extra": // conditional, any field which may be needed for transaction routing and integration
    {
        "meta": {
            "ip": "192.0.2.1", // conditional
            "header_accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", // conditional
            "language": "uk", // conditional
            "screen_color_depth": "24", // conditional
            "screen_height": "1080", // conditional
            "screen_pixel_depth": "24", // conditional
            "screen_width": "1920", // conditional
            "timezone_offset_minutes": "-120", // conditional
            "user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", // conditional
            "window_height": "531", // conditional
            "window_width": "1848" // conditional
        }
    }
}

Fields#

Field Type Requirement / note
method string required, snake_case / lower case only: "card" (not "CARD" or "Card")
reference string required, unique
currency string required
amount integer required
description string optional
card object conditional
card.pan string required
card.exp_month string required
card.exp_year string required
card.holder_name string required
card.cvv string required
customer object required
customer.identifier string required
customer.email string required
customer.phone string required
customer.first_name string required
customer.last_name string required
customer.middle_name string optional
customer.country string required
customer.state_code string required
customer.city string required
customer.address string required
customer.zip_code string required
customer.itn string optional
customer.birthday string required
customer.ip string required
customer.gender string optional
redirect_url string optional
cancel_url string optional
error_url string optional
callback_url string conditional
extra object conditional, any field which may be needed for transaction routing and integration
extra.meta object
extra.meta.ip string conditional
extra.meta.header_accept string conditional
extra.meta.language string conditional
extra.meta.screen_color_depth string conditional
extra.meta.screen_height string conditional
extra.meta.screen_pixel_depth string conditional
extra.meta.screen_width string conditional
extra.meta.timezone_offset_minutes string conditional
extra.meta.user_agent string conditional
extra.meta.window_height string conditional
extra.meta.window_width string conditional

Responses#

Response Examples

Succesful transaction
{
  "type": "payment",
  "method": "card",
  "mode": "initial",
  "currency": "EUR",
  "amount": "1000",
  "challenge": {
    "challenge_type": "redirect",
    "challenge_redirect": {
      "url": "https://chekout.sdfgasdf.online/payment/f6fb2c12-958e-4636-8b70-532f9e6d5683"
    }
  },
  "timestamp": "2025-10-04T11:58:50.350498Z",
  "identifier": "CAR003043485",
  "reference": "CardTestStage#1",
  "request_id": "f6fb2c12-958e-4636-8b70-532f9e6d5683",
  "status": "pending",
  "error_code": 0,
  "error_reason": ""
}
Duplicated reference
{
  "error_code": 108,
  "error_reason": "Duplicated reference",
  "request_id": "3829f5bd-6dcb-41f9-a4ba-3ff8b65a3cfc",
  "reference": "",
  "timestamp": "2025-11-10T08:47:22.81Z"
}
Merchant not found
{
  "error_code": 35,
  "error_reason": "Merchant not found",
  "description": "The requested resource is undefined",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:01:00.00Z"
}
Required fields are missing: method or widget.method, reference
{
  "error_code": 31,
  "error_reason": "Required fields are missing: method or widget.method, reference",
  "timestamp": "2025-10-26T14:03:00.00Z"
}
Using 'method' and 'widget.method' at the same time.
{
  "error_code": 30,
  "error_reason": "Invalid params",
  "description": "Widget and method cannot be used together",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:04:00.00Z"
}
Customer is blocked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:06:00.00Z"
}
Card is blocked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Card is blocked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:07:00.00Z"
}
Card is blocked for all merchant projects
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Card is blocked for all merchant projects",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:01.00Z"
}
Customer is blocked for all merchant projects
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked for all merchant projects",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:02.00Z"
}
Card is blocked for the specified project
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Card is blocked for the specified project",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:03.00Z"
}
Customer is blocked for the specified project
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked for the specified project",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:04.00Z"
}
Card is blocked system-wide
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Card is blocked system-wide",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:05.00Z"
}
Customer is blocked system-wide
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked system-wide",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:06.00Z"
}
Card is globally locked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Card is globally locked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:07.00Z"
}
Customer is globally locked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is globally locked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Timeout while requesting routing
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing request timeout",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:01.00Z"
}
Payment transaction timeout after some time
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Payment transaction timeout after 30 seconds",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:03.00Z"
}
Unknown routing error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Unknown routing error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:02.00Z"
}
Payment transaction was cancelled
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Payment transaction was cancelled",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:04.00Z"
}
Internal error: Data is empty
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Value cannot be null. (Parameter 'data')",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:05.00Z"
}
Endpoint type wasn't found
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Endpoint type cannot be null or empty (Parameter 'endpointType')",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:06.00Z"
}
Mid configuration error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Mid [Mid ID] no longer exists in configuration",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:07.00Z"
}
Routing service error: Converting data error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing service error: The JSON value could not be converted to System.Guid.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Routing service error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing service error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Broker transport failure
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Broker transport failure",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:09.00Z"
}
Internal error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:09.00Z"
}
An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:10.00Z"
}
An unexpected error occurred while processing the request
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "An unexpected error occurred while processing the request",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:09:00.00Z"
}
Invalid method challenge configuration. Settings not found.
{
  "error_code": 121,
  "error_reason": "Invalid method challenge configuration. Please reconfigure method challenge type settings",
  "description": "Invalid method challenge configuration. Settings not found.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:10:00.00Z"
}
Route is invalid (Incorrect method, mid settings)
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "There is more than one challenge setting for a method. Please reconfigure method challenge type settings.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:11:00.00Z"
}
Getting currency rate info error.
{
  "error_code": 200,
  "error_reason": "While getting currency rate, error happend",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:12:00.00Z"
}
Error processing currency information.
{
  "error_code": 200,
  "error_reason": "Error with payment configurations",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:13:00.00Z"
}
Error with wallet
{
  "error_code": 200,
  "error_reason": "Error with wallet",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:14:00.00Z"
}
Failed to register transaction
{
  "error_code": 200,
  "error_reason": "Failed to register transaction",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:15:00.00Z"
}
Failed saving card info
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "Failed to save card information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:16:00.00Z"
}
Transaction processing error
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "Failed to register the transaction",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:17:00.00Z"
}
Mid doesn't support challenge type for method (mid or method settings problem)
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "Mid does not support challenge type [challengeType] for method [method]",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:18:00.00Z"
}
Mid is disabled
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "Mid is disabled",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:19:00.00Z"
}
Bank doesn't support currency
{
  "error_code": 1051,
  "error_reason": "Bank doesn't support currency",
  "description": "Blocked routing for transaction: Invalid currency",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:20:00.00Z"
}
Bank doesn't support payment method
{
  "error_code": 1054,
  "error_reason": "Bank doesn't support payment method",
  "description": "Blocked routing for transaction: Invalid method: [method]",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:21:00.00Z"
}
Bank does not support transaction: Invalid payment type
{
  "error_code": 1050,
  "error_reason": "Bank does not support transaction",
  "description": "Blocked routing for transaction: Invalid payment type",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:22:00.00Z"
}
Mid request timeout
{
  "error_code": 200,
  "error_reason": "Mid request timeout",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:24:00.00Z"
}
Communication error
{
  "error_code": 200,
  "error_reason": "Communication error",
  "request_id": "[UUID_ТРАНЗАКЦІЇ]",
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:25:00.00Z"
}
Forbidden
{
  "error_code": 5,
  "error_reason": "Forbidden",
  "timestamp": "2025-10-26T14:33:00.00Z"
}
Some unexpected message
{
  "error_code": 5,
  "error_reason": "[Some unexpected message]",
  "timestamp": "2025-10-26T14:33:00.00Z"
}
Failed to register card transaction
{
  "error_code": 200,
  "error_reason": "Failed to register card transaction",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:34:00.00Z"
}
Failed to register cascade transaction
{
  "error_code": 200,
  "error_reason": "Failed to register cascade transaction",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:35:00.00Z"
}
Endpoint type cannot be null or empty
{
  "error_code": 200,
  "error_reason": "Endpoint type cannot be null or empty",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:36:00.00Z"
}
Data is empty
{
  "error_code": 200,
  "error_reason": "Value cannot be null. (Parameter 'data')",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:36:00.00Z"
}
An unexpected internal error occured
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "An unexpected internal error occurred",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:38:00.00Z"
}
Invalid Authorization header format
{
  "error_code": 31,
  "error_reason": "Invalid authorization header format",
  "timestamp": "2025-10-26T16:03:00.00Z"
}
Handler returned null response
{
  "error_code": 210,
  "error_reason": "Handler returned null response",
  "description": "Handler returned null response",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:02:00.000Z"
}
Rate limit exceeded
{
  "error_code": 210,
  "error_reason": "Rate limit exceeded",
  "description": "Rate limit exceeded",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:01:00.000Z"
}
Access denied: Invalid or missing access token
{
  "error_code": 210,
  "error_reason": "Access denied: Invalid or missing access token",
  "description": "Access denied: Invalid or missing access token",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:00:00.000Z"
}
Request cannot be null
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Request cannot be null"
}
Flow cache limit exceeded
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow cache limit exceeded"
}
Flow configuration not found for project: {projectId}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow configuration not found for project: {projectId}"
}
Invalid flow configuration
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Invalid flow configuration"
}
Flow execution failed
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow execution failed"
}
Circular reference detected at node: {NodeIdentifier}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Circular reference detected at node: {NodeIdentifier}"
}
Node not found: {NodeIdentifier}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Node not found: {NodeIdentifier}"
}
Flow execution limit exceeded
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow execution limit exceeded"
}
Flow ended without result
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow ended without result"
}
Missing Authorization header
{
  "error_code": 31,
  "error_reason": "Missing Authorization header",
  "timestamp": "2025-10-26T16:01:00.00Z"
}
Invalid signature format
{
  "error_code": 31,
  "error_reason": "Invalid signature format",
  "timestamp": "2025-10-26T16:03:00.00Z"
}
Unsupported algorithm
{
  "error_code": 31,
  "error_reason": "Unsupported algorithm",
  "timestamp": "2025-10-26T16:04:00.00Z"
}
Invalid API key
{
  "error_code": 31,
  "error_reason": "Invalid API key",
  "timestamp": "2025-10-26T16:05:00.00Z"
}
Missing Date header
{
  "error_code": 31,
  "error_reason": "Missing Date header",
  "timestamp": "2025-10-26T16:06:00.00Z"
}
Invalid date format
{
  "error_code": 31,
  "error_reason": "Invalid date format",
  "timestamp": "2025-10-26T16:07:00.00Z"
}
Date is outdated or invalid
{
  "error_code": 31,
  "error_reason": "Date is outdated or invalid",
  "timestamp": "2025-10-26T16:08:00.00Z"
}
Missing Digest header
{
  "error_code": 31,
  "error_reason": "Missing Digest header",
  "timestamp": "2025-10-26T16:09:00.00Z"
}
Invalid digest
{
  "error_code": 31,
  "error_reason": "Invalid digest",
  "timestamp": "2025-10-26T16:10:00.00Z"
}
Request timestamp has already been used
{
  "error_code": 31,
  "error_reason": "Request timestamp has already been used",
  "timestamp": "2025-10-26T16:11:00.00Z"
}
Invalid headers specification
{
  "error_code": 31,
  "error_reason": "Invalid headers specification",
  "timestamp": "2025-10-26T16:12:00.00Z"
}
Invalid signature
{
  "error_code": 31,
  "error_reason": "Invalid signature",
  "timestamp": "2025-10-26T16:13:00.00Z"
}
Processing error:
{
  "error_code": 210,
  "error_reason": "Processing error:",
  "description": "Processing error:",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:03:00.000Z"
}
Missing required authentication headers
{
  "error_code": 31,
  "error_reason": "Missing required authentication headers",
  "timestamp": "2025-10-26T14:04:00.00Z"
}

Callback Notifications

The system sends an HTTP callback to the callback_url of your request when a transaction reaches a final state. Always verify the callback signature; see Callback Verification.

Callback Payload

Callback request
{
  "identifier": "PM0000000CRDH2H1",
  "creation_date": "2025-11-14T21:10:05.150Z",
  "request_id": "11aa22bb-33cc-44dd-55ee-66ff77aa88bb",
  "reference": "ref-card-h2h-3800112233",
  "method": "card",
  "type": "payment",
  "mode": "initial",
  "status": "success",
  "status_date": "2025-11-14T21:10:20.450Z",
  "amount": "199.99",
  "currency": "USD",
  "billing_amount": "199.99",
  "billing_currency": "USD",
  "fee_amount": "3.50",
  "fee_currency": "USD",
  "customer": {
    "identifier": "cust_card_h2h_12345",
    "email": "john.doe@example.com",
    "phone": "+15005550006",
    "first_name": "John",
    "last_name": "Doe",
    "country": "US"
  },
  "error_code": 0,
  "error_reason": null,
  "timestamp": "2025-11-14T21:10:21.000Z",
  "card": {
    "bin": "411111",
    "last4": "1111",
    "country": "US",
    "brand": "Visa",
    "holder_name": "John Doe",
    "exp_month": 12,
    "exp_year": 2028,
    "token": "a1b2c3d4-e5f6-a7b8-c9d0-e1f2a3b4c5d6"
  },
  "meta": {
    "key": "value"
  }
}