How it worksHardwarePayment methods IndustriesPricingDevelopers Get started
Developers

Build payments into your product in an afternoon

A clean REST interface, signed requests and signed webhooks — the same for sandbox and production. Card, wallet, iDEAL and Sentoo, settled locally in USD, ANG and EUR.

The interface below shows how you integrate — contact us for ak_test sandbox keys to start building today.
Ways to integrate

Pick the integration that fits

From a two-line payment link to a full API integration — card data never touches your servers.

Hosted checkout

Create a session and redirect. We handle the payment page, 3-D Secure and PCI scope.

POST /v1/checkout-sessions

Payment links & QR

Generate a shareable link or QR with an amount, expiry and usage cap — send via WhatsApp or e-mail.

POST /v1/payment-links

SoftPOS & terminals

Tap-to-Pay on iPhone/Android and PAX/Ingenico terminals through one session endpoint.

POST /v1/pos-sessions

Saved cards & mandates

Tokenize cards with setup intents and charge later for subscriptions and no-shows.

POST /v1/setup-intents

E-commerce plugins

Drop-in modules for WooCommerce, Shopify, Magento, PrestaShop, Wix and BigCommerce.

Booking & PMS

Connect your PMS or booking platform for pre-auths, deposit holds and check-in links.

Quickstart

One call to a payment page

Create a checkout session server-side, then redirect the customer to the returned URL.

request · Node.js
// create a hosted checkout session
const res = await cariopay.post("/v1/checkout-sessions", {
  amount: 12500,            // $125.00, in cents
  currency: "USD",
  reference: "BON-10241",
  methods: ["card","ideal","sentoo","applepay"],
  success_url: "https://shop.example/thanks",
  cancel_url:  "https://shop.example/cart"
});

// redirect the customer
redirect(res.url);
response · JSON
{
  "id": "cs_test_8Kd93h2...",
  "status": "open",
  "url": "https://pay.cariopay.com/c/8Kd93h2",
  "amount": 12500,
  "currency": "USD",
  "expires_at": "2026-09-22T18:00:00Z"
}
Security

Signed requests, replay-safe

Every request is signed with HMAC-SHA256. No card data reaches your servers, keeping you out of PCI scope.

  • Headers: X-Key-Id, X-Timestamp, X-Nonce and X-Signature
  • A 5-minute freshness window on the timestamp
  • Single-use nonce — replays are rejected
  • Idempotency keys prevent duplicate charges on retries
  • Signing helpers for Node.js, Python and PHP (~20 lines)
signing · Node.js
import crypto from "crypto";

function sign(keyId, secret, body) {
  const ts = Date.now();
  const nonce = crypto.randomUUID();
  const base = [keyId, ts, nonce, body].join(".");
  const sig = crypto.createHmac("sha256", secret)
                   .update(base).digest("hex");
  return { ts, nonce, sig };
}
Webhooks

Know the moment money moves

Signed, retried event deliveries keep your systems in sync — verify the signature header before you trust a payload.

EventFires when
payment.succeededA payment is authorized & captured
payment.failedA payment is declined or errors
checkout.completedA hosted session finishes successfully
checkout.expiredA session expires unpaid
refund.succeededA refund is processed
  • Signed deliveries — verify before you trust the payload
  • Up to 8 retries over ~17 hours on non-2xx responses
  • Handle idempotently — the same event may arrive twice
  • Respond 200 quickly; do heavy work asynchronously
Sandbox

Test cards

Use these in the sandbox with any future expiry and any CVC. No real money moves.

Card numberBrandResult
4111 1111 1111 1111VisaApproved
5555 5555 5555 4444MastercardApproved
4000 0000 0000 0002VisaDeclined
4000 0000 0000 3220Visa3-D Secure
Multi-currency: settle in USD, ANG and EUR with support for many more presentment currencies. 3-D Secure 2.2, vault tokenization and idempotency are available across all methods.
Get started

Request sandbox access

Tell us what you’re building and we’ll issue test keys and the signing helpers. Same-day testing is typical.

Request test keys