Siglio API documentation

One POST creates a signing envelope. Tag your PDF, choose email or SMS, and the signed document comes back on a webhook. This page covers everything you need to ship an integration.

01Quickstart

Creating an envelope is one HTTP request. There is no SDK to install, no OAuth dance, and no field-placement editor to configure first.

1. Put anchor tags in your PDF

Siglio finds signing fields by looking for anchor text in your document. Type ^S1 where signer 1 should sign. Set that text in white on a white background and it disappears for the reader while staying findable in the PDF text layer. Full detail in anchor tags.

2. POST the file

POSThttps://api.esigndev.com/v1/envelopes

Create an envelope

curl -X POST https://api.esigndev.com/v1/envelopes \
  -H "Authorization: Bearer sig_live_..." \
  -H "Idempotency-Key: order-41882-contract-1" \
  -F "file=@agreement.pdf" \
  -F 'payload={
    "delivery": "both",
    "signers": [{
      "name":  "Jane Smith",
      "email": "jane@example.com",
      "phone": "+18135551212"
    }]
  }'

The envelope is created and delivered immediately. The response carries an envelope ID beginning with env_, and every response, successful or not, carries a request ID beginning with req_. Log the request ID. It is the difference between a support ticket that gets diagnosed and one that turns into a conversation.

3. Handle the completion webhook

Siglio does not keep your signed PDFs. When signing completes, your webhook endpoint fires and that is your cue to download the signed document and store it. Build that into your handler on day one, not after someone asks you for a contract from six months ago. See signed documents.

Start here

Every account gets 25 free sandbox envelopes and no card is required to get them. Sandbox performs real delivery to real recipients, so send the first one to your own phone and watch what your signers will actually see.

02What an envelope is

An envelope is one signing transaction: one PDF, sent to one or two signers, delivered by email, SMS, or both. Creating it is a single POST.

One envelope is one charge, regardless of how many signers it goes to or how many delivery channels you use. Sending to two signers by both email and SMS is still one envelope and still 25 cents.

You are billed on creation, not on completion

The charge is for creating the envelope, not for a completed signature. If the signer declines, ignores it, never opens it, or you void the envelope afterward, the envelope was still created and it still costs 25 cents.

This is not buried in the terms. It is how the product is priced, and it is the reason the sandbox exists. Test your integration in sandbox until the flow is right, then create live envelopes you actually intend to send.

Not billable

A request that fails validation costs you nothing. Document checks, tag checks, and signer checks all run before the envelope is created, so a rejected request is never charged. See errors.

03Authentication

Authentication is a bearer token. Put your API key in the Authorization header:

Authorization: Bearer <your key>

No JWT assembly, no key pairs, no OAuth consent screen, no one-time authorization dance. One header.

Scopes

ScopeWhat it allows
readNon-mutating calls: envelope and status metadata, usage data exposed through the API, webhook delivery information.
read_writeEverything in read, plus the mutating calls. In V1 that means creating an envelope and voiding one.

Key lifecycle

You create, rotate, and revoke your own keys. Key IDs begin with key_. You can hold several keys in each environment, so different applications can use different keys.

Keys belong to the account, not to individuals. There are no teams, seats, or roles in V1, and keys carry no IP allowlist or per-key volume limit, so treat every key as fully capable within its scope and environment and give each application its own.

Rotation gives you a 24-hour overlap. The replacement key is created and the old one stays valid for 24 hours, so you can deploy without a gap. If you would rather cut over immediately, revoke the old key at any point during that window and it stops working right away.

Support cannot mint keys

Support will walk you through creating, rotating, or revoking a key, but will never do it for you. A support agent who can issue credentials on request is a social-engineering target. That is deliberate and it is permanent.

04Environments

There are two environments, sandbox and live.

  • Sandbox is where your 25 free envelopes live. Real end-to-end delivery, no charge.
  • Live envelopes are billed at 25 cents each.
  • Each environment has its own webhook endpoint.

A key is bound to one environment. Sandbox keys work only against sandbox, live keys only against live. There is no request-time environment switch, and that is deliberate: it means a sandbox key can never accidentally create a billable envelope.

Sandbox is not a simulation

Sandbox envelopes perform real end-to-end delivery to real recipients. A sandbox envelope sent to your own phone arrives on your phone as a real SMS. Sent to a colleague's email, it lands in their inbox and they can actually sign it. There is no watermark, no demo stamp, and no fake-signer mode. When your integration works in sandbox, you have seen the thing your users will see.

What happens at envelope 26

The 25 free sandbox envelopes are a one-time allowance per account. They do not refill, reset, or renew. Nothing about them is time-limited either: use 4 and come back six months later and the other 21 are still there.

Once they are used up you need a card on file to continue, and that is true whether you want to keep testing in sandbox or start sending live. There is no separate decision point, the card unlocks both. After that, sandbox envelopes cost 25 cents each, the same as live ones, and they appear as their own line item on the invoice.

Resource ID prefixes

Public IDs follow the same convention in both environments.

PrefixResource
env_Envelope
acct_Account
req_API request. Send this when reporting a problem.
evt_Webhook event
key_API key
wh_Webhook endpoint

05Documents

RuleValue
Accepted formatPDF only
Maximum file size15 MB
Encrypted or password-protected PDFsRejected

You upload the finished PDF with every request. Documents cannot be pulled from a remote URL, Word documents are not accepted, and there are no stored templates, so generate the document on your side and send the bytes. If your PDF is encrypted or carries an open password, remove the protection before upload. A protected PDF is rejected at creation rather than silently mishandled later.

Document rejections

All of these are checked before the envelope is created, so none of them are billable.

What happenedHTTPtypecode
File over 15 MB413invalid_documentfile_too_large
Not a PDF415unsupported_documentunsupported_file_type
Encrypted or password-protected PDF422invalid_documentencrypted_pdf
No ^S1 tag found422missing_required_tagmissing_required_signature_tag
Tags found for signer 3 or beyond422invalid_requestunsupported_signer_tag
PDF could not be parsed422invalid_documentunreadable_pdf

06Anchor tags

Siglio uses tagged-PDF signing. You place anchor tags in the document itself and Siglio finds them and puts the fields there. There is no drag-and-drop field editor and no coordinate-based placement API.

Tags do more than signatures. You can collect typed text and radio selections in the same document, so a signing envelope can also be a short form.

The tags

Every tag ends in the signer number it belongs to, 1 or 2.

Signer 1Signer 2Field
^S1^S2Signature. ^S1 is required on every envelope.
^I1^I2Initial
^D1^D2Date
^M1^M2Text field, required. The signer cannot finish without filling it.
^T1^T2Text field, optional
^R1_G1^R2_G1Radio option, in group 1. See below.

^S1 is mandatory. An envelope with no ^S1 anchor has nowhere to put a signature and will not be accepted. Signer 2 tags only mean anything on an envelope that actually has a second signer.

Use as many of each as the document needs. A five-page agreement can carry an initial tag on every page and a signature tag on the last one.

Radio groups

A radio group is defined by two things matching: the signer number and the _G value. Every anchor that shares both belongs to the same group, and the signer picks exactly one option from it.

So a three-way election for signer 1 is three separate anchors, all reading ^R1_G1, placed next to the three choices in your document. A second, independent question on the same page is ^R1_G2.

Choose one:

  [ ] Month to month        ^R1_G1
  [ ] Six month term        ^R1_G1
  [ ] Twelve month term     ^R1_G1

Autopay:

  [ ] Yes                   ^R1_G2
  [ ] No                    ^R1_G2

Each signer gets up to nine groups, _G1 through _G9. There is no limit on how many options sit inside one group.

Making tags invisible

Place the tag text in white font on a white background. It is invisible to the person reading the document and still parseable when the envelope is created. That is the intended way to use it: your contract looks like a contract, and the anchors sit quietly in the text layer.

The two things that break tagging

The tag must be real text in the PDF text layer. A tag flattened into an image, or a PDF produced by scanning, has no text to find.

Template edits can move an anchor. If you generate documents from a template, check that your edits have not moved, split, or reflowed the anchor text. Anchor placement depends on the anchor surviving into the final file, and this is the most common cause of a field ending up in the wrong place.

A note on terminology

"Tagged PDF" here means anchor-string field placement, as described above. It does not mean PDF/UA structural accessibility tagging. Those are unrelated concepts that happen to share a name.

07Signers

An envelope supports a maximum of two signers. Signer 1 is required, signer 2 is optional. Three or more signers is not supported.

Supplying more than two signers, or tagging for signer 3 and beyond, is rejected at creation and is not billed.

08Delivery

You choose the delivery method per envelope:

  • Email
  • SMS
  • Both, sent in parallel

Both means both, at the same time, to the same signer. It is not a fallback after email bounces, and it is not a paid add-on. SMS delivery is included in the 25 cents.

This matters if your signers are contractors, tenants, patients, field staff, or anyone who does not sit in an inbox all day. The link that arrives by text gets opened.

Because delivery is set per envelope, you can use email for one and both channels for the next without changing anything about your account.

09Idempotency

Envelope creation accepts an idempotency key. Send the same key with the same request and you get the original result back instead of a second envelope.

Use it

Envelope creation is the billed operation. A retry on a network timeout without an idempotency key is how you accidentally create and pay for two envelopes.

You generate the key yourself and send it in the Idempotency-Key header. Any unique string up to 255 characters works. Use something derived from your own record, like order-41882-contract-1.

Idempotency-Key: order-41882-contract-1

Records are kept for 30 days, so a retry days later still resolves correctly rather than creating a second billable envelope.

The pattern

Generate one key per logical envelope in your own system, store it alongside your record, and reuse it on every retry of that same envelope.

Reusing a key with a different body is an error

It is not a silent overwrite. You get a 422 with type: invalid_request and code: idempotency_key_reuse. That is deliberate: it catches the bug where a key gets recycled across two genuinely different envelopes, which would otherwise mean the second one silently never gets sent.

10Webhooks

Webhooks are included on every account. They are not a paid tier, not an add-on, and not gated by volume. Every account, from the first sandbox envelope.

Configuration

EndpointsOne sandbox endpoint, one live endpoint
Event typesAll of them. There are no per-event subscriptions.
Webhook IDswh_...
Event IDsevt_...

You configure one endpoint per environment and receive every event type on it. Filter by event type in your handler.

Retries

Failed deliveries are retried on an exponential backoff with jitter: immediately, then at roughly 1 minute, 5 minutes, 15 minutes, 1 hour, 3 hours, 6 hours, 12 hours, then once every 24 hours, stopping after 7 days. Any 2xx response counts as success.

Every attempt is recorded with its HTTP status and response body, and the full delivery history is visible in the portal. An endpoint that fails every attempt for 7 days is marked failed and retries stop.

Not every failure is treated the same

Your responseWhat we doWhy
408, 429, any 5xxFull seven-day retry scheduleThese usually resolve on their own
401, 403, 404, 410Three attempts, then marked failedYour endpoint is rejecting us, not struggling. A week of retries will not fix a deleted route or a bad auth rule.

You hear about it early

After three consecutive delivery failures on an endpoint, Siglio emails your technical-alert address. You do not have to wait for the retry window to exhaust itself to find out something is broken, and you do not have to poll the delivery history to notice.

Handler expectations

Return a 2xx quickly and do your work asynchronously. A handler that takes a long time to respond looks like a failing endpoint, and will be treated as one.

There is no manual replay. Once you return a 2xx, that event is delivered and will not be sent again. Acknowledge first and process from your own durable queue, so a crash after the 2xx costs you a retry rather than the event.

11Signed documents

Read this before you build

Siglio does not store your signed PDFs. Download the signed document when the completion webhook fires, and keep your own copy. That is not a suggestion, it is the integration requirement.

The arrangement, stated plainly because it affects how you build:

  • Signers get a secure download link for their copy.
  • You, the developer, receive the signed result through the completion webhook.

Signer download links last 90 days

Signer links stay valid for 90 days from completion. After that the link stops working and the signer can request a fresh one. Siglio sends the new link to the same email address or phone number that was on the envelope, so there is no extra identity step: that channel already proved out during signing.

The 90 days is about the link, not the document. Siglio does not store your signed documents, so the link was never the durable record. The copy you download on the completion webhook is the one you will still have in three years, and it is the one your own retention obligations run against.

Siglio does not publish a retention period for signed documents, and support will not state one. If your compliance process needs a retention commitment, you need your own copy.

12Errors

Every API response carries a request ID (req_...), in the response body on errors and in a response header on every request, successful or not. Log it.

Error shape

{
  "error": {
    "type":       "invalid_document",
    "code":       "missing_required_signature_tag",
    "message":    "The PDF must include a ^S1 signature tag.",
    "request_id": "req_01ABC..."
  }
}

How to handle these

Switch on type, log code, never parse message. type is the broad class and is stable. code is the specific reason and new ones may be added over time. message is written for a human reading a log and its wording may change.

Error types

typeHTTPWhen
authentication_error401Missing, malformed, revoked or expired key
authorization_error403Valid key, wrong scope for this call
invalid_request400Malformed request, bad or missing parameters
invalid_document422PDF present but unusable
unsupported_document415Not a supported file type
missing_required_tag422Required signing tag absent
invalid_signer422Signer details missing or unusable for the chosen delivery method
new_envelopes_paused403Pause New Envelopes is on
account_paused403Account fully paused
usage_limit_reached403Approved monthly limit ceiling hit
self_imposed_cap_reached403Your own cap hit. Hard stop, no grace.
payment_required402Card needed before this call can proceed
rate_limited429Slow down. Retry after the interval in the response.
service_unavailable503Temporary. Safe to retry with your idempotency key.
internal_error500Our fault. Send us the request_id.

Which errors cost you money

None of the 4xx classes above. They mean the request did not create an envelope and was not billed.

A 500 or 503 is the ambiguous case, and that is exactly what idempotency keys are for. Retry with the same key and you get either the original result or a fresh attempt, never a double charge.

Common causes of a rejected creation

  • The document is not a PDF, is over 15 MB, or is encrypted
  • The document has no ^S1 anchor
  • More than two signers were supplied
  • The account is at a hard stop on its limit, or paused
  • The bearer token is missing, malformed, or revoked

13Limits

Every account has an approved monthly envelope limit. There is no arbitrary default. When you activate paid usage you declare your estimated monthly live-envelope volume, and that estimate becomes your initial approved limit.

Self-service increases go up to 10,000 envelopes per month. You can raise your own limit in the portal at any time up to that ceiling. Above 10,000, the request goes to a person.

Approaching and passing the limit

PointBehavior
90% of limitWarning, with a 24-hour cure window to raise the limit or reduce sending
100% of limitSending continues. You are not cut off at exactly 100%.
110% of limitHard stop. Envelope creation is refused.

The 10% band exists so a busy Friday does not break your integration. It is headroom, not an allowance to plan against.

Self-imposed cap

You can set your own cap below your approved limit. A self-imposed cap is a hard stop, not a warning. When you hit it, envelope creation stops, and there is no 110% band above it.

This is the control to use if you want a guaranteed ceiling on spend, for example while a new integration runs unattended for the first time.

14Pause controls

The portal has three controls, all self-service and all immediate: Pause New Envelopes, Pause Account, and Unpause Account. They are independent of your self-imposed monthly cap.

Pause New Envelopes is the lighter one. It blocks new envelope creation while leaving the read API, existing envelopes, webhook delivery and billing all working normally.

What a full pause does

A full pause, whether you triggered it or it followed a payment default, behaves the same way. No new envelopes can be created. Envelopes already in flight stay live and their recipients can still sign them.

Pause suppresses delivery, not capture

Outbound webhook delivery to your endpoint stops, but Siglio keeps capturing every signing event and queues it durably. When the account unpauses, the missed events replay to your endpoint in chronological order, with their original event IDs and original occurrence timestamps. You lose nothing.

Support will not pause or unpause an account on a customer's behalf.

15Pricing

$0.25 per envelope. Flat. Every envelope, at every volume.

There are no volume tiers, no negotiated rates, and no annual commitment. 25 cents at ten envelopes a month, 25 cents at a hundred thousand.

There is no monthly fee at any volume. A month where you send nothing costs nothing. There are no seats and no per-user pricing. Billing is per envelope only. There is no contract and no minimum commitment.

SMS delivery is included. Webhooks are included. The 25 free sandbox envelopes require no card.

16Billing cycle

Billing runs on a monthly anniversary cycle. Your cycle starts the day you activate paid billing and repeats on that same day each calendar month. Activate on March 14 and you are invoiced on the 14th of every month.

If your anniversary falls on a day a month does not have, the cycle bills on the closest last day of that month. A January 31 activation bills February 28, then March 31.

Cards

You keep a primary card and a backup card. If the primary fails, the backup is charged.

If both cards fail

StepWhat happens
1A 5-day cure period starts
2Daily reminders during those 5 days
3If payment has not succeeded by the end of the cure period, the account is fully paused

A full pause means the account stops. Fix the payment method to restore it. See pause controls for exactly what a pause does and does not affect.

Support cannot change a payment method on your behalf, and cannot issue a credit or a refund. Both are handled by a person.

17Getting help

Real questions get real answers from someone who knows the product, usually the same day.

If your question is about a specific API call, send the req_ ID. It is the fastest path to an actual answer, and it is the difference between a diagnosis and a conversation.

Open a support request

What support will not do

  • Create, rotate, or revoke an API key for you
  • Change a payment method on your behalf
  • Issue a credit or a refund (a person handles those)
  • Pause or unpause your account for you
  • Advise on whether a given signature is enforceable, whether a document type is eligible for electronic signature, or how e-signature law applies to your situation. That is a question for your counsel.