Getting started & account
Where do I find my live/test API keys, and can I get them via API?
Where do I find my live/test API keys, and can I get them via API?
Is there a free trial or sandbox? What does test mode cost?
Is there a free trial or sandbox? What does test mode cost?
Do I need to sign a contract or book a demo before using Firma.dev?
Do I need to sign a contract or book a demo before using Firma.dev?
What is the difference between the Owner, Admin, and View Only roles?
What is the difference between the Owner, Admin, and View Only roles?
- Owner: the only role that can manage billing, create, delete, or rename workspaces, and generate or regenerate API keys.
- Owner and Admin: can both manage webhooks, custom domains, and workspace or company settings, invite or remove users (though an Admin can’t create or promote another Owner), and create signing requests.
- View Only: can only read and copy existing data.
Why didn't a new team member receive an invitation email?
Why didn't a new team member receive an invitation email?
How do I change my account email, or merge/delete an account?
How do I change my account email, or merge/delete an account?
Why is my password reset link expired, or the email missing?
Why is my password reset link expired, or the email missing?
How does integration with Firma.dev work?
How does integration with Firma.dev work?
What can I do with the Firma.dev API?
What can I do with the Firma.dev API?
Pricing & billing
What does one credit cover, and when is it charged or refunded?
What does one credit cover, and when is it charged or refunded?
How much does Firma.dev cost, and are there subscriptions or minimums?
How much does Firma.dev cost, and are there subscriptions or minimums?
Where do I download invoices, and how do I add my company name and VAT number?
Where do I download invoices, and how do I add my company name and VAT number?
Why does adding credits fail with a Paddle.js error?
Why does adding credits fail with a Paddle.js error?
How do I handle high volume, and is there auto-recharge?
How do I handle high volume, and is there auto-recharge?
Sending signing requests
Why weren't any emails sent after I created a signing request via the API?
Why weren't any emails sent after I created a signing request via the API?
POST /signing-requests only creates a draft. It never sends an email on its own, regardless of your settings.See: Sending a signing request: Create vs. create-and-sendCan I send signing links through my own email system instead of Firma.dev's?
Can I send signing links through my own email system instead of Firma.dev's?
settings.send_signing_email: false: suppresses Firma.dev’s notification email while the request still sends, and it works whether you call/sendorcreate-and-send.settings.send_finish_email: false: turns off the completion email the same way.reminders: array you provide on create that controls reminder emails, with document-based requests getting none by default and template-based requests inheriting the template’s reminders unless you override it.
What's the correct API base URL, and why do documented paths 404?
What's the correct API base URL, and why do documented paths 404?
.../signing-requests. 404s often come from two sources:https://api.firma.dev/api/v1: a second, “Planned” server listed in the public OpenAPI spec for a future API shape, not a real endpoint, so a generated client pointed at it 404s on every call.POST /signing-requests: the actual endpoint behind the “Create Signing Request” reference page, not a/create-signing-requestroute as the title might suggest.
What does a valid create-signing-request payload look like (recipients, fields, positions)?
What does a valid create-signing-request payload look like (recipients, fields, positions)?
recipients list and a fields list; each field points at a recipient and a position on the page.Each recipient needs first_name, email, and designation (Signer, Approver, or CC). last_name and order are optional.Each field needs:type: one of the supported field types, which also includeradio_buttons,text_area,url,file, andstamp.page_number: the page the field appears on.position:x,y,width,heightas percentages of the page, not pixels.recipient_id: the recipient the field belongs to.
id starting with temp_ (for example temp_alice) and set recipient_id on the field to the same value. The API maps it to a real UUID and never returns temp IDs.There’s no top-level metadata property. Use each recipient’s custom_fields object instead.See: Sending a signing request: Recipient Schema and Sending a signing request: Field typesWhat's the maximum document size, and how do I upload large files?
What's the maximum document size, and how do I upload large files?
POST /documents: uploads the file and returns a presignedupload_url.PUT: send the file to thatupload_url.document_id: pass this when you create the signing request.
document under about 5MB, or the request can fail with a 502. The MCP server has no upload tool, so large files go through the REST API.Does Firma.dev support DOCX, and why does DOCX conversion sometimes fail?
Does Firma.dev support DOCX, and why does DOCX conversion sometimes fail?
POST /signing-requests: accepts a DOCX file when you create a signing request directly.POST /documents: accepts a DOCX file when you upload a document separately.
Why do I get duplicate signing requests, and is there an idempotency key?
Why do I get duplicate signing requests, and is there an idempotency key?
create, create-and-send, send, resend) have no Idempotency-Key header.An auto-retried create or create-and-send call can create a duplicate, separately billed, legally binding signing request. Calling /send again on an already-sent request returns an error instead of duplicating.To avoid duplicates, store the id returned by the first call and check for it, or query existing requests, before retrying.See: n8n integration: Other common operationsCan I change a recipient's email after sending, or cancel silently?
Can I change a recipient's email after sending, or cancel silently?
POST /signing-requests/{id}/cancel: the endpoint to call to cancel a request.notify_signers: false: a parameter on that cancel call itself, not a creation-time setting, that suppresses the signer notification.send_cancellation_email: a workspace setting that must also be enabled for a cancellation email to be sent at all.
Can a signing request include multiple documents, or swap a template's document?
Can a signing request include multiple documents, or swap a template's document?
document: inline base64 content.document_id: the ID returned from aPOSTrequest to/documents.template_id: an existing template’s ID.
POST to /templates/{id}/replace-document swaps a template’s PDF while preserving all existing field placements. The replacement must have the same page count and matching page dimensions (within 1pt) as the original, so it updates content on the existing layout rather than attaching an unrelated document.How do I download the signed PDF and certificate via the API?
How do I download the signed PDF and certificate via the API?
GET /signing-requests/{id}/download returns the signed PDF as a pre-signed URL.It returns a single, short-lived pre-signed download_url, valid until the expires_at timestamp, for the final PDF. For a finished request, that one PDF already has the completion certificate and audit-trail pages appended to the signed document, and there’s no separate certificate-only download URL from this endpoint.Calling this endpoint behaves differently depending on the signing request’s state:409: returned if you call it before the request has been sent.allow_partial_download: when enabled, lets you get a partial-progress snapshot while signing is still in progress.503: returned with aRetry-Afterheader while a partial-progress snapshot is still being generated.
Can I retrieve a signer's signature image or uploaded files via the API?
Can I retrieve a signer's signature image or uploaded files via the API?
GET /signing-requests/{id}/signers/{signer_id}/signature: returns the adopted signature as adata:image/png;base64,...data URI.GET /signing-requests/{id}/signers/{signer_id}/initials: returns the adopted initials the same way.GET /signing-requests/{id}/signers/{signer_id}/stamps/{field_id}: returns a stamp image for the givenfield_id, since stamps are per-field.GET /signing-requests/{id}/signers/{signer_id}/files/{field_id}: returns a pre-signed download URL, valid for 300 seconds, for a file uploaded to afile-type field, not the file bytes directly.GET /signing-requests/{id}/fields: filter totype=fileto find thefield_idfor an uploaded file.
How do I read field values back by variable name after signing?
How do I read field values back by variable name after signing?
GET /signing-requests/{id}/fields returns every field of the request; read each entry’s value property for the resolved value and match on variable_name.See: Field Prefilling: Reading field values backTemplates / fields / anchor tags
How are field x/y/width/height interpreted?
How are field x/y/width/height interpreted?
x, y, width, and height are percentages of the page, not pixels. The origin is the top-left corner and y grows downward.A manually specified field returns a 400 error when x+width>100 or y+height>100. Fields placed by anchor tags are clamped back onto the page instead.Why isn't anchor text removed, or why does the field look offset?
Why isn't anchor text removed, or why does the field look offset?
remove_anchor_text makes the matched text invisible in the PDF’s content stream rather than deleted.It can fail on embedded/subset (CID) fonts or when the marker text is split across separate PDF text-show operators. When that happens, the system automatically draws a white box over only the matched marker area, even without add_white_background set.What does 'no glyph advances for font' mean?
What does 'no glyph advances for font' mean?
opacity below 1, or a transform, inside a transparency-group Form XObject.The extractor replays text inside form and group contexts (annotation appearance streams excluded), so anchors placed there are found.If it recurs, the anchor is likely in a malformed or unusual font/geometry construct. Re-export the source PDF with standard font encoding.How do I prefill fields, and can the signer still edit the value?
How do I prefill fields, and can the signer still edit the value?
format_rules.prefilledData on a field to auto-fill and lock it from recipient data.The signer can still edit the value if you also set format_rules.prefilledEditable to true.This works the same way on anchor-tag-placed fields, since anchor tags accept format_rules too.Why does field text shrink or get cut off, and can I set a font size?
Why does field text shrink or get cut off, and can I set a font size?
format_rules.fontSize for an explicit starting size instead. If text is still cut off, enlarge the field or switch to a textarea.How do I build single-select checkbox groups, and why do radio/checkbox values show as true/false?
How do I build single-select checkbox groups, and why do radio/checkbox values show as true/false?
multi_group_id to a set of fields to link them into a group.radio_buttons: fields sharing amulti_group_idform a mutually-exclusive group.checkbox: fields sharing amulti_group_idform an independent group.
"true".A checkbox field renders as a native checkbox input, not a custom checkmark icon.How do conditional visibility/required rules work via the API, and why weren't they applied?
How do conditional visibility/required rules work via the API, and why weren't they applied?
visibility_conditions and required_conditions are ConditionSet objects on a field that reference another field’s field_id on the same recipient.GET /templates/{id}/fields: returns both properties, even though the public OpenAPI schema omits them.
/duplicate), both condition sets are copied and their field_id references remapped.How do I add initials on every page, or multiple signature fields for one signer?
How do I add initials on every page, or multiple signature fields for one signer?
initial field per page in the fields array, each with its own page_number. A single recipient can have multiple required fields of the same type, including several signature fields.How do I auto-fill the signing date, and what timezone does it use?
How do I auto-fill the signing date, and what timezone does it use?
date field to auto-fill the signing date.The field renders read-only in the signing view and fills with the signer’s browser-local date when they finish, not a server timezone.date_signing_default: true: enables auto-fill; there’s no separatedate_signedtype.timezone: the workspace setting checked first for certificate timestamps, defaulting to UTC until you set it.default_timezone: the company-level fallback checked next, also defaulting to UTC until you set it.
Signing experience
Can I redirect the signer or customize the completion page after signing?
Can I redirect the signer or customize the completion page after signing?
completion_redirect_url: redirects the signer after they finish signing.completion_title: customizes the completion page title, set alongside the redirect URL.completion_message: customizes the completion page message, set alongside the redirect URL.signing.completed: the event to listen for instead, if you embed the signing view.
Can I disable or customize the terms acceptance step?
Can I disable or customize the terms acceptance step?
Can signers correct their name or company before signing on forwarded links?
Can signers correct their name or company before signing on forwarded links?
identity_editable_fields on the signing request or template, for example name and company, so the signer can edit their own details before signing. A correction dialog appears right after they accept the terms, and every edit is written to the audit trail.See: Signing patterns - Pattern: Dynamic second signerHow can signers sign, can I force hand-drawn signatures, and is Cyrillic supported?
How can signers sign, can I force hand-drawn signatures, and is Cyrillic supported?
hand_drawn_only to true on the signing request or template to remove the Type tab and require drawing.Firma.dev does not support signer-supplied X.509 certificates; it applies its own PAdES seal to the completed document server-side.See: Signing patternsThe signing page is blank or black. What should the signer try?
The signing page is blank or black. What should the signer try?
Can I set the initial zoom of the signing page?
Can I set the initial zoom of the signing page?
?zoom= to the signing URL.See: Embeddable signing - URL parametersWhy does a signing link say invalid, expired, or already signed?
Why does a signing link say invalid, expired, or already signed?
- Not sent yet: opening the link before the sender actually sends the request shows this message.
- Expired: the request’s
expiration_hourswindow, measured from when it was sent, has passed; because a sent request can’t be edited, the sender needs to create a new one instead of extending it. - Already signed: that specific recipient has completed their signature; it’s tied to their own unique link, so it won’t happen if a different signer opens their own link.
- Invalid: a broken or mistyped link, or one for a cancelled request, produces its own distinct error rather than “already signed.”
Can either of two signers sign, or can my own company auto-sign its side?
Can either of two signers sign, or can my own company auto-sign its side?
How do I enable QR-code signing on a phone?
How do I enable QR-code signing on a phone?
show_qr_code to true. Add the {{signing_qr_code}} placeholder to your email templates so the QR code appears.See: Workspace settings - QR code in emailsIdentity verification (OTP)
How long is an OTP code valid, and why am I not asked for it again when I reopen the signing link?
How long is an OTP code valid, and why am I not asked for it again when I reopen the signing link?
Can I set a signing request's email/OTP language, or customize the OTP email?
Can I set a signing request's email/OTP language, or customize the OTP email?
language on the signing request itself to override the workspace and company defaults for that request’s signer-facing emails, including the OTP email. Custom email templates can’t change the OTP email’s wording, but you can skip OTP entirely per request by setting settings.require_otp_verification to false.See: Localization, White-LabelingDoes Firma.dev support SMS OTP or national eID (BankID, MitID, FranceConnect)?
Does Firma.dev support SMS OTP or national eID (BankID, MitID, FranceConnect)?
Webhooks
Webhooks show enabled with zero failures, but nothing is delivered. Why?
Webhooks show enabled with zero failures, but nothing is delivered. Why?
PATCH /workspaces/{id}: setwebhook_enabledtotruein the body to enable webhooks without the dashboard.ignore_company_webhooks: make sure this isn’ttrueon the workspace; it silently opts the workspace out of company webhooks.
How do company- vs. workspace-level webhooks differ for secrets, opt-out, and the viewed event?
How do company- vs. workspace-level webhooks differ for secrets, opt-out, and the viewed event?
- Secrets: company- and workspace-level webhooks each have their own signing secret.
ignore_company_webhooks: lets a workspace opt out of its company’s webhooks entirely, without affecting other workspaces.signing_request.viewed: fires only on a recipient’s first view, not on every subsequent open.
Why do webhook deliveries fail with a redirect error?
Why do webhook deliveries fail with a redirect error?
www subdomain, the path, or a missing or extra trailing slash fails every delivery attempt.See: WebhooksWhat's the webhook retry policy, timeout, and auto-disable threshold? Can I resend past events?
What's the webhook retry policy, timeout, and auto-disable threshold? Can I resend past events?
Should I poll GET /signing-requests/{id} for status instead of using webhooks?
Should I poll GET /signing-requests/{id} for status instead of using webhooks?
GET /signing-requests/{id}: don’t poll this endpoint for status; webhooks push updates instead.
Email delivery & templates
What does the RECIPIENT_EMAIL_SUPPRESSED (422) error mean, and how do I get an address unblocked?
What does the RECIPIENT_EMAIL_SUPPRESSED (422) error mean, and how do I get an address unblocked?
RECIPIENT_EMAIL_SUPPRESSED (HTTP 422) means the recipient is on Firma.dev’s suppression list; contact support to get an address unblocked.See: Email Deliverability, Requesting removalCan I customize the sender name and email address on signing invitations?
Can I customize the sender name and email address on signing invitations?
email_local_part at the company or workspace level.See: Custom email sender addressHow do I stop the completion email, skip the certificate, or handle CC attachments?
How do I stop the completion email, skip the certificate, or handle CC attachments?
settings object:send_finish_email: false: stops the completion email.attach_pdf_on_finish: false: sends a download link instead of attaching the PDF.document_only_download_url: shares the document without the certificate, instead offinal_document_download_url.certificate_only_download_url: returns the certificate on its own.allow_download: false: disables download links entirely, as a separate control fromattach_pdf_on_finish.
What placeholders do email templates support, and can I customize them per language?
What placeholders do email templates support, and can I customize them per language?
{{placeholder}} syntax.Legacy [bracket] syntax also works and is case-insensitive; an unresolved placeholder renders as nothing, not raw text.{{team_name}}: an alias of{{workspace_name}}.{{team_email}}: an alias of{{workspace_email}}.{{download_link}}: resolves only in completion emails.
Can I control the timezone or date format shown in emails?
Can I control the timezone or date format shown in emails?
timezone: an IANA timezone set on the workspace through the settings API.default_timezone: the company-level fallback when the workspace timezone isn’t set.
{{expiration_date}} in signing emails use that timezone and the email’s language. UTC remains the default when neither is set.See: Supported timezonesWhy are signer emails in English when my workspace is set to another language?
Why are signer emails in English when my workspace is set to another language?
en unless you set language explicitly. Set it on the workspace, or pass language on the request, and new signer emails will use it.See: Email language settingsCustom sending domains
Which DNS records do I need, and what's the domain verify flow?
Which DNS records do I need, and what's the domain verify flow?
What does 'Domain conflict' or a stuck 'finalizing' status mean?
What does 'Domain conflict' or a stuck 'finalizing' status mean?
sign.yourcompany.com, which verifies independently. Removing the domain from Firma.dev releases Firma.dev’s own registration for reuse elsewhere, but has no effect on a registration in someone else’s Resend account.See: Already using Resend for your own email?Why does domain status stay pending or unverified when DNS is correct?
Why does domain status stay pending or unverified when DNS is correct?
verify-dns again; it checks live every time, so a transient hiccup can report the domain as unverified even when the DNS is correct.See: Verification states, Known display quirkWhy did my verified domain stop working and emails fall back to Firma.dev's address?
Why did my verified domain stop working and emails fall back to Firma.dev's address?
Can I use the same sending domain in more than one workspace?
Can I use the same sending domain in more than one workspace?
Legal validity / certificates / security
What signature level does Firma.dev provide, and is it legally valid under eIDAS/ESIGN?
What signature level does Firma.dev provide, and is it legally valid under eIDAS/ESIGN?
PAdES-B-LTA (Baseline Long-Term Archival), issued from Firma.dev’s own certificate authority, with an embedded RFC 3161 timestamp.See: Legal Validity & eIDAS ComplianceWhy does Adobe Acrobat or the EU DSS validator show my signature as untrusted?
Why does Adobe Acrobat or the EU DSS validator show my signature as untrusted?
Where is my data stored, and is Firma.dev SOC 2 / ISO certified?
Where is my data stored, and is Firma.dev SOC 2 / ISO certified?
How do I delete signing requests or documents, for example for a GDPR request?
How do I delete signing requests or documents, for example for a GDPR request?
In which language is the completion certificate generated, and can it show my logo?
In which language is the completion certificate generated, and can it show my logo?
Are archive timestamps renewed over time, and what happens if a signature is challenged?
Are archive timestamps renewed over time, and what happens if a signature is challenged?
PAdES-B-LTA seal once, at signing time, and never re-stamps or renews it afterward; for very long retention windows, apply your own re-timestamping when you archive the file. If a signature is challenged, signer-identity, consent, and record-keeping responsibilities are set out in Firma.dev’s Terms of Service.See: Legal Validity: What Firma.dev provides, Audit TrailCan I remove the Signing Request ID header from the signed PDF?
Can I remove the Signing Request ID header from the signed PDF?
Signing Request ID: <id> is drawn on every page of the signed PDF and completion certificate, in small gray text near the top margin; there is no workspace or API setting to turn it off.The header is drawn with an embedded font, so sealed documents pass PDF/A-2b validation.Is Firma.dev suitable for use in France: eIDAS, GDPR and HDS?
Is Firma.dev suitable for use in France: eIDAS, GDPR and HDS?
PAdES-B-LTA. For GDPR, Firma.dev acts as the data processor; a Data Processing Agreement is available on request from support@firma.dev.See: Security, Legal Validity & eIDAS ComplianceWorkspaces & multi-tenant
Should each customer get their own workspace? Is there a limit?
Should each customer get their own workspace? Is there a limit?
What is the protected/default workspace, and why do I get a 403 PROTECTED_WORKSPACE error?
What is the protected/default workspace, and why do I get a 403 PROTECTED_WORKSPACE error?
protected.It’s meant to be managed from the dashboard rather than the API; calling a management endpoint against it with a regular API key returns a 403 with code PROTECTED_WORKSPACE.For account-wide settings, use:default_timezone and language, among other fields. For anything you need to manage directly via the API, create separate, non-protected workspaces instead.See: Workspaces: Edge cases & troubleshooting, Workspace Settings: Update workspace settingsWhite-labeling & embedding
What parts of Firma.dev can I white-label, and can I use my own API domain?
What parts of Firma.dev can I white-label, and can I use my own API domain?
api.firma.dev itself can’t be proxied under your own domain, only the email-sending domain is customizable. The completion certificate can also be white-labeled, with your logo replacing Firma.dev’s. show_custom_branding_only only strips Firma.dev’s support contact line from emails; it doesn’t remove Firma.dev’s presence from the signing page itself.How do I set brand colors and a logo per workspace via the API?
How do I set brand colors and a logo per workspace via the API?
Why does the embedded template editor clip zoom/panning, and what about PDFs failing to load after a while?
Why does the embedded template editor clip zoom/panning, and what about PDFs failing to load after a while?
initialZoom to control the embedded template editor’s initial zoom directly.autoFit (boolean) is the alternative; initialZoom (number) takes precedence when both are set. Every document canvas supports panning via middle-mouse-button drag, leaving left-click free for field interaction.Signed document URLs expire after 1 hour. The embedded template editor auto-requests a fresh URL and retries up to 3 times instead of failing.If downloads are blocked, check for a sandbox attribute on your own page; Firma.dev’s embed examples don’t set one.See: Embeddable template editorCan I inject custom CSS into embeds or embed just the signature box?
Can I inject custom CSS into embeds or embed just the signature box?
Tools / SDKs / limits
How do I connect Firma.dev's MCP servers, and which one should I use?
How do I connect Firma.dev's MCP servers, and which one should I use?
Which SDKs does Firma.dev offer? Is there a Python SDK?
Which SDKs does Firma.dev offer? Is there a Python SDK?
@firma-dev/sdk, generated from the same OpenAPI spec as the API reference:requests library.See: TypeScript SDK for the Firma.dev APIWhat are the API rate limits?
What are the API rate limits?
Why do I see 'FunctionsFetchError: Failed to send a request to the Edge Function' in the console?
Why do I see 'FunctionsFetchError: Failed to send a request to the Edge Function' in the console?
For signers (received a document)
Where can I get a copy of a document after I sign it?
Where can I get a copy of a document after I sign it?
I have a question about a document, want to undo my signature, or my link expired. What do I do?
I have a question about a document, want to undo my signature, or my link expired. What do I do?