CleonPay

Quickstart

A working payment in three requests.

1. Take a payment

POST /v1/payments
curl https://api.cleonpay.com/v1/payments \
  -H "Authorization: Bearer ck_test_..." \
  -H "Idempotency-Key: order-1001" \
  -H "Content-Type: application/json" \
  -d '{
    "method": "ideal",
    "amount": 1050,
    "currency": "EUR",
    "country": "NL",
    "success_url": "https://shop.example.com/thanks",
    "error_url": "https://shop.example.com/failed",
    "reference": "order-1001",
    "customer": { "first_name": "Joe", "last_name": "Bloggs" }
  }'

The response carries a redirect_url:

{
  "id": "3743881d-0fce-416c-b3de-8bc3f5d414b1",
  "object": "payment",
  "status": "awaiting_customer",
  "amount": 1050,
  "currency": "EUR",
  "method": "ideal",
  "redirect_url": "https://ideal.example/pay/...",
  "reference": "order-1001",
  "livemode": false
}

2. Send the customer there

Never render it in an iframe. The schemes forbid it, and banks break out of frames anyway. Redirect the browser.

3. Wait for the webhook

When the money moves we POST to your endpoint:

{
  "id": "evt_01H...",
  "type": "payment.settled",
  "created": "2026-08-21T13: 15: 26.438Z",
  "data": { "payment_id": "3743881d-0fce-416c-b3de-8bc3f5d414b1" }
}

Fetch the payment to see its full state, then release the goods.

Do not fulfil on the return URL. A customer landing on success_url means their browser came back, not that the payment settled. Only the webhook is authoritative.