Sending a signing request
This guide covers creating a signing request, attaching a template or document, and inviting recipients to sign.Create vs. create-and-send
Firma exposes two ways to start a signing request, and picking the wrong one is the most common integration mistake:
Use
create when your workflow needs a review or editing step before anything reaches a recipient. Use create-and-send when you want the request live and recipients notified in a single call.
The send_signing_email flag
This flag lives in settings.send_signing_email, but it means something different depending on which endpoint you call:
The allow_presigning_download flag
Controls whether recipients can download the unsigned document before completing their part of the signing flow. It behaves the same on both endpoints:
- If you set it explicitly in
settings, that value is stored on the signing request. - If you omit it, it resolves at view/download time through an inheritance chain: signing request → workspace → company setting, defaulting to disallowed if none of those are set.
- When creating from a template and omitting it, the request inherits the template’s own
allow_presigning_downloadvalue.
The public OpenAPI schema for
create-and-send doesn’t currently list allow_presigning_download under its settings object, but the endpoint accepts and applies it identically to POST /signing-requests.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)
Recipients require
first_name and last_name as separate fields - there is no single name field.first_name(required) - Recipient’s first namelast_name(optional) - Recipient’s last name (required only when creating viaPOST /signing-requestswith a raw document)email(required) - Email address (createwarns on invalid format;create-and-sendand/sendreject it)designation(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)initial- Initials field (also acceptsinitialsas an alias)approval_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 and email - last_name is optional) and that any prefilled fields have the corresponding recipient data present.Embedding the signing view
To embed the signing experience in your own app, fetch the recipient’sid from GET /signing-requests/{id}/users and build the signing URL:
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
- Prefill fields with recipient or static data before you send
- Set up webhooks to receive real-time event notifications
- 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