ROKIConnect
Connectors Start API SDKs Migrate MCP Portal ES

Creating a payment

POST /api/connect/v1/payments

7.1 Required fields

Field Type Rule
amount number Minimum 0.01. Decimal units, not cents (150.50 = L 150.50). No maximum enforced by the API.
external_reference string Your order id. Max 191. Not unique (see 11).
name string Label the customer sees at checkout. Max 191.

7.2 Optional fields

Field Type Notes
currency_code string ISO 4217 numeric ("340" = HNL). Defaults to the terminal's currency. Only currencies enabled on that terminal are accepted.
description string Max 120.
metadata object Your own key/value pairs. Must be an object: a string returns 422. See 10.
success_url / cancel_url string Return URLs. Use HTTPS (see 12.4).
expires_at string Honduras time (UTC-6), must be in the future. Accepts YYYY-MM-DD HH:MM:SS and ISO 8601.
sales_tax_type enum none (default), fixed, percentage.
sales_tax_value number Required when the type is not none. As a percentage, max 100.
tip_enabled boolean See 8.2.
service_fee_enabled boolean See 8.3.
reusable boolean See 8.4.
customer object Prefills the checkout: name, email, phone, identity_number. See 7.5.
lock_customer_fields boolean Makes the prefilled fields read-only. See 7.5.

7.3 Minimal example

{
  "amount": 150.00,
  "external_reference": "order-1001",
  "name": "Order #1001"
}

7.4 Response (201)

{
  "id": 706,
  "status": "pending",
  "name": "Order #1001",
  "description": null,
  "amount": 150,
  "reusable": false,
  "subtotal": 150,
  "sales_tax_amount": 0,
  "service_fee_amount": 0,
  "total": 150,
  "currency": "340",
  "currency_iso": "HNL",
  "external_reference": "order-1001",
  "metadata": {},
  "checkout_url": "https://aura.roki.systems/pay/link/example1a2b3c",
  "transaction_id": null,
  "expires_at": "2026-08-09 18:00:00",
  "created_at": "2026-08-08 14:30:07",
  "paid_at": null
}

Store id in your database - it is the direct handle on the payment. GET /payments can also filter by external_reference (9.2), but that answers with a page of matches, not one payment, because external_reference is not unique. Then redirect the customer to checkout_url.

Two notes on that response. transaction_id is null until the payment is charged, and it is a UUID string - it changed type from an integer in an earlier version, and it is the identifier required by void, refund and receipts. And the checkout_url slug is a 12-character lowercase string: it carries no prefix, so never pattern-match a slug - redirect to the exact URL you were given.

7.5 Prefilling the customer

The optional customer object prefills the hosted checkout with a known customer's details. Every field inside it is optional and independent:

{
  "customer": {
    "name": "Ahmed Khan",
    "email": "ahmed@example.com",
    "phone": "+50499999999",
    "identity_number": "0801199000000"
  },
  "lock_customer_fields": true
}

By default prefilled fields stay editable. With lock_customer_fields: true, every field you send with a non-empty value becomes read-only at checkout; fields you omit stay blank and editable even then.

identity_number is worth sending: it is also the preferred identifier for looking up that customer's saved cards later (see section 23).

Both fields are echoed back in the response, which matters more than it sounds: because this API ignores unknown fields rather than rejecting them, the echoed customer object is how you confirm from the response that the prefill actually applied. Check it - together with warnings (12.1) - rather than assuming the 201 means it worked.

"customer": { "name": "Ahmed Khan", "email": "ahmed@example.com",
              "phone": "+50499999999", "identity_number": "0801199000000" },
"lock_customer_fields": true