FaxSeal Send API
Send faxes programmatically from a URL, a PDF file, or raw HTML — using a simple Bearer token and a single POST request. Built for developers, nonprofits running advocacy campaigns, legal tech platforms, and any workflow that needs reliable outbound fax delivery at scale.
Overview
The FaxSeal Send API has three endpoints — one for each input type. All three share the same authentication, credit model, and response format.
🔗
Fax a URL
Pass any public URL — FaxSeal renders it to PDF and faxes it.
📄
Fax a PDF
Upload a PDF directly as multipart/form-data.
🖊️
Fax HTML
Pass raw HTML — rendered to a clean print-formatted PDF.
Base URL
https://faxseal.com
All endpoints accept JSON (or multipart for file upload) and return JSON.
Authentication
Every request must include your API token in the Authorization header as a Bearer token. Tokens are generated from your API Tokens dashboard. Tokens beginning with fsx_ are personal tokens; tokens created while in a Team workspace are scoped to that team's credit pool.
Authorization: Bearer fsx_your_token_here
GET /api/zapier/auth as a lightweight connection check, and letter-composition flows should use POST /api/v1/fax/text rather than /api/fax-from-file.Tokens inactive for 90 days are automatically revoked. Tokens used regularly stay active indefinitely. You can have up to 5 active tokens — create one per integration so you can revoke independently.
Endpoints
/api/fax-from-urlRenders a public URL to PDF and sends it as a fax. Ideal for web pages, Google Docs share links, government forms, or any document accessible over HTTP.
Request body (JSON)
urlstringrequiredFully qualified public URL (https:// only). Must be reachable by FaxSeal servers. Private/internal URLs are rejected.
toNumberstringrequiredDestination fax number in E.164 format, e.g. +12025551234. US, Canada, and international numbers are supported.
notestringOptional cover-page note. Prepends a cover sheet with this text before the rendered document.
Example
curl -X POST https://faxseal.com/api/fax-from-url \
-H "Authorization: Bearer fsx_your_token" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/press-release.pdf",
"toNumber": "+12025551234",
"note": "Please review the attached document."
}'Response
{
"jobId": "cmo3abc123",
"status": "queued",
"pages": 3,
"trackUrl": "https://faxseal.com/track?jobId=cmo3abc123",
"creditsRemaining": 47
}/api/fax-from-fileUpload a PDF directly. The request must be multipart/form-data. Do not use this endpoint for AI-composed letters or plain text content.
Form fields
fileFile (PDF)requiredThe PDF to fax. Must be a valid application/pdf file. Maximum 20 MB.
toNumberstringrequiredDestination fax number in E.164 format.
notestringOptional cover-page note.
Example
curl -X POST https://faxseal.com/api/fax-from-file \ -H "Authorization: Bearer fsx_your_token" \ -F "file=@/path/to/document.pdf" \ -F "toNumber=+12025551234" \ -F "note=Urgent: please respond within 48 hours."
Response
{
"jobId": "cmo3def456",
"status": "queued",
"pages": 5,
"trackUrl": "https://faxseal.com/track?jobId=cmo3def456",
"creditsRemaining": 42
}/api/fax-from-selectionPass raw HTML — FaxSeal renders it with a clean print stylesheet and faxes the result. Useful for templated letters, mail-merge workflows, and dynamically generated content.
Request body (JSON)
htmlstringrequiredRaw HTML to render. Maximum 500,000 characters. Inline styles are preserved; external stylesheets are not loaded.
toNumberstringrequiredDestination fax number in E.164 format.
Example
curl -X POST https://faxseal.com/api/fax-from-selection \
-H "Authorization: Bearer fsx_your_token" \
-H "Content-Type: application/json" \
-d '{
"html": "<h1>Dear Senator Smith,</h1><p>We urge you to support S.1234...</p>",
"toNumber": "+12025551234"
}'Response
{
"jobId": "cmo3ghi789",
"status": "queued",
"pages": 1,
"trackUrl": "https://faxseal.com/track?jobId=cmo3ghi789",
"creditsRemaining": 41
}Check Fax Status
/api/status?jobId={jobId}Poll for delivery status. Requires the same authenticated session that created the job. The trackUrl returned by send endpoints is a public link for your end users.
Example
curl "https://faxseal.com/api/status?jobId=cmo3abc123" \ -H "Authorization: Bearer fsx_your_token"
Response fields
| Field | Description |
|---|---|
status | "queued" | "sending" | "delivered" | "failed" |
pages | Number of pages in the fax |
toNumber | Destination number (E.164) |
failureReason | Present when status is "failed" — e.g. "busy", "no-answer", "timeout" |
refundStatus | "credit_restored" when credits have been refunded on failure |
sendAttempts | How many send attempts have been made (max 3) |
Error Codes
All errors return JSON with an error string. HTTP status codes follow standard conventions.
| Status | Meaning |
|---|---|
400 | Bad request — missing required field, invalid E.164 number, unsupported file type, or page limit exceeded. |
401 | Unauthorized — missing or invalid Authorization header. Check your token starts with "fsx_" and has not been revoked. |
402 | Insufficient credits — the fax would cost more credits than your balance. Top up at /credits. |
403 | Forbidden — your token's plan does not include outbound sending (Receive-Only plan). |
415 | Unsupported media type / wrong tool — most often caused by sending letter text to the PDF upload endpoint instead of using the text-fax endpoint. |
429 | Rate limit exceeded — max 60 faxes per hour per token. Back off and retry. |
500 | Server error — PDF generation or storage failed. Retry the request. |
Error response shape
{
"error": "Insufficient credits",
"creditsRequired": 2,
"creditsAvailable": 1
}Credits & Pricing
All send endpoints use pre-purchased credits. Credits never expire. Unused credits are automatically restored on fax failure.
| Pages | US & Canada | Europe / AU / JP | Rest of world |
|---|---|---|---|
| 1–5 pages | 1 credit | 2 credits | 3 credits |
| 6–15 pages | 2 credits | 4 credits | 6 credits |
| 16–30 pages | 3 credits | 6 credits | 9 credits |
| Pack | Credits | Price | Per fax (1–5 pg, US) |
|---|---|---|---|
| Starter Pack | 10 | $12.99 | $1.30 |
| Pro Pack | 30 | $24.99 | $0.83 |
| Office Pack | 100 | $59.99 | $0.60 |
High-volume users can purchase multiple packs at once. Org (team) tokens share a single credit pool — ideal for platforms sending on behalf of many users.Buy credits →
Limits
| Max pages per fax | 30 pages |
| Max file size | 20 MB |
| Max HTML length | 500,000 characters |
| Rate limit | 60 faxes per hour per token |
| Token inactivity | 90 days — revoked if unused |
| Max tokens per account | 5 active tokens |
| Supported file types | PDF only (for file upload) |
| URL protocols | https:// only |
Code Examples
JavaScript / Node.js — Fax a PDF file
const fs = require('fs');
const FormData = require('form-data');
const fetch = require('node-fetch');
async function sendFax(filePath, toNumber) {
const form = new FormData();
form.append('file', fs.createReadStream(filePath), { contentType: 'application/pdf' });
form.append('toNumber', toNumber);
const res = await fetch('https://faxseal.com/api/fax-from-file', {
method: 'POST',
headers: {
Authorization: 'Bearer fsx_your_token',
...form.getHeaders(),
},
body: form,
});
const data = await res.json();
if (!res.ok) throw new Error(data.error);
return data; // { jobId, status, pages, trackUrl, creditsRemaining }
}
sendFax('./letter.pdf', '+12025551234').then(console.log);JavaScript — Fax from a URL
const res = await fetch('https://faxseal.com/api/fax-from-url', {
method: 'POST',
headers: {
Authorization: 'Bearer fsx_your_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://yoursite.com/documents/advocacy-letter.pdf',
toNumber: '+12025551234',
}),
});
const { jobId, creditsRemaining } = await res.json();Python — Fax HTML (mail-merge template)
import requests
def fax_letter(to_number: str, legislator_name: str, issue: str) -> dict:
html = f"""
<h2>Dear {legislator_name},</h2>
<p>I am writing to urge your support for {issue}.</p>
<p>As your constituent, I believe this measure is essential...</p>
<p>Sincerely,<br>A Concerned Constituent</p>
"""
resp = requests.post(
'https://faxseal.com/api/fax-from-selection',
headers={'Authorization': 'Bearer fsx_your_token'},
json={'html': html, 'toNumber': to_number},
)
resp.raise_for_status()
return resp.json() # { jobId, status, pages, trackUrl, creditsRemaining }
# Send to multiple offices
offices = [
('+12025550001', 'Senator Johnson', 'S.1234 — Clean Water Act Amendment'),
('+12025550002', 'Rep. Williams', 'H.R.5678 — Infrastructure Bill'),
]
for number, name, issue in offices:
result = fax_letter(number, name, issue)
print(f"Queued: {result['jobId']} — {result['creditsRemaining']} credits remaining")Python — Poll for delivery
import time, requests
def wait_for_delivery(job_id: str, token: str, timeout=300) -> str:
start = time.time()
while time.time() - start < timeout:
r = requests.get(
f'https://faxseal.com/api/status?jobId={job_id}',
headers={'Authorization': f'Bearer {token}'},
)
data = r.json()
if data['status'] in ('delivered', 'failed'):
return data['status']
time.sleep(30)
return 'timeout'Use Cases
🏛️
Nonprofit advocacy campaigns
Send constituent letters to hundreds of congressional offices simultaneously. Pre-fill templates with legislator names, fax numbers, and issue-specific language. One credit pool, one integration.
Advocacy platform guide →⚖️
Legal tech & courts
File court documents, serve notices, and transmit exhibits to fax-only courts and agencies — directly from your case management system.
Legal fax use cases →🏥
Healthcare & insurance
Submit prior authorizations, referrals, and patient records to providers and payers that still require fax. HIPAA-conscious delivery with certified receipts.
Healthcare fax use cases →🤖
ChatGPT
Send faxes directly from ChatGPT. Open the FaxSeal GPT, sign in with your FaxSeal account, and say "send a fax to +12025551234 with this PDF." No code required.
Open FaxSeal GPT →🧠
Claude (MCP)
Use FaxSeal inside Claude Code via MCP. Install with one command and send faxes by natural language — no UI needed.
faxseal-mcp on npm →🔗
Zapier & no-code
Not writing code? Connect FaxSeal to 6,000+ apps via Zapier — trigger faxes from Google Sheets, Airtable, HubSpot, and more. No API token required.
Zapier integration →Ready to start sending?
Create a free account, generate an API token, and send your first fax in minutes. Credits start at $12.99.
Office pack: 100 credits for $59.99 — $0.60 per fax. Quantity discounts available.