API reference
Read your forms, responses, the people who didn't finish and the funnel; add named guests; subscribe to webhooks. Part of Pro and Agency. The same numbers as your dashboard, each with its definition.
The basics
- Base address:
https://wunderly.so/api/v1. The version is in the path; a change that breaks anything gets a new one. - Make a key under Integrations and send it as
Authorization: Bearer wk_…. A revoked key stops working on its next request. - 60 requests a minute per key. Past that you get
429withRetry-Afterin seconds. - Errors are
{"error": {"code": "…", "message": "…"}}with401(no key, or a bad one),403(the plan doesn't include the API),404,400or422. - Times are ISO 8601 in UTC. Periods are your workspace's local days:
fromis the first day,tothe day after the last, bothYYYY-MM-DD; without them, this month. - Every number is
{"value": 31, "definition": "contacted"}; the definition is on how we count. - The machine-readable version: OpenAPI 3.1.
Endpoints
GET /workspace
The workspace this key belongs to. Zapier calls this to test a connection.
Answers 200 with JSON.
GET /forms
Every form, newest first.
Answers 200 with JSON.
GET /forms/{id}
One form and its questions.
Answers 200 with JSON.
GET /forms/{id}/responses
Finished responses, newest first.
cursor: next_cursor from the previous page.limit: 1 to 100; 50 when left out.
Answers 200 with JSON.
GET /forms/{id}/unfinished
Who didn't finish and left an email, with their partial answers. The list on the leak page, for one period: on forms that show a price, the reachable people who priced and didn't get in touch; on the others, everyone who started, didn't finish and left a valid email. Newest first.
from: First local day, YYYY-MM-DD. Default: the first of this month.to: The day after the last, YYYY-MM-DD (exclusive). Default: the first of next month.
Answers 200 with JSON.
GET /forms/{id}/funnel
The form's funnel for a period. Computed by the same code as the dashboard. Each number names its definition; how we count has them all.
from: First local day, YYYY-MM-DD. Default: the first of this month.to: The day after the last, YYYY-MM-DD (exclusive). Default: the first of next month.
Answers 200 with JSON.
GET /forms/{id}/invitees
Named guests and their personal links.
Answers 200 with JSON.
POST /forms/{id}/invitees
Add a named guest. RSVP and signup forms only. A name, an email, or both.
Answers 201 with JSON.
POST /hooks
Subscribe a URL to one event (Zapier's REST hooks).
Answers 201 with JSON.
DELETE /hooks/{id}
Remove a subscription.
Answers 204, no body.
An example
curl -G https://wunderly.so/api/v1/forms/frm_deckquote/funnel \
-d from=2026-09-01 -d to=2026-10-01 \
-H "Authorization: Bearer $WUNDERLY_API_KEY"Webhooks are on the integrations guide, with the signature check and every event.