Before you call it
- In the form editor, turn on הפעלת סבב חתימות and add the steps with הוספת שלב.
- For the step that should reach the person you name in the request, set מי הנמען to לפי תשובה בטופס and choose an email field as its שדה המייל. Formy writes the request's
emailinto that field, so the invitation goes there and nowhere else. - A step with כתובת קבועה still goes to its own address. That is how you add your own countersignature after the client's.
- Save the form. Read its current
definition_revisionfromGET /open/forms/{form}; you send it asexpected_form_revision. - Create a token with
forms-write, as a member who can edit the form. Find the field IDs under אוטומציה ו-API on the form's אינטגרציות tab: its שליחת מסמך ממולא לחתימה section prints a ready request with your own field IDs.
The request
curl -X POST https://formy.co.il/api/external/forms/service-agreement/signing-requests \
-H "Authorization: Bearer $FORMY_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"expected_form_revision": 2,
"email": "client@example.com",
"data": {
"8a1d4e2b-5c3f-4a6e-b7d8-9e0f1a2b3c4d": "Package 2",
"c4b3a2d1-6e5f-4d7c-8b9a-0f1e2d3c4b5a": 13000
}
}'| Field | Required | What it is |
|---|---|---|
expected_form_revision | Yes | The definition_revision of the form you reviewed. Without it the call answers 428; if the form changed since, 412. |
email | Yes | Who to send the document to. A valid address, up to 255 characters. |
data | No | The answers the document opens with, keyed by field ID, up to 200 of them. Values are JSON: a string, number or boolean, an array of option texts for multiple choice, and an array of flat objects for a repeating group. A matrix answer (an object) is refused. Text formats follow prefill. |
{form} is the form's ID or slug. Any other field in the body is ignored; a recipient name, for example, is not used.
Keys and values are checked, not dropped
A key that names no field on the form is refused with 422, and so is a value Formy cannot put on the document (an object sent to a text field, say). Silently dropping either would send a contract with an empty price, discovered only when it comes back signed.
{
"message": "המפתחות הבאים אינם מזהים שדה בטופס הזה: pakcage. ניתן להעתיק מזהה שדה מלוח הגדרות השדה בעורך הטופס.",
"errors": {
"data": ["המפתחות הבאים אינם מזהים שדה בטופס הזה: pakcage. ניתן להעתיק מזהה שדה מלוח הגדרות השדה בעורך הטופס."]
}
}What a caller cannot set
- Who signs. A value you send for the email field a step reads its recipient from is overwritten with
email, so a request cannot redirect someone else's document. - A phone number. Any field a step reads a phone number from is cleared, because this endpoint takes none, so that signer is invited by email.
- The verification code. Whether a step asks for a one-time code is the form's setting; the request cannot switch it.
The response
{
"id": 2,
"status": "in_progress",
"form_slug": "service-agreement",
"email": "client@example.com",
"data": {
"8a1d4e2b-5c3f-4a6e-b7d8-9e0f1a2b3c4d": "Package 2",
"c4b3a2d1-6e5f-4d7c-8b9a-0f1e2d3c4b5a": 13000
},
"form_id": 1,
"form_revision": 2,
"submission_revision": 2,
"etag": "\"submission-1-2-v2\""
}id is the response Formy created, status its signing status (in_progress until the round ends), and data the values as stored. Formy sends the invitation before it answers: a 201 means the first signer was emailed. If the invitation cannot be sent, nothing is created and the call fails. There is no state in which a document counts as sent while nobody was asked to sign it.
From there the round runs as any other: the signer gets reminders every 72 hours, up to three, and the link expires after the step's expiry, 14 days by default. When the document is signed, both the response and its signed PDF are in Formy. Neither the request nor the signatures that follow trigger the form's webhooks or other integrations, so follow the document's status in the form's responses.
Quotas and limits
| Limit | What happens |
|---|---|
| Signed-document quota | Each document counts once, however many people sign it: 5 a calendar month on Free, more on paid plans. Over the quota the call answers 403 with "type": "plan_limit" and "code": "signed_submissions". |
| Invitations | At most 200 signing invitations an hour per workspace, shared with bulk send. Over it the call fails and nothing is created; try again later. |
| Rate limit | 60 requests a minute across the automation endpoints. |
| One recipient | One request, one document, one email address. For a list, use bulk send in the product (Lite and above). |
The plans and their prices are on the pricing page.
Errors
| Status | When |
|---|---|
401 | No valid token. |
403 | The token lacks forms-write, its owner cannot edit the form, or the signed-document quota is used up (plan_limit). |
404 | No such form, or it is in a workspace the token's owner is not in. Ownership is checked before the body, so a stranger learns nothing about the form's fields. |
412 | The form changed after the revision you sent. Nothing was sent. Review the form, then retry with its new revision. |
422 | An unknown key or an unusable value in data; an invalid email; a form with no signing round; or a form declared as a will, which Formy does not let anyone sign. |
428 | expected_form_revision is missing. |
429 | Rate limited. |
{
"message": "יש לטעון את הטופס ולשלוח את הגרסה שלו ב־expected_revision או את ה־ETag בכותרת If-Match.",
"code": "form_revision_required"
}{
"message": "הטופס השתנה במקום אחר. השינויים שלכם לא נשמרו. שמרו את הטיוטה ובדקו את הגרסה העדכנית לפני החלת השינויים.",
"code": "form_revision_conflict",
"definition_revision": 3,
"etag": "\"form-1-v3\""
}What it does not do
- It does not issue a certified or qualified electronic signature. Formy is not a certification authority; the signed PDF carries an electronic signature with an evidence trail. See digital signature.
- It does not verify who the signer is. An optional one-time code proves access to a mailbox, not identity.
- It takes no phone number, so a request cannot route a signer to SMS.
- It does not report back by webhook when the document is signed.
- It does not create the form: build the form and its signing round in the editor first.
Questions developers ask
Is there an API for digital signatures in Hebrew documents?
Yes. A Formy form can be in Hebrew (right to left) or English, and a signing request sends it, already filled in, to one person for signature. Build the form and its signing round in the editor, then call POST /api/external/forms/{form}/signing-requests with a token that has forms-write.
How is this different from a prefilled link?
A prefilled link puts the values in the URL, where the recipient can read and, unless the field is locked, change them, and anyone with the link can open it. A signing request stores the values on the document before anyone opens it, sends a personal signing link by email, and the signer cannot change the values.
Does each API request count as a signed document on Free?
Yes, once, however many people sign it, exactly as a document sent from the product. Free includes 5 signed documents a calendar month.
Can the API send the same form to many recipients?
One request sends one document to one address, so a list means one request per recipient, within the hourly invitation limit. Bulk send in the product sends to a list from a CSV, on Lite and above.
Related
- Prefill and field IDs: Field IDs and the value format for each field type.
- Send for signature: Signing rounds in the product, for the people who use them.
- Automation endpoints: Call it from a Make scenario.
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