Form ID

Errors

Every error code Ikiform returns, with its HTTP status, cause and fix.

Form submissions and the REST API share one error envelope. JSON requests get it with the matching HTTP status; browser form posts get a hosted error page with the same message and status.

The error envelope

Error
{
  "ok": false,
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Please slow down."
  },
  "request_id": "req_01k7v2c9t3e8m5q4x6z0a1b2c3"
}
  • error.code is stable; branch on it. error.message is plain English for people and may change.
  • error.fields is present on validation errors, keyed by field id, each with a list of messages. Errors about the whole body use the key _form.
  • error.challenge_url is present on challenge_required.
  • request_id matches the X-Request-Id header that every response carries.
  • Rate-limited responses carry Retry-After in seconds. Both headers are readable from browser code.

Codes

400 invalid_body

MessageThe request body could not be read.
CauseMalformed JSON or multipart, a JSON array or string instead of an object, or an idempotency key over 255 characters.
FixSend one JSON object, or let the browser or FormData build the body.

400 invalid_request

MessageThe request is invalid.
Causelimit, status, form_id or cursor is invalid. The message names the parameter.
FixUse limit 1 to 100, status received or spam, a real frm_ id, and cursors exactly as returned.

401 unauthorized

MessageA valid API key is required.
CauseNo Authorization header, not a Bearer token, or an unknown, revoked or expired key.
FixSend Authorization: Bearer ik_sk_... with a live secret key.

402 plan_required

MessageThis form isn't accepting submissions right now.
CauseThe workspace has no active plan. This can only happen once billing is turned on.
FixChoose a plan in the dashboard under Settings.

403 forbidden

MessageYou do not have access to this resource.
CauseThe API key is malformed, belongs to another workspace, is publishable on the REST API, or lacks the needed scope.
FixUse a secret key from this workspace with the scope named in the message.

403 origin_not_allowed

MessageThis form does not accept submissions from this site.
CauseThe post came from a site outside the form's allowed domains and the form rejects mismatches, or a publishable key was used from a domain not listed on the key.
FixAdd the site to Allowed domains or to the key's domains. For server posts, use a secret key.

403 form_paused

MessageThis form is not accepting submissions right now.
CauseThe form is paused in the dashboard.
FixResume the form.

403 captcha_failed

MessageThe captcha check failed. Please try again.
CauseThe Turnstile token is missing, expired, already used, or didn't verify.
FixGet a fresh token for every submit. With your own keys, check that the site key matches the secret.

403 challenge_required

MessageComplete the human check, then send the form again.
CauseThe form uses the Ikiform human check and a JSON post arrived without a token.
FixCall challenge(formId) from the SDK and pass the token, or use error.challenge_url. Server posts can send a secret key instead.

404 not_found

MessageNot found.
CauseThe form doesn't exist, was deleted or disabled, or the id or route is wrong. Also returned for a GET to /f/<formId>.
FixCopy the endpoint from the form's overview, and post rather than opening it in a tab.

405 method_not_allowed

MessageThis method is not allowed here.
CauseA browser preflight on the REST API, which is server to server only.
FixCall /api/v1 from your backend.

409 idempotency_in_progress

MessageA request with this idempotency key is still being processed.
CauseA request with this idempotency key is still being processed.
FixWait a moment and retry with the same key; you'll get the first response.

413 payload_too_large

MessageThe submission is too large.
CauseThe body, a field name, a value or the number of fields is over its limit. The message says which.
FixSee Limits. Split large text across fields or store files elsewhere and send a link.

415 unsupported_media_type

MessageSend the form as urlencoded, multipart or JSON.
CauseThe Content-Type isn't urlencoded, multipart or JSON, or is missing.
FixSet Content-Type: application/json when posting JSON.

415 unsupported_charset

MessageOnly UTF-8 is supported.
CauseThe body isn't UTF-8, or declares another charset.
FixEncode as UTF-8. Add accept-charset="utf-8" to old HTML forms.

422 validation_failed

MessageSome fields are invalid.
CauseFields failed validation. error.fields maps field ids to messages.
FixShow the messages next to the fields. See Fields.

422 files_not_supported

MessageFile uploads are not supported yet.
CauseThe post contains a file. File uploads are not built yet.
FixRemove file inputs, or upload files elsewhere and submit the link.

422 too_deep

MessageThe JSON body is nested too deeply.
CauseThe JSON body is nested more than 3 levels deep, counting the top-level object.
FixFlatten the data, for example { "address_city": "London" }.

422 idempotency_mismatch

MessageThis idempotency key was already used with a different payload.
CauseThis idempotency key was already used for this form in the last 24 hours with different fields.
FixUse a new key for new data. Keep the same key only for exact retries.

429 rate_limited

MessageToo many requests. Please slow down.
CauseOver a rate limit. Retry-After says how many seconds to wait.
FixWait and retry. If real visitors hit it, change the form's rate limit.

429 quota_exceeded

MessageThis form isn't accepting submissions right now.
CauseThe workspace received 2 times its monthly submission limit this month.
FixUpgrade, or wait for the next month. See Monthly usage.

500 server_error

MessageSomething went wrong on our side.
CauseSomething failed on Ikiform's side.
FixRetry with backoff and an idempotency key. If it keeps happening, quote request_id.

Not errors

  • Spam gets the same 201 or redirect as a real submission. Look for it under the spam filter in the dashboard.
  • A _redirect that isn't allowed is ignored, and the browser lands on the hosted thank-you page.
  • A _replyto that isn't one valid email address is ignored.

Retrying

  • Retry 429 after Retry-After, and 500, 409 or network errors with backoff. Send an idempotency key so a retry never creates a duplicate.
  • Don't retry other 4xx errors unchanged. Fix the request first.