דלג לתוכן מרכזי

Developer docs · Reference

Send a filled-in document for signature by API

One API call sends one document to one person for signature, already filled in with the values you send: a deal closes in your CRM, and the package and the price that were agreed appear on the contract the client opens. The client cannot change them; they read, sign, ask for changes or decline.

Call POST https://formy.co.il/api/external/forms/{form}/signing-requests with a token that has forms-write, on a form that has a סבב חתימות. It works on every plan, and the document counts against your signed-document quota exactly as one sent from the product does. To build a personal link that the client fills in themselves, use a prefill URL instead.

Route
POST /external/forms/{form}/signing-requests
Ability
forms-write
Body
expected_form_revision, email, data
Answers
201 once the invitation is sent
Quota
One signed document, as from the product
Plans
Every plan, Free included
By , CTO of FormyPublished Updated

Written with AI assistance and checked against the product on . Approved for publication by Tomer Gal, CTO of Formy. How we write and approve content (Hebrew)

Before you call it

  1. In the form editor, turn on הפעלת סבב חתימות and add the steps with הוספת שלב.
  2. 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 email into that field, so the invitation goes there and nowhere else.
  3. A step with כתובת קבועה still goes to its own address. That is how you add your own countersignature after the client's.
  4. Save the form. Read its current definition_revision from GET /open/forms/{form}; you send it as expected_form_revision.
  5. 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
    }
  }'
Request body
FieldRequiredWhat it is
expected_form_revisionYesThe definition_revision of the form you reviewed. Without it the call answers 428; if the form changed since, 412.
emailYesWho to send the document to. A valid address, up to 255 characters.
dataNoThe 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. ניתן להעתיק מזהה שדה מלוח הגדרות השדה בעורך הטופס."]
  }
}
422 for a mistyped key: "These keys do not name a field on this form: 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\""
}
201 Created, with the same value in the ETag header.

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

What limits a signing request
LimitWhat happens
Signed-document quotaEach 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".
InvitationsAt 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 limit60 requests a minute across the automation endpoints.
One recipientOne 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

Signing request errors
StatusWhen
401No valid token.
403The token lacks forms-write, its owner cannot edit the form, or the signed-document quota is used up (plan_limit).
404No 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.
412The form changed after the revision you sent. Nothing was sent. Review the form, then retry with its new revision.
422An 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.
428expected_form_revision is missing.
429Rate limited.
{
  "message": "יש לטעון את הטופס ולשלוח את הגרסה שלו ב־expected_revision או את ה־ETag בכותרת If-Match.",
  "code": "form_revision_required"
}
428 without expected_form_revision ("Load the form and send its version").
{
  "message": "הטופס השתנה במקום אחר. השינויים שלכם לא נשמרו. שמרו את הטיוטה ובדקו את הגרסה העדכנית לפני החלת השינויים.",
  "code": "form_revision_conflict",
  "definition_revision": 3,
  "etag": "\"form-1-v3\""
}
412 when the form changed: the body carries the current revision.

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.

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