POS Integrations API

Peach Payments enables in-store card payments through the Payment App on Sunmi terminals in South Africa. Use the POS Integrations API when your POS runs on a separate device from the Peach Payments terminal. Your till calls Peach Payments over HTTPS to push the payment to the terminal, the customer pays on the terminal, and your backend receives the outcome via a point of sale webhook.

📘

Ask Peach Payments to enable the POS Integrations API on the terminal.

What you need from Peach Payments

ItemRequired forHow to get it
Sandbox accountUAT terminal testingContact support
UAT serial numberSending requestsPeach Payments or your channel partner
Point of sale webhook set upReceiving the payment outcomeContact support with your HTTPS URL
POS Integrations API keyAuthenticating requestsContact support

Get an API key

Contact support to have Peach Payments issue a merchant-scoped API key.

Send it on every request: Authorization: Bearer pk_live_xxx

EnvironmentBase URL
Sandboxhttps://pos-sandbox.peachpayments.com
Livehttps://pos.peachpayments.com

Sale flow

  1. Make sure the terminal app is open, connected to Wifi, and displays Remote payments online.
  2. Your till calls POST /integrations/v1/terminals/{terminalId}/payment-requests with the payment details.
  3. Peach Payments pushes the payment to the terminal and returns 202 (received), 409 (busy), 422 (rejected), 504 (no ack), or 503 (offline).
  4. The customer completes payment on the terminal.
  5. Your backend receives a point of sale webhook with the outcome, matched to your order via merchantTransactionId.
  6. Evaluate success: transactionType.value is 0 and transactionResult is approved_confirmed.

Payment request (sale)

curl --location "https://pos-sandbox.peachpayments.com/integrations/v1/terminals/{terminalId}/payment-requests" \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer pk_live_xxx' \
--data '{
  "amount": 3000,
  "merchantTransactionId": "your_order_id",
  "paymentMethod": "CARD",
  "posData": {"customField": "customValue"}
}'
FieldRequiredDescription
amountYesAmount in minor units (cents)
merchantTransactionIdYesYour order reference for reconciliation
paymentMethodNoRouting hint, for example "CARD"
posDataNoAdditional custom fields echoed on the transaction and Dashboard

{terminalId} in the URL is the terminal's serial number, for example TJ03P28120090. You can find it at the back of the terminal. It typically starts with PC, TJ, or P3.

Response codes

HTTP statusMeaningHow to handle
202Received - Peach Payments accepted the request and pushed it to the terminalWait for the point of sale webhook to learn the outcome
409Busy - the terminal is already processing another transactionWait, then retry when the terminal is free
422Rejected - the request was invalid, for example a malformed payload or a terminal not enabled for the POS Integrations APIFix the request; do not retry unchanged
503Offline - Peach Payments could not reach the terminalCheck the Remote payments online chip on the terminal; if it shows online, allow the cashier to push the payment again
504No acknowledgement - the terminal did not confirm receipt in timeCheck terminal connectivity; retry if the terminal is online

The response body includes a requestId. Peach Payments echoes the same value back as posData.requestId on every webhook this payment request generates, so you can correlate incoming webhooks to the request that triggered them. A single requestId can produce more than one webhook event, for example if the terminal automatically starts a new transaction attempt after an incorrect PIN.

Webhook setup

The POS Integrations API does not support polling for the result. Your backend must receive a point of sale webhook to learn the outcome. Contact support with your HTTPS URL and optional custom headers.

Reconciliation

Match till orders to payments using merchantTransactionId on the webhook payload.
The Reconciliation API returns the same value in its transactionId field - use it as a fallback if webhook delivery fails. See Terminal integration flows for Dashboard and Reconciliation API options.

Also store the transactionId from the webhook payload against the order when it arrives - you need it to request a refund or void later.

Next steps

  1. Contact support for an Integrations API key.
  2. Configure point of sale webhooks.
  3. Test end-to-end with a UAT terminal - see Test your integration.

Did this page help you?