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.

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.