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
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
| Scope | What it allows |
|---|---|
read | Non-mutating calls: envelope and status metadata, usage data exposed through the API, webhook delivery information. |
read_write | Everything 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.
| Prefix | Resource |
|---|---|
env_ | Envelope |
acct_ | Account |
req_ | API request. Send this when reporting a problem. |
evt_ | Webhook event |
key_ | API key |
wh_ | Webhook endpoint |
05Documents
| Rule | Value |
|---|---|
| Accepted format | PDF only |
| Maximum file size | 15 MB |
| Encrypted or password-protected PDFs | Rejected |
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 happened | HTTP | type | code |
|---|---|---|---|
| File over 15 MB | 413 | invalid_document | file_too_large |
| Not a PDF | 415 | unsupported_document | unsupported_file_type |
| Encrypted or password-protected PDF | 422 | invalid_document | encrypted_pdf |
No ^S1 tag found | 422 | missing_required_tag | missing_required_signature_tag |
| Tags found for signer 3 or beyond | 422 | invalid_request | unsupported_signer_tag |
| PDF could not be parsed | 422 | invalid_document | unreadable_pdf |
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:
- 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
| Endpoints | One sandbox endpoint, one live endpoint |
|---|---|
| Event types | All of them. There are no per-event subscriptions. |
| Webhook IDs | wh_... |
| Event IDs | evt_... |
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 response | What we do | Why |
|---|---|---|
| 408, 429, any 5xx | Full seven-day retry schedule | These usually resolve on their own |
| 401, 403, 404, 410 | Three attempts, then marked failed | Your 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
type | HTTP | When |
|---|---|---|
authentication_error | 401 | Missing, malformed, revoked or expired key |
authorization_error | 403 | Valid key, wrong scope for this call |
invalid_request | 400 | Malformed request, bad or missing parameters |
invalid_document | 422 | PDF present but unusable |
unsupported_document | 415 | Not a supported file type |
missing_required_tag | 422 | Required signing tag absent |
invalid_signer | 422 | Signer details missing or unusable for the chosen delivery method |
new_envelopes_paused | 403 | Pause New Envelopes is on |
account_paused | 403 | Account fully paused |
usage_limit_reached | 403 | Approved monthly limit ceiling hit |
self_imposed_cap_reached | 403 | Your own cap hit. Hard stop, no grace. |
payment_required | 402 | Card needed before this call can proceed |
rate_limited | 429 | Slow down. Retry after the interval in the response. |
service_unavailable | 503 | Temporary. Safe to retry with your idempotency key. |
internal_error | 500 | Our 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
^S1anchor - 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
| Point | Behavior |
|---|---|
| 90% of limit | Warning, with a 24-hour cure window to raise the limit or reduce sending |
| 100% of limit | Sending continues. You are not cut off at exactly 100%. |
| 110% of limit | Hard 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
| Step | What happens |
|---|---|
| 1 | A 5-day cure period starts |
| 2 | Daily reminders during those 5 days |
| 3 | If 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.
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.