API reference

Endpoint

POST https://api.formdoc.dev/v1/submit

Accepted content types: application/x-www-form-urlencoded, multipart/form-data and application/json. Cross-origin requests are allowed from any site (Access-Control-Allow-Origin: *); credentials are never used.

Reserved fields

These fields control FormDoc and are not stored with the submission. Only access_key is required.

Field Purpose
access_key Your form’s public key (fd_ + 24 characters). Required.
subject Email subject
from_name Sender display name
redirect Where to send the visitor after an HTML post. Must be a full http or https address.
botcheck Honeypot. Must be empty.
cf-turnstile-response, h-captcha-response, g-recaptcha-response Captcha tokens, when the form has a captcha turned on
replyto Reply-To address for the notification email
ccemail Extra CC for this submission (paid plans; only addresses that confirmed for the form)
_autoresponse Set to off to skip the autoresponder for this submission (paid plans)

Fields with the same name, such as a group of checkboxes, are joined with , .

Limits

  • 64 KB of text, 50 fields and 10,000 characters per field.
  • 10 submissions a minute per visitor per form, 120 a minute per form, and 60 a minute per visitor across all forms.
  • Monthly submissions depend on your plan.

Responses

JSON (when you send JSON or Accept: application/json):

{ "success": true, "message": "Submission received", "submission_id": "01J..." }

HTML form posts get a 303 redirect: to your redirect field, then the form’s redirect setting, then FormDoc’s hosted thank-you page.

Submissions caught by the honeypot or spam scoring get the same success response, so bots learn nothing. They’re stored as spam and you’re not emailed.

Errors

{ "success": false, "error": { "code": "invalid_key", "message": "..." } }

HTML form posts are redirected to the form’s error page setting, or to a hosted page that explains the problem.

Code HTTP Meaning
invalid_request 400 The body couldn’t be read
unsupported_media_type 415 Not one of the three supported content types
payload_too_large 413 Over the size, field or character limits
invalid_key 400 access_key is missing or unknown
key_unverified 403 The recipient email address isn’t confirmed yet
form_inactive 403 The form is paused or suspended
origin_not_allowed 403 The website isn’t in the form’s trusted domains (paid plans)
rate_limited 429 Too many submissions; wait for the time in Retry-After
captcha_failed 400 The captcha token is missing or invalid
quota_exceeded 429 The monthly limit (plus 10% grace) is reached
files_not_allowed 403 Files were sent but this form can’t accept them
internal_error 500 Our fault. Please try again later.