Wunderly

Docs

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 429 with Retry-After in seconds.
  • Errors are {"error": {"code": "…", "message": "…"}} with 401 (no key, or a bad one), 403 (the plan doesn't include the API), 404, 400 or 422.
  • Times are ISO 8601 in UTC. Periods are your workspace's local days: from is the first day, to the day after the last, both YYYY-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.