CleonPay

Accepting payments

One request shape for every method.

POST /v1/payments
FieldTypeNotes
methodstringRequired. See payment methods.
amountintegerRequired. Minor units. €10.50 is 1050.
currencystringRequired. ISO 4217, e.g. EUR.
countrystringCustomer's country. Required by most local methods.
success_urlstringRequired. HTTPS.
error_urlstringRequired. HTTPS.
referencestringYour order id. Searchable.
customerobjectfirst_name, last_name, email, reference.
metadataobjectReturned untouched on every read.
Amounts are integers in minor units. Sending 10.50 is rejected rather than interpreted. That is deliberate: silently reading it as ten and a half cents would undercharge by a factor of a hundred, and the error would surface in your bank statement rather than your logs.

Cards work exactly like everything else

A card payment returns a redirect_url too. It points at CleonPay's secure payment page, where the customer enters their card and pays without ever leaving it. Card numbers never touch your servers, which keeps you out of PCI DSS scope entirely. Your integration is identical for iDEAL and for Visa: create, redirect, wait for the webhook.

Let the customer choose: omit the method

Send the request without a method and the payment page shows every method enabled on your account (cards inline, local methods handing over to their banks) and collects anything the chosen scheme still needs. One URL, the whole catalogue. This is also what powers payment links.

Validation happens before the bank sees it

Scheme rules are enforced here, so you get a precise error instead of an opaque acquirer rejection.

{
  "error": {
    "type": "invalid_request_error",
    "code": "method_requirements_not_met",
    "message": "The request does not satisfy iDEAL's requirements.",
    "details": [
      { "code": "currency_not_supported", "field": "currency",
        "message": "iDEAL supports EUR, not GBP." },
      { "code": "country_not_supported", "field": "country",
        "message": "iDEAL is available to customers in NL, not GB." }
    ]
  }
}

Reading a payment

GET /v1/payments/{id}
GET /v1/payments

List accepts status, method, reference, limit and created_before for keyset pagination.