Skip to content

Read API

The read API gives you programmatic, read-only access to your forms and submissions. Use it to build your own dashboards, sync leads into other systems, or archive data.

Create an API key in the dashboard (Settings → API keys) and send it as a Bearer token:

Authorization: Bearer fw_key_…

Keys are read-only by design: any request other than GET is rejected, so a leaked key can never modify or delete data. Keys are revocable and each key’s last use is visible in the dashboard.

Base URL: https://api.formwire.io

EndpointReturns
GET /v1/formsAll your forms
GET /v1/forms/:idOne form
GET /v1/forms/:id/submissionsSubmissions for a form (see filters below)
GET /v1/statsSubmission counts over time
GET /v1/usageCurrent-period usage against your plan
GET /v1/forms/:id/submissions?limit=50&offset=0&since=2026-07-01&until=2026-07-08&spam=false
Query paramDefaultNotes
limitserver defaultPage size
offset0Skip N rows
since / untilISO dates; bound the created-at range
spamfalsetrue returns the spam tab instead

Response:

{
"submissions": [
{
"id": "sub_…",
"accessKeyId": "a1b2c3…",
"createdAt": "2026-07-08T09:14:02.000Z",
"isSpam": false,
"data": { "name": "Jamie Rivera", "email": "[email protected]", "message": "…" }
}
],
"pagination": { "limit": 50, "offset": 0, "total": 132 }
}

Results are ordered newest-first and bounded by your plan’s retention window (30 days free, 1 year Pro) — rows older than retention are never returned.

const res = await fetch(
"https://api.formwire.io/v1/forms/YOUR-FORM-ID/submissions?limit=100",
{ headers: { Authorization: `Bearer ${process.env.FORMWIRE_API_KEY}` } }
);
const { submissions, pagination } = await res.json();

A 401 {"error": "invalid api key"} means the key was revoked or mistyped.