Sending a signing request
This guide covers creating a signing request, attaching a template or document, and inviting recipients to sign.Steps
- Create or select a template
- Create a signing request referencing the template
- Add recipients with required information (first name, last name, email)
- Optionally add form fields with percentage-based positioning
- Send the request via email or embed the signing view
Recipient Schema (Required Fields)
Each recipient must include:first_name(required) - Recipient’s first namelast_name(required) - Recipient’s last nameemail(required) - Valid email addressdesignation(required) - Role:"Signer","CC", or"Approver"(currently only"Signer"is fully supported)order(optional) - Signing order whenuse_signing_orderis enabled
phone_number,street_address,city,state_province,postal_code,country,title,companycustom_fields- Object with custom key-value pairs
Create a signing request from a template (API)
Endpoint: POST /signing-requests
Rate limits:
- Signing request operations: 100 requests per minute per API key
Document resource including id (the signing_request_id) and document_url where appropriate.
Create a signing request (server example) — Node (fetch)
Create a signing request (server example) — Python (requests)
Adding form fields (percentage-based positioning)
When creating a signing request directly (POST/signing-requests) or updating one, you can add form fields:
Field positioning example
Field types
signature- Signature fieldtext- Single-line text inputdate- Date pickercheckbox- Checkboxdropdown- Dropdown selector (requiresdropdown_options)initials- Initials fieldimage- Image field
Positioning guidelines
The coordinate system uses percentages for responsive scaling:x: 0 (left edge) to 100 (right edge)y: 0 (top edge) to 100 (bottom edge)width: percentage of page width (e.g., 30 = 30% width)height: percentage of page height (e.g., 8 = 8% height)
Updating signing requests
Before a signing request is sent, you can update its details using the API. The API provides two methods:Comprehensive update (PUT)
Usecomprehensive-update-signing-request for complex updates involving multiple sections.
When to use:
- Updating multiple recipients at once
- Deleting recipients (with field reassignment/deletion)
- Updating fields and reminders together
- Making coordinated changes across multiple sections
signing_request_properties- Update name, description, document, expiration, settingsrecipients- Upsert recipients (include id to update, omit to create)deleted_recipients- Delete recipients withfield_action(delete or reassign fields)fields- Upsert fields (include id to update, omit to create)reminders- Upsert reminders (include id to update, omit to create)
- ✅ Can update multiple sections in one request
- ✅ Supports recipient deletion with field handling
- ✅ Only works before the request is sent
Partial update (PATCH)
Usepartially-update-signing-request when updating specific properties or a single recipient.
When to use:
- Updating name, description, or settings
- Adding or updating one recipient at a time
- Making targeted changes without affecting other data
- Update properties only (name, description, document, expiration_hours, settings)
- OR update/create a single recipient
- ✅ Only send the fields you want to change
- ✅ More efficient for small changes
- ✅ Other fields remain unchanged
- ✅ Safer for concurrent edits
Choosing between PUT and PATCH
| Scenario | Use | Reason |
|---|---|---|
| Complete signing request rebuild | PUT | Full replacement with all sections (properties, recipients, fields, reminders) |
| Update name or settings only | PATCH | More efficient, preserves recipients and fields |
| Add/update one recipient | PATCH | Single recipient mode, other recipients unchanged |
| Update multiple recipients | PUT | Can upsert multiple recipients in one request |
| Delete recipients with field reassignment | PUT | Supports deleted_recipients with field_action |
| Change document and all fields | PUT | Major structural changes |
| Update custom fields | PATCH | Preserves core signing request |
| Replace all recipients | PUT | Clean slate approach |
Rate limiting
Both endpoints share the same rate limit:- 100 requests/minute per API key
- Update signing requests before calling
/send - Validate recipient data before updating
- Use PATCH for incremental changes
- Implement retry logic with exponential backoff
Sending (email invites)
Once you have a signing request ID (and have made any necessary updates), call POST/signing-requests/{signing_request_id}/send to send emails to all recipients.
Rate limit: Sending signing requests supports 60 requests per minute per API key.
Example
The
/send endpoint validates that all recipients have required information (first_name, last_name, email) and that any fields with variable_name have corresponding data in recipient records.Embedding the signing view
The public signing UI is available at the pattern:https://app.firma.dev/signing/{signing_request_user_id}
Notes:
- The
signing_request_user_idis typically returned as part of therecipientsobject or as a per-recipient token; check the response from GET /signing-requests/id for recipient-level signing links or tokens. - If the API returns a direct
document_urlorembed_url, use that. If not, generate an ephemeral signing link server-side and return it to the frontend.
Example — fetch signing details and render iframe
Edge cases & tips
- Signing order: If
use_signing_orderis true in document settings, ensure recipients have sequentialordervalues (1, 2, 3…) - Audit trail: Download the audit trail via GET
/signing-requests/{id}/trackingto see all user actions - Download completed PDF: Use GET
/signing-requests/{id}/downloadafter completion - Webhooks: Subscribe to events like
signing_request.completedinstead of polling (see Webhooks guide)
Next steps
- Set up webhooks to receive real-time event notifications (60 req/min)
- Add automated reminders for pending recipients
- Embed the template editor with JWT authentication (120 req/min)
- Configure workspace settings for custom email templates (100-200 req/min)
- Embeddable template editor with JWT authentication for secure embedded workflows