The API
Everything the web app shows is available over HTTPS, under the same permissions as the person signing in. Use it to pull records into your own systems on a schedule, or to write records in from another tool.
Settings → API shows your base URL and the key you need, with copyable examples.

Signing in
Requests carry a Bearer token belonging to a member of your organisation. Get one by signing in with an email and password:
curl -X POST "$BASE_URL/auth/v1/token?grant_type=password" \
-H "apikey: $PUBLIC_KEY" \
-H "Content-Type: application/json" \
-d '{"email":"integrations@example.com","password":"…"}'The response includes access_token. Send it as
Authorization: Bearer <access_token> and apikey: $PUBLIC_KEY on every
request. Tokens expire after an hour; the response also includes a
refresh_token to get a new one without the password.
Create a dedicated member for integrations — integrations@yourcompany — with a View grant on the forms it reads and nothing more. Its token then cannot do anything the integration should not, and revoking it is deactivating one member.
Reading
The API is a REST interface over the same tables the app uses. Filters go in the query string.
Forms
curl "$BASE_URL/rest/v1/forms?select=id,name,status&order=name" \
-H "apikey: $PUBLIC_KEY" -H "Authorization: Bearer $TOKEN"A form’s fields — the keys you will see as column names:
curl "$BASE_URL/rest/v1/form_fields?form_id=eq.$FORM_ID&select=key,label,field_type&order=sort_order" \
-H "apikey: $PUBLIC_KEY" -H "Authorization: Bearer $TOKEN"Records — everything on one form changed since a point in time, which is the shape a scheduled pull needs:
curl "$BASE_URL/rest/v1/submissions?form_id=eq.$FORM_ID&updated_at=gt.2026-09-01T00:00:00Z&order=updated_at&select=id,status,submitted_at,updated_at,data" \
-H "apikey: $PUBLIC_KEY" -H "Authorization: Bearer $TOKEN"Each record’s data is an object keyed by field key. Repeatable sections are
arrays inside it. Deleted records do not appear.
Useful filters: status=eq.approved, submitted_at=gte.<date>,
limit=500&offset=0 for paging. Any column can be filtered with eq, neq,
gt, gte, lt, lte, in.
Writing
Records can be created and updated by POST and PATCH to /rest/v1/submissions,
under the same rules as the app: the token’s member must be able to collect on
the form, and cannot set a record approved. The examples on Settings → API
show the exact body.
Exporting
The export the web app offers is also a call, returning a file:
curl -X POST "$BASE_URL/functions/v1/export-data" \
-H "apikey: $PUBLIC_KEY" -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"form_id":"'$FORM_ID'","format":"csv"}'Limits and manners
- Page with
limitandoffset; pull byupdated_atrather than everything every time. - A token is a person’s session. Keep it out of source control and out of logs.
- If you need something the API does not expose, write to customer.service@firedragontech.com. We will help you get the data you need.