Developer API
Send faxes, create documents, and collect signatures from your own software. Create an API key, then try the examples below.
Fill it, sign it, fax it. One API call.
Insurance claims, court filings, medical records requests and government forms still have to be faxed, and usually signed first. Send us your data as JSON and we do the rest:
- We fill in your template and make the PDF.
- We send it for e-signature by email or text message. Signers don't need an account.
- When everyone has signed, we fax the signed copy, with its signing certificate, to the number you gave us.
No PDF libraries, no signing vendor, no fax modem. Good fit for legal tech, healthcare operations, insurance and lending teams.
See the exampleAuthentication
Create an API key under Account → API keys, then send it as a bearer token:
Phones and desktop apps can also sign in with email and password.
POST /api/v1/auth/token accepts JSON {"email","password","deviceName"}
and returns accessToken, expiresAtUtc, and refreshToken.
Send the access token as Authorization: Bearer. It is a short-lived ufax_ key for that device.
POST /api/v1/auth/refresh with {"refreshToken"} returns a new pair.
Using an old refresh token signs that device out.
Wrong email or password both return invalid_credentials.
A locked account returns locked_out. Two-factor accounts return requires_two_factor and do not get a token.
Signed-in devices are listed under Account → Settings. Only that account can revoke them.
POST /api/v1/auth/revoke signs out the device that presented the access token.
curl -H "Authorization: Bearer ufax_YOUR_KEY" \
https://unlimitedfaxing.com/api/v1/documents
Templates
Templates use {{Placeholder}} tokens and a simple markup subset (# headings, - bullets, | a | b | table rows, **bold**).
# Create a template
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Invoice","body":"# Invoice\n\nBill to: {{Client}}\n\n**Total: {{Total}}**"}' \
https://unlimitedfaxing.com/api/v1/templates
# List templates
curl -H "Authorization: Bearer ufax_YOUR_KEY" \
https://unlimitedfaxing.com/api/v1/templates
Documents
Create a PDF from a template plus your data. This uses 1 document from this month's limit. The PDF is ready to download, sign, or fax.
# Generate a PDF
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"templateId":1,"data":{"Client":"Acme Corp","Total":"$500.00"}}' \
https://unlimitedfaxing.com/api/v1/documents
# → {"id":"…","fileName":"Invoice-20260907-120000.pdf","pages":1,"downloadUrl":"/api/v1/documents/…/file"}
# Download it
curl -H "Authorization: Bearer ufax_YOUR_KEY" \
https://unlimitedfaxing.com/api/v1/documents/{id}/file -o invoice.pdf
Fax
Send a PDF or TIFF. Each page counts toward your plan's fax pages.
# Send a fax
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-F "file=@contract.pdf" -F "destination=+14155551212" \
https://unlimitedfaxing.com/api/v1/fax
# → {"id":"…","status":"Sending","pages":3}
# Check status
curl -H "Authorization: Bearer ufax_YOUR_KEY" \
https://unlimitedfaxing.com/api/v1/fax/{id}
Sign
Request e-signatures. Signers get a link (no account needed). When everyone signs, the final PDF includes an audit certificate. Consumes 1 signature per signer.
# Create a signature request (upload a PDF…)
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-F "file=@contract.pdf" -F "title=MSA" \
-F 'signers=[{"email":"jane@example.com","name":"Jane Doe"}]' \
https://unlimitedfaxing.com/api/v1/sign
# …or reference a generated document
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-F "documentId=GUID" -F "title=MSA" \
-F 'signers=[{"email":"jane@example.com"}]' \
https://unlimitedfaxing.com/api/v1/sign
# Poll status; finalDownloadUrl appears when completed
curl -H "Authorization: Bearer ufax_YOUR_KEY" \
https://unlimitedfaxing.com/api/v1/sign/{id}
Fill, sign & fax in one call
POST /api/v1/workflows/template-sign-fax fills a template from JSON, optionally sends it for signature, then faxes it. Your key needs the fax:send scope and documents:rw (or templates:rw), plus sign:send if you include sign.
templateId: one of your templates.datamust include a value for every{{blank}}in it.fax.destination: the fax number in full E.164, like+14155551212.fax.callerId: optional. Must be one of your own fax numbers. Leave it out to use your default.sign: optional. Leave it out to fax right away. Signers sign in the order listed.viaisemail(default) orsms; forsms, give each signer aphone.
curl -X POST -H "Authorization: Bearer ufax_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": 42,
"data": { "ClientName": "Jane Doe", "PolicyNumber": "PX-1001" },
"sign": {
"title": "Claim authorization",
"via": "email",
"signers": [ { "name": "Jane Doe", "email": "jane@example.com", "phone": "+14155551212" } ]
},
"fax": { "destination": "+18005550199", "callerId": "+17045550123" }
}' \
https://unlimitedfaxing.com/api/v1/workflows/template-sign-fax
With sign, you get 202 Accepted with signatureRequestId. Track it with GET /api/v1/sign/{id}; the fax goes out automatically once the last person signs and shows up in your fax list. Without sign, you get 200 with the faxId. The recipient sees the file as document.pdf. Fax page limits, sending limits and blocked-number rules are the same as POST /api/v1/fax.
Webhooks
Register endpoints under Account → Webhooks. The signing secret is shown once when you add or rotate an endpoint — store it like an API key. We POST JSON with an X-Ufx-Signature header — HMAC-SHA256 of the raw request body using that secret. Production endpoints must use HTTPS; private and metadata hosts are blocked.
{
"id": "…",
"type": "fax.status",
"occurredAt": "2026-09-07T12:00:00Z",
"data": { "id": "…", "status": "Delivered", "pages": 3 }
}
| Event | Fired when |
|---|---|
fax.status | An outbound fax changes status |
fax.received | An inbound fax arrives |
sign.completed | All signers have signed a request |
document.generated | A document is generated via the API |
Failed deliveries retry up to 3 times with backoff.
Errors and monthly limits
Errors return JSON with an error code. When a request is over this month's limit, the API returns HTTP 402 with {"error":"quota_exceeded","remaining":…,"limit":…}. Free: 50 documents, 5 signatures, 5 fax pages per month from our shared number (no fax number included). Pro: 500 fax pages per month, unlimited documents, 100 signatures. Business and Enterprise include unlimited fax pages, documents, and signatures, subject to fair use. Toll-free (800) numbers and minutes are covered in the FAQ below. If you get that error, wait until next month or choose a larger plan, then send the request again.
FAQ
Are toll-free (800) numbers or minutes included with my plan?
Toll-free (800) fax numbers are optional on paid plans. A toll-free number counts as one of your fax numbers, the same as a local number: it can be the one included with a seat, or an extra number. Incoming toll-free calls also cost $0.05 per minute for calls from the US and Canada, billed in 6-second increments. Calls from Alaska, Hawaii, US territories, and outside North America are billed at a higher rate shown on your invoice, or may be blocked. Toll-free minutes are not part of “Unlimited.”