API documentationBahasa Indonesia
Error codes and how to fix them.
Every failed answer has an HTTP status and a code. API v2 always writes { "error": { "type", "code", "message", "param", "doc_url", "request_id" } }; doc_url points to that code on this page. The message text is in Indonesian, like the app.
General rules
- 4xx: fix the request first. Sending it again unchanged gives the same result, except 429 and 409
request_in_progress. - 429: wait for the
Retry-Afterheader (seconds), then retry. - 5xx or a dropped connection: retry with growing pauses and the same
Idempotency-Key, so nothing is sent twice. - Quote the
request_id(also in theRequest-Idheader) when you contact Klik Flow support.
Codes
type groups the codes: authentication_error, permission_error, invalid_request_error, not_found_error, conflict_error, rate_limit_error, channel_error and api_error.
| Code | HTTP | Meaning and fix |
|---|---|---|
missing_keyauthentication_error | 401 | API key not sent. Send the key in the header Authorization: Bearer kf_live_… or kf_test_…. |
key_invalidauthentication_error | 401 | Unknown API key. The key has a typo or is not an API key. Create a key in Settings › API & Webhook (Pengaturan › API & Webhook). |
key_revokedauthentication_error | 401 | API key revoked. The key was revoked, or the grace period after it was replaced has ended. Use the new key. |
key_expiredauthentication_error | 401 | API key expired. The key's lifetime has ended. Create a new key. |
member_inactiveauthentication_error | 401 | Key creator is no longer a member. The key's creator is no longer a member of this business. The owner needs to create a new key. |
ip_not_allowedpermission_error | 403 | Server IP not in the key's list. Add your server's IP to the key's IP list, or clear the list. |
plan_no_apipermission_error | 403 | Plan does not include the API for live keys. Live keys need a plan with the API feature. Test keys work on every plan. |
tenant_blockedpermission_error | 403 | Business access suspended. This business's access is suspended. Contact Klik Flow support. |
rate_limitedrate_limit_error | 429 | Too many requests per minute. Wait for the time in the Retry-After header (seconds), then retry. |
internal_errorapi_error | 500 | Problem at Klik Flow. Something went wrong at Klik Flow. Retry with the same Idempotency-Key; mention the request_id if it happens again. |
scope_missingpermission_error | 403 | Key lacks this permission. This key does not have the permission for this action. Create a key with the permission listed in the reference. |
permission_missingpermission_error | 403 | Key creator's role lacks this permission. The key creator's role does not have this permission. The owner can add it in Settings › Roles & access (Pengaturan › Role & hak akses). |
invalid_jsoninvalid_request_error | 400 | Body is not valid JSON. Send a JSON body with the header Content-Type: application/json. |
idempotency_key_invalidinvalid_request_error | 400 | Invalid Idempotency-Key. An Idempotency-Key is 1–255 characters without spaces, for example a UUID. |
idempotency_conflictconflict_error | 409 | Idempotency-Key used for different content. This Idempotency-Key was already used for another request. Use a new key for a new request. |
request_in_progressconflict_error | 409 | The same request is still being processed. A request with the same Idempotency-Key is still being processed. Try again in a few seconds. |
invalid_requestinvalid_request_error | 422 | Invalid field. The field in param is invalid. Check its type and value in the reference. |
invalid_phoneinvalid_request_error | 422 | Invalid destination number. Use 8–15 digits with the country code, for example 6281234567890. |
message_too_longinvalid_request_error | 422 | Message too long. At most 4,000 characters for text and captions. |
media_too_largeinvalid_request_error | 413 | File too large. Make the file smaller, within the limit for its type. |
test_number_requiredpermission_error | 403 | Test keys send only to test numbers. Test keys send only to test numbers. Add the number in Settings › API & Webhook › Test numbers (Pengaturan › API & Webhook › Nomor uji). |
channel_not_allowedpermission_error | 403 | Channel not allowed for this key. This key is limited to other channels, or its creator's role may not use this channel. |
channel_unavailablechannel_error | 409 | No usable WhatsApp number. No connected WhatsApp number may be used by this key. Connect one in Channel, or fill in from. |
channel_pausedpermission_error | 403 | Channel paused. The channel is paused because it exceeds the plan's quota. The owner can unpause it in Channel. |
window_closedchannel_error | 409 | Outside the 24-hour window. More than 24 hours have passed since the customer last wrote. Send type: template. |
contact_blockedchannel_error | 422 | Contact blocked or unsubscribed. The contact is blocked or has unsubscribed, so it is not sent messages. |
daily_limitrate_limit_error | 429 | Daily message limit reached. The daily message limit was reached. Wait for the time in Retry-After, or upgrade the plan. |
send_failedchannel_error | 502 | Message failed to send. The message was created but failed to send. See message, then retry with the same Idempotency-Key. |
not_foundnot_found_error | 404 | Not found. The id does not exist or is outside what the key's creator can see. |
template_not_foundnot_found_error | 404 | Template not found or not approved. The template does not exist or is not approved yet. Check its name and language with GET /api/v2/templates. |
template_valuesinvalid_request_error | 422 | Template variables incomplete. Fill in every template variable named in message. |
template_not_supportedinvalid_request_error | 422 | Template type not supported yet. This template type cannot be sent through the API yet. |
otp_code_invalidinvalid_request_error | 422 | Invalid OTP code. Set otp.code to 1–15 letters, digits, or - characters. |
new_chat_limitrate_limit_error | 429 | Limit of chats to new numbers reached. This key has reached today's limit of chats to new numbers. |
channel_refusedchannel_error | 502 | WhatsApp refused the message. WhatsApp refused the message. The reason is in message. |
cursor_invalidinvalid_request_error | 400 | Invalid cursor. Use next_cursor from the previous response as it is. |
live_key_requiredpermission_error | 403 | Live key required. Managing webhooks needs a live key, because webhooks receive real events. Test keys can still read and send to test numbers. |
webhook_limitinvalid_request_error | 422 | Webhook limit reached. At most 5 webhooks per business. Delete a webhook you no longer use first. |
console_test_onlypermission_error | 403 | The Try it console takes test keys only. The Try it console (Coba) in the docs accepts only test keys (kf_test_…). Call the API with a live key from your server. |