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". Approvers review and approve the document (no signature) via theapproval_*field types beloworder(optional) - Signing order for sequential workflows
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-requestsExample curl (create request from template):
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)
Create a signing request from a document
Instead of using a template, you can create a signing request by uploading a PDF or DOCX document directly. Choose the method based on your file size:- Small files (under 5MB)
- Large files (up to 50MB)
For documents under 5MB, include the base64-encoded file directly in the request body:
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 fieldapproval_signature- APPROVED stamp (Approver only)approval_checkmark- Approval checkmark (Approver only)approval_date- Approval date (Approver only)
The
approval_* field types can only be assigned to a recipient whose designation is "Approver" (assigning one to a Signer returns a 400). Their value is authored server-side when the approver completes their review, so you don’t submit a value for them, and the approval stamp is rendered onto the completion certificate.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
Best practices:
- 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.
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: Ensure recipients have sequential
ordervalues (1, 2, 3…) for sequential signing workflows - 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