REST API v1 · Resource
WhatsApp Pay
Ask for a payment inside a WhatsApp chat and check whether it was paid.
API reference · WhatsApp Pay
Endpoints
Paths are relative to https://fliok.com/api/v1. Each endpoint names the scope and the lowest key role it needs; a key without them gets 403 (see Authentication). The WhatsApp Pay endpoints answer for a workspace once the feature is set up for it.
Send an order the customer pays without leaving WhatsApp, through the gateway you set up in Settings → Integrations. The same rules as the inbox apply: a WhatsApp chat (not Instagram), inside its 24-hour window, a customer who hasn’t opted out. Amounts are whole numbers in paise and in Indian rupees only. Send your own order number as referenceId: a retry with the same one answers with the request already sent instead of asking twice. When the customer pays, the payment.paid webhook fires and the payment is recorded on their lead.
WhatsApp Pay
2- POST
/payment-requestsAsk for a payment inside a WhatsApp chat — by conversationId or the customer’s number (to). INR, in paise. Your referenceId makes retries safeScopepayments:write· agent role or higherNeeds an API key - GET
/payment-requests/{id}Where a payment request stands — by our id or your referenceIdScopepayments:read· viewer role or higherNeeds an API key
Examples
Request a payment in a chat, then check it
# Inside the customer's 24-hour window, in a WhatsApp chat. Amounts in paise (₹1,499 = 149900).
curl -X POST https://fliok.com/api/v1/payment-requests \
-H "Authorization: Bearer wa_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversationId": "2b7e9f1c-1a44-4c3e-9b0a-5d1a2f6d8e7c",
"referenceId": "ORD-1042",
"items": [ { "name": "Brass diya set", "quantity": 1, "unitPaise": 149900 } ],
"shippingPaise": 9900,
"body": "Here is your order. Tap Review and pay to pay on WhatsApp.",
"expiresInMinutes": 1440
}'
# :id is our id or your referenceId
curl https://fliok.com/api/v1/payment-requests/ORD-1042 -H "Authorization: Bearer wa_YOUR_API_KEY"// 201 Created (200 with "duplicate": true when ORD-1042 was already sent in this chat)
{
"paymentRequest": {
"id": "a91c…",
"referenceId": "ORD-1042",
"conversationId": "2b7e…",
"messageId": "c0de…",
"status": "pending",
"displayStatus": "pending",
"statusLabel": "Awaiting payment",
"items": [ { "name": "Brass diya set", "quantity": 1, "unitPaise": 149900, "linePaise": 149900, "retailerId": null } ],
"subtotalPaise": 149900,
"taxPaise": 0,
"shippingPaise": 9900,
"discountPaise": 0,
"totalPaise": 159800,
"paidPaise": null,
"currency": "INR",
"paymentMethod": null,
"failureReason": null,
"expiresAt": "2026-10-06T10:00:00.000Z",
"paidAt": null,
"orderStatus": null,
"createdAt": "2026-10-05T10:00:00.000Z"
},
"messageId": "c0de…"
}
// Refusals name the cause:
// 409 whatsapp_pay_not_set_up · whatsapp_pay_paused · instagram_conversation · contact_opted_out
// 422 outside_24h_window — send a template first; once they reply you can ask for payment
// Subscribe to payment.paid instead of polling.Rate limits
The buckets these endpoints use. Burst is how many requests you can make back-to-back from a full bucket; sustained is how fast it refills.
| Bucket | Endpoints | Burst | Sustained |
|---|---|---|---|
| Reads | /messages · /conversations · /contacts · /templates · /phone-numbers · GET /webhooks · Instagram reads · GET /payment-requests/{id} | 600 | 60 / sec |
| WhatsApp Pay | POST /payment-requests | 30 | 1 / 2 sec |
Every limit, the RateLimit-* headers and what to do on a 429: Rate limits.