For developers

A simple REST API

Read and manage your forms and submissions from your own system, Zapier, Make, or your own AI agent. Authenticate with an account API key and get clean JSON back. For each key, you choose read-only or also write access — account-safe.

Getting started

All requests go to the base URL and send your key along as a Bearer token; the response is always application/json. For each key you decide per resource (forms, submissions) whether it may read or also write — write access is never granted automatically.

Base URL

https://app.formuliermet.nl/api/v1

Authentication

curl https://app.formuliermet.nl/api/v1/me \
  -H "Authorization: Bearer fmb_je_sleutel_hier"

Create a key in the app under Account → API & integrations. You'll see the full key only once — store it safely. A key grants access to your account's data; you can revoke it at any time. API access is included in the larger packages (see pricing).

Endpoints

GET
/me
Verifies your key and returns your account id — handy for testing a connection.
GET
/forms
Forms in your account (id, title, slug, active, number of submissions). Paginated with ?page and ?limit.
GET
/forms/{id}
A single form, including the field definitions (id, type, label, required).
GET
/forms/{id}/submissions
Submissions for a form, newest first. Paginate with ?page and ?limit (max 100); fetch only new ones with ?since=<ISO-date> — ideal for polling integrations.
GET
/submissions/{id}
A single submission with all filled-in fields in data.
POST
/forms
Create a form. scope forms:write
PATCH
/forms/{id}
Update a form (title, fields, settings). scope forms:write
POST
/forms/{id}/publish · /duplicate · /open · /close
Publish, duplicate, or open/close a form. scope forms:write
POST
/submissions/{id}/approve · /reject · /note · /reminder
Approve or reject, add an internal note, or send a payment reminder. scope submissions:write
DELETE
/submissions/{id}
Delete a submission incl. uploaded files (logged for GDPR). scope submissions:write

Example: fetching submissions

curl "https://app.formuliermet.nl/api/v1/forms/FORM_ID/submissions?limit=2" \
  -H "Authorization: Bearer fmb_je_sleutel_hier"

Response

{
  "data": [
    {
      "id": "ckv8s2...",
      "formId": "ckv7a1...",
      "sequenceNumber": 42,
      "status": "paid",
      "amountCents": 2500,
      "email": "deelnemer@example.com",
      "paymentMethod": "ideal",
      "createdAt": "2026-06-01T14:30:00.000Z",
      "updatedAt": null,
      "data": { "naam": "Jan Jansen", "aantal": 2 }
    }
  ],
  "page": 1,
  "limit": 2,
  "total": 42
}

Webhooks & real-time events

Prefer to have the data come to you? Set up webhooks per form: we POST a JSON message to your HTTPS URL whenever something happens — or to a connector like Zapier or Make. A notification for your team is also possible, straight to Slack or Microsoft Teams.

Events to listen for

EVENT
submission.created · submission.paid
New submission received and payment completed.
EVENT
submission.approved
Submission approved in a review workflow.
EVENT
ticket.checked_in · waitlist.joined
Ticket checked in at the door, or a waitlist signup.
EVENT
subscription.started · subscription.cancelled
Recurring payment started or cancelled.
EVENT
form.published
A new version of your form has been published.

Every message is signed with HMAC-SHA256; if a delivery fails we retry automatically (backing off up to several hours) and you can see a delivery log per form. The exact payloads, all headers, and ready-to-use verification code (Node.js & Python) are in the interactive documentation.

→ Interactive API documentation  ·  OpenAPI spec (JSON)

Errors & limits

400
Invalid request — a field in the body is missing or incorrect.
401
Key is missing, invalid, or revoked.
403
Your package doesn't include API access (upgrade via pricing), or your key is missing the required write scope for this action.
404
Not found, or the form/submission doesn't belong to your account.
409
Conflict — for example a chosen custom URL that's already in use.
429
Too many requests. A generous limit applies per key, per hour.

Every key sees only the data of its own account. We never expose your form settings or payment connections via the API — only the field definitions and the submissions.

Prefer a ready-made integration?

Use webhooks, or embed your form in your own website — no code required.