Changelog

What shipped, when  ยท  Siglio

Every change that affects your integration, newest first. Breaking changes get their own note and we don't make them quietly. If something here isn't clear, ask through the contact form.

8 Oct 2026

Delivery none: you hand out the link. "delivery": "none" sends nothing to the signer, ever: no request, no reminder, no signed copy. The create response always carries signers with each signing_url for your app to show. It applies to the whole envelope, each signer still needs an email or phone for the certificate, and payment or attachments are refused with it. The certificate records the link as provided by the sender. Same 25 cents, and it works with templates. Details at docs#link-only.

Switched-off features say which one. When we switch a feature off across the service, a request that uses it now gets its own 422 code (type invalid_request, not billed): link_only_disabled, sender_branding_disabled, payments_disabled, attachments_disabled or two_signer_disabled. See docs#errors.

A failed create is never billed. If something breaks on our side while an envelope is being created, you get 500 internal_error with a request_id, the envelope is marked failed, and the free document is given back.

5 Oct 2026

Send a studio template from the API. POST /v1/envelopes takes template_id as a third way to name the document, alongside document_base64 and document_id (exactly one of the three). Pass the signer’s details and your own values in merge, and Siglio prints them where the template says, places the signature and date marks, and sends it. allow_blanks sends with missing values left blank. document_name defaults to the template’s name. Details at docs#templates.

List and read your templates. GET /v1/templates lists them, newest first, with limit and starting_after. GET /v1/templates/{id} returns each value the template prints in merge_fields (where it comes from, and its slot for a custom field) and which signers sign in signing_fields. The ids are the same ones the studio shows, with a Copy button.

Ten named custom fields per signer. The studio’s Custom field tool now takes a name and a label, in up to ten slots per signer, and you fill them over the API by name or by custom_N. Saved contacts in the studio gain Custom 4 to 10.

New error codes, template sends only. All type invalid_request and none billed: template_not_found (404), missing_merge_fields, unknown_merge_field, conflicting_merge_values, invalid_merge_value, unsupported_characters, signer_count_mismatch and template_not_ready (422). Errors about particular values now carry error.fields. Requests without template_id behave exactly as before.

One API key, and 25 free documents. There is now one kind of key: sig_ followed by 32 characters. There is no sandbox or live mode any more. Every account gets 25 free documents, no card, shared by the API and the document studio, and they deliver for real. After 25, add a card and your business details in the dashboard, in one step, and every envelope is 25 cents. Adding a card early doesn’t forfeit the free ones you have left. Keys you already hold keep working and behave exactly like the new ones, and free envelopes you already used count toward the 25. Details at docs#trial.

Breaking: environment is gone. Envelope responses, webhook payloads (including webhook.test) and the dashboard’s CSV exports no longer carry an environment field. A request that still sends one is accepted and the field is ignored. live_not_enabled is no longer returned. If your code reads environment, remove it.

Your company name is the sender. Signers see “Your Company via Siglio”. New accounts give the name at signup. An account without one is asked for it in the studio and dashboard, and POST /v1/envelopes returns 422 company_name_required until it exists, unless the request carries sender.company_name. During the free trial the certificate shows the company name and leaves the other originator fields blank. After the trial the full business profile is required, and a send without it gets 422 invalid_request naming the missing fields. A company name under review gets 403 account_under_review. None of these is billed. See docs#errors.

One webhook endpoint per account. Accounts that had two (one per mode) keep the one that was used for live envelopes. Every event type still goes to it.

Docs correction: the webhook payload. Events carry occurred_at and the envelope under data.envelope. That was always the behavior; openapi.json and llms-full.txt now say so.

1 Oct 2026

Collect answers before signing (Enterprise). Answer fields now come with a short form the signer fills in before signing, then one Sign applies the signatures, dates and answers together, and each answer prints where its tag is. Fields can be text (^M required, ^T optional), dropdowns, the new ^C checkbox tag (alone or in groups) and ^R choices. ^R options and ^C boxes carry values (^R1_G1:plan=monthly). form_fields on create names and labels fields and takes type (text, select, checkbox, checkbox_group, radio), options, format (email, phone, number, date, zip, ssn) and show_if / required_if rules (equals, not_empty, in, checked, includes, combined with all or any). New constraints on create: exactly one, at least N, at most N, only one of these, and requires. Answers come back typed as field_values on the envelope and in the envelope.partially_signed and envelope.completed webhooks, and GET /v1/envelopes/{id} returns the form the envelope was created with. A bad entry is refused with 422 invalid_form_fields or 422 invalid_constraints, naming it. Details at docs#answers.

Breaking for accounts without Enterprise: answer fields are refused. On an account without data collection, a document with ^M, ^T, ^C or ^R tags, or a request with form_fields, now gets 403 feature_not_enabled (type authorization_error). Not billed, nothing created. Signature, initial and date tags work on every account as before, and envelopes created before this change are not affected. If your integration sends any of these, contact us to turn it on.

The signing-order exception narrows. Envelopes with answer fields now follow the strict order in the 28 Sep note. The only exception left is a signer whose name is in a non-Latin script: notification is still sequential, but signer 2’s link works from creation, as before. Details at docs#signers.

MCP server 1.1.0. siglio-mcp has a fifth tool, download_attachment, for files the signer uploaded. send_for_signature now defaults delivery to auto and passes payment, attachments, form_fields and constraints (the last two Enterprise) straight through. check_envelope shows any payment, uploaded files and answers by label, with Social Security numbers masked to the last four digits. Restart your MCP client to pick it up. Details at docs#mcp.

Docs correction: created is an envelope state. An envelope held for a before payment or before files reports created until the signing link goes out. That was always the behavior; the state list in openapi.json and llms-full.txt now includes it.

28 Sep 2026

Reminders, expiry and 30-day retention. Signers who haven’t signed are now reminded automatically on the envelope’s delivery channels (days 1, 2, 3, 5, 7, 10, 14 and 21 after they were asked, plus a last reminder on day 28), between 11:00 and 19:00 US Eastern; contact support to turn reminders off for your account. Envelopes not completed 30 days after sending are voided and fire envelope.voided. Files (the uploaded PDF, the signed PDF and signer attachments) are deleted 30 days after an envelope is completed, voided or failed; the document and attachment downloads then return 410 document_deleted. Download the signed PDF on envelope.completed and keep your copy. Reminders and expiry apply to envelopes created from today. No endpoints, fields or event names changed. Details at docs#reminders and docs#signed-docs.

Two-signer envelopes are now strictly sequential. Signer 2 is notified only after signer 1 signs, and until then signer 2’s signing_url opens on a page saying the document is waiting on the first signer, so the order holds even if you hand the link out yourself. This replaces the 23 Sep note below. One exception for now: when a signer has fields to fill in (^M, ^T or ^R) or a name in a non-Latin script, notification is still sequential but signer 2’s link works from creation, as before.

Signers get the signed PDF. When an envelope completes, each signer is sent the signed PDF, certificate page included: attached to an email for email delivery, and by text with a download link for text delivery. Nothing else changed: the envelope states, the webhooks (envelope.delivered, envelope.partially_signed, envelope.completed, envelope.voided), the signed PDF endpoint and the certificate layout are the same. Details at docs#signers.

delivery is now optional, and defaults to auto. auto sends by email and text when the signer has both an email and a phone, otherwise by whichever one they have, so every signer you have a mobile for gets the text without you checking first. It works per signer on two-signer envelopes, and signers[n].delivery accepts it too. Responses, GET and webhooks carry the resolved value (email, sms or both), never auto, and each signers entry now has its own delivery (null on envelopes created before today). Nothing that worked before changes: email, sms and both keep their strict meaning, and leaving delivery out used to be an error. Details at docs#delivery.

Ask the signer for files. Add attachments: { when, items: [{ label, required }] } to POST /v1/envelopes and the signer is sent a Siglio-hosted upload page for up to five things (a photo ID, proof of insurance, a W-9), photos or PDFs from their phone, 15 MB each. when: "before" holds the document until every required file is in and then sends the signing link; when: "after" asks the moment it is signed. There is no default. When a payment is due at the same timing, one page and one message cover both. Envelopes carry an attachments object with each item's files, files download from GET /v1/envelopes/:id/attachments/:file, and a new envelope.attachments_received event fires when the signer is done. Files are never emailed.

Collect a payment with the document. Add payment: { amount, description, when } to POST /v1/envelopes and the signer is sent a Siglio-hosted payment page that pays you, through your own Stripe account: connect it once in the document studio under Get paid. when: "after" (the default) sends the payment link the moment the document is completed. when: "before" holds the document, sends the payment link instead of the signing link, and releases the signing link when the payment lands; a held envelope sits in created, its signing_url is the payment page until it is paid, and it is not billed unless it goes out. Envelopes with a payment carry a payment object (status, paid_at, pay_url) everywhere an envelope is returned, and a new envelope.paid event fires when the money is recorded. USD only for now; Siglio adds no fee on top of Stripe’s. Full detail at docs#envelopes.

23 Sep 2026

MCP server. Claude Desktop, Cursor, Claude Code or any MCP client can now send documents for signature from a conversation, with no code written. It is on npm as siglio-mcp and gives the assistant four tools: send for signature, check an envelope, download the signed PDF, void. Setup is one entry in the client's config file with your API key; the full block is at docs#mcp. Sandbox keys work as-is. Live keys are refused unless SIGLIO_ALLOW_LIVE=true is also set, so nothing bills by accident.

Docs correction: signing order is not enforced. The docs said two-signer signing was strictly sequential. What is sequential is the notification: signer two is not told about the document until signer one has finished. Signer two's signing_url exists from creation and works at any time. If one party must sign strictly before the other, hold signer two's link yourself until envelope.partially_signed fires. No behaviour changed; the wording did.

13 Sep 2026

signed_at is now recorded per signer. The field was documented and always came back null. It now carries the time that signer put their signature on the document, on the create response, on GET /v1/envelopes/:id, and in webhook payloads. On a two-signer envelope this is what tells you which of the two has finished, which completed_at cannot, because it only exists once everyone has signed.

What null means now. Only one thing: we do not have a recorded signature time for that signer. On an envelope that is completed, every signer has signed whether or not each time was recorded, so read the state for whether they signed and signed_at for when. We will not fill this field with an approximation to make it look complete, because it is an evidentiary timestamp and a plausible wrong answer is worse than no answer. Envelopes signed before this change fill in on their own where the original record allows it.

30 Aug 2026

envelope.delivered now fires. The event was documented but never emitted. It now fires the moment an envelope reaches the delivered state, at creation. If you were treating envelope.viewed as your first signal, you'll now see a delivered event ahead of it.

Two-signer webhook payloads carry the full signers array. Previously the envelope object in a webhook showed only the first signer while the create response showed both. Both now return the same shape, including each signer's signing_url and signed_at.

Quieter uptime alerting. Internal change with no API surface, noted because it affects how quickly we notice a problem: the external health check now requires two consecutive failures before it alerts, which removes false alarms from single hung probes.

27 Aug 2026

Two signers per envelope. Send signers as an array of one or two people instead of a single signer. Each can have their own delivery channel; the second defaults to the envelope's. Signing is sequential: signer two is invited once signer one has finished.

New state and event: partially_signed. When the first of two signers finishes, the envelope moves to partially_signed and fires envelope.partially_signed. This is not done. Only completed means both signatures are on the document, and the PDF before that point is half-executed and should not be used.

api.esigndev.com. The API is now served and documented at https://api.esigndev.com. The same endpoints continue to answer on esigndev.com; neither host is deprecated and the docs use api.

Docs rewritten around the questions people actually ask. A correct JSON create example, both ways to send the file, the two-signer request shape, the four event types in one table, how to download the signed PDF, and how to test with tags left visible.

Before that

Signed webhooks with X-Siglio-Signature, idempotent envelope creation via Idempotency-Key, the upload flow for files above the inline limit, and the sandbox with real delivery to real inboxes and phones.


Older entries predate this page. We started keeping the changelog on 30 August 2026 and it runs forward from here.