Skip to main content

Accept a payment ๐Ÿ›Ž๏ธ

Direct Payment API

Use a sale to charge a card and settle the funds in a single step.

A sale is the standard flow for a one-time payment. Set intent: transfer to charge the card and settle the funds in the same request, with no separate capture step. Use it whenever the final amount is known at the time of payment and won't need adjusting afterwards.

If you need to reserve funds now and settle a possibly different amount later, use Authorise a payment instead. To return funds from a completed sale, use Refund a payment.

How it works ๐Ÿ›Ž๏ธโ€‹

  1. Authenticate โ€” attach your Bearer token and Integrator ID (X-Integrator-ID) to the request headers.
  2. Place card details inside sender.custom_data: PAN, expiry month, expiry year, and holder name. CVC is submitted separately at root custom_data.authentication.cvc.
  3. Set intent: transfer, channel: ecommerce, and routing.payment_flow: credit_card, then send the request โ€” the gateway debits the cardholder immediately.
  4. A successful sale returns status: pending (accepted and queued for the network) for the payment and an id โ€” save it as your payment_id. Check custom_data.transaction_iso_properties.processor_response_code for the actual approval outcome; 00 means approved.

Let's try a payment ๐Ÿ›Ž๏ธ๐Ÿงถโ€‹

note

Keep in mind that:

  • intent: transfer debits funds immediately โ€” there is no separate capture step;
  • sender holds the card; receiver holds the configuration_id.

Here's the smallest valid request for a sale โ€” set intent: transfer and provide the card details directly.

Comments below follow popular API clients' JSON syntax for readability โ€” strip them before sending via curl, fetch, or another HTTP client.

Request body
{
"amount": 1000, // Your amount in minor units
"currency": "EUR", // Your currency
"sender": {
"type": "credit_card", // Represent the sender in this operation
"custom_data": {
"pan": "5341260000000056",
"expiry_month": "12",
"expiry_year": "2033",
"holder_name": "John Snow"
}
},
"receiver": {
"configuration_id": "<CONFIGURATION_ID>" //PSP/acquirer configuration identifier.
},
"routing": {
"payment_flow": "credit_card"
},
"intent": "transfer", // This intent is used to debit funds immediately
"channel": "ecommerce", // Sale channel (e.g. `ecommerce`, `moto`)
"custom_data": {
"authentication": {
"cvc": "123"
}
}
}

Check the HTTP response โ€” the desired status is 201, meaning the request was accepted. The response body also includes status: pending, since the sale is queued for network processing. Save these fields to later trace the payment

FieldPurpose
idPayment ID โ€” used for GET, reverse, and webhooks
initial_operation_idTransfer ID for this sale
network_transaction_referenceScheme network reference

For more in depth details check Payment status transitions and Response ID Fields.

๐Ÿงถ Try for yourself

Try it

Call this flow directly in the API Reference.

  • POST Create Direct payment