Initiate a terminal payment
Send a card-present payment request to a specific terminal device. The payment is dispatched to the merchant's POS connector which forwards it to the PAX terminal.
Device Selection: You must provide a device_id. Use List Terminal Devices to discover available devices and their IDs. Even merchants with a single terminal must pass the device_id explicitly — there is no auto-routing fallback.
Invoice Association: invoice_id is optional. Omit it for walk-in or ad-hoc payments where no pre-existing invoice exists.
The response returns immediately with status requested. Subscribe to terminal webhooks (billing.terminal_payment.succeeded, billing.terminal_payment.declined, etc.) to receive the outcome asynchronously.
Related endpoints
GET /terminal-payments— List terminal paymentsGET /terminal-payments/{id}— Retrieve a terminal paymentPOST /terminal-payments/{id}/cancel— Cancel a terminal paymentPOST /terminal-payments/{id}/refund— Refund a terminal paymentPOST /terminal-payments/{id}/void— Void a terminal payment
Common errors
400 invalid_request— malformed payload or failed validation.401 unauthenticated— missing, malformed, or revoked API key.403 permission_denied— key lacks the required scope, or the resource belongs to a different merchant.409 conflict— Idempotency-Key collision with a different body, or a concurrent state-transition conflict.422 unprocessable_entity— business-rule failure (for example, refunding more than the original charge).
Idempotency
Pass an Idempotency-Key header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see the idempotency guide.
Your RevKeen API key (powered by Unkey). Get it from Dashboard > Settings > API Keys. Use rk_sandbox_* for test mode and rk_live_* for production.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://api.revkeen.com/v2/terminal-payments" \ -H "x-api-key: $REVKEEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "device_id": "d1e2f3a4-b5c6-7890-abcd-ef1234567890", "amount_minor": 5000, "currency": "GBP", "invoice_id": "00000000-0000-0000-0000-000000000000", "reference": "walk-in-sale-001" }'{
"data": {
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"invoice_id": "f4c4edb8-11e0-4b33-bcc1-482dc59ebb32",
"device_id": "3bafab7b-4400-4bcf-8e6e-09f954699940",
"type": "sale",
"status": "requested",
"amount_minor": 0,
"currency": "string",
"reference": "string",
"terminal_serial": "string",
"uti": "string",
"auth_code": "string",
"response_code": "string",
"rrn": "string",
"card_scheme": "string",
"masked_pan": "string",
"entry_mode": "string",
"error_message": "string",
"created_at": "string",
"completed_at": "string"
}
}{
"error": "string",
"message": "string",
"code": "string"
}{
"error": "string",
"message": "string",
"code": "string"
}{
"error": "string",
"message": "string",
"code": "string"
}{
"error": "string",
"message": "string",
"code": "string"
}{
"error": "string",
"message": "string",
"code": "string"
}