The endpoints
| Route | Ability | Returns |
|---|---|---|
GET /external/validate | any token | {name, email} of the token's owner |
GET /external/workspaces | workspaces-read | Your workspaces |
GET /external/forms?workspace_id= | forms-read | One workspace's forms |
GET /external/forms/{form}/fields | forms-read | A form's answerable fields |
POST /external/make/webhook | manage-integrations | Subscribes a hook URL to a form |
DELETE /external/make/webhook | manage-integrations | Unsubscribes it |
GET /external/make/submissions/recent?form_id= | manage-integrations | One sample delivery |
POST /external/forms/{form}/signing-requests | forms-write | See Signing requests |
Every list returns plain JSON arrays, not paginated: each list holds a whole workspace. Items carry both {id, name} and {value, label}, so a platform's dropdown can read them without remapping.
Validate a token
GET /external/validate needs no ability: it answers whether the token is real, which is what a connection test asks. A token that connects but lacks an ability fails later, on the route that needs it, with 403.
curl https://formy.co.il/api/external/validate \
-H "Authorization: Bearer $FORMY_TOKEN" -H "Accept: application/json"{ "name": "Dana Cohen", "email": "dana@example.com" }Workspaces, forms and fields
curl https://formy.co.il/api/external/workspaces -H "Authorization: Bearer $FORMY_TOKEN" -H "Accept: application/json"
curl "https://formy.co.il/api/external/forms?workspace_id=1" -H "Authorization: Bearer $FORMY_TOKEN" -H "Accept: application/json"[
{ "id": 1, "name": "Acme Ltd", "label": "Acme Ltd", "value": 1 }
][
{
"id": 1,
"name": "Service agreement",
"label": "Service agreement (service-agreement)",
"value": 1,
"slug": "service-agreement",
"visibility": "public"
}
]GET /external/forms/{form}/fields lists the fields a response can hold, so a mapping screen can show "Full name" instead of a field ID before the form was ever filled in. Layout blocks, such as headings, text and page breaks, are left out because they never hold an answer. {form} is the form's ID or slug.
[
{
"value": "3f6c2a1e-8b4d-4c2f-9a71-1d2e3f4a5b6c",
"label": "Full name",
"id": "3f6c2a1e-8b4d-4c2f-9a71-1d2e3f4a5b6c",
"name": "Full name",
"type": "text",
"required": true,
"hidden": false
},
{
"value": "8a1d4e2b-5c3f-4a6e-b7d8-9e0f1a2b3c4d",
"label": "Package",
"id": "8a1d4e2b-5c3f-4a6e-b7d8-9e0f1a2b3c4d",
"name": "Package",
"type": "select",
"required": false,
"hidden": false
}
]required and hidden matter for mapping: an optional or hidden field is often absent from a delivery, so a scenario that depends on it needs a fallback.
Subscribe a Make webhook
A Make instant trigger registers its own webhook when its scenario is switched on and removes it when the scenario is switched off. These three routes do that:
curl -X POST https://formy.co.il/api/external/make/webhook \
-H "Authorization: Bearer $FORMY_TOKEN" -H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"form_id": 1, "hookUrl": "https://hook.eu1.make.com/abc123"}'{ "id": 2, "form_id": 1, "form_title": "Service agreement", "hook_url": "https://hook.eu1.make.com/abc123" }id is the integration Formy created on the form.form_idis the form's numeric ID, andhookUrlmust be a publichttps://URL. An optionalscenario_urlis stored so that the integration card in Formy can link to the scenario.- The subscription is an ordinary Make integration on the form: it appears on the form's אינטגרציות tab, can be paused there, and records its history under אירועים קודמים.
- Attaching the same
hookUrlagain updates the existing integration, and switches it back on if it was paused, instead of adding a second one, so a retried attach never doubles deliveries. DELETE /external/make/webhookwith the same body removes only Make integrations with that URL, never a webhook someone added by hand to the same address. It answers{"removed": 1}with the number removed; removing something already gone is not an error.

GET /external/make/submissions/recent?form_id=1 returns a list with one delivery in exactly the shape the trigger sends: built from the form's latest response, or from generated placeholder answers if it has none. It is cached for five minutes. Note that it shows a real respondent's latest answers to whoever holds the token.
What Make deliveries contain
A Make delivery is the webhook payload without the deprecated submission and message keys: form_id, form_title, form_slug, submission_id, data keyed by field ID, and attribution, edit_link or pdf_url when they apply. Unlike a webhook, it is not signed and is attempted once, with a 10-second timeout. The same is true of the n8n, Activepieces, Pabbly and Albato cards.
The Formy app for Make
Formy's own Make app, with a trigger, a field picker and a signing-request action, is not in Make's public app directory. Nothing on this page depends on it: Make's built-in Custom webhook module receives Formy deliveries, and Make's HTTP module can call every endpoint here with a token in the Authorization header.
Zapier
There is no Formy app in Zapier, and the Zapier card in the product is switched off on formy.co.il. To use Zapier, start a Zap with Webhooks by Zapier's Catch Hook and paste its URL into a התראת Webhook; the Zapier guide walks through it.
The routes under /external/zapier/... are older copies of the endpoints above, kept so that existing connections keep working. Use the provider-neutral routes in new work.
Errors
| Status | Meaning |
|---|---|
401 | The token is missing, wrong or deleted. |
403 | The token lacks the ability the route needs. The message is Invalid ability provided. |
404 | The form does not exist, or it is in a workspace the token's owner is not in. Formy answers 404 rather than 403 so that a token cannot probe other workspaces' form IDs. |
422 | A required parameter is missing, such as workspace_id, or hookUrl is not a public HTTPS URL. The message is in Hebrew. |
429 | More than 60 requests in a minute. Wait for Retry-After. |
Questions developers ask
Do I need a Formy app in Make to connect a form?
No. Use Make's Custom webhook module: copy its URL into the Make card on the form's integrations tab and submit a test response. The automation endpoints are only needed when a scenario should list forms and fields or register its own webhook.
Which token abilities does a Make scenario need?
workspaces-read for the workspace list, forms-read for forms and fields, manage-integrations to subscribe a webhook or read a sample, and forms-write only if it sends documents for signature. Give it a token of its own.
Can n8n or Activepieces use these endpoints?
Yes. They are plain HTTPS and JSON, so any HTTP node can call them with a token. To receive responses, give the platform's webhook trigger URL to a Formy webhook, which adds signing and retries.
Why does the form list return 404 for a form I can see in Formy?
The token belongs to someone else, or to a person who is not a member of that form's workspace. A token acts as the person who created it, in that person's workspaces only.
Related
- Webhooks: Signed deliveries with retries, for any platform.
- Signing requests: Send a filled-in document for signature from a scenario.
- Zapier, Make and n8n: Which automation tool fits, without code.
Every page of the docs is listed in Formy developer docs .
Try it on a free account
Every plan includes the API, webhooks, the embed SDK and the MCP server, Free included.
Create a free account