Send APIv1

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.

✓ Credits never expire✓ Automatic refund on failure✓ Team credit pools✓ US, Canada & worldwide

Overview

The FaxSeal Send API has three endpoints — one for each input type. All three share the same authentication, credit model, and response format.

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
Connector integrations should verify auth before sending. FaxSeal exposes 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.
Keep tokens secret. Do not include them in client-side JavaScript, public repositories, or logs. A token grants full send access using your credits. Rotate immediately if compromised.

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

POST/api/fax-from-url

Renders 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)

urlstringrequired

Fully qualified public URL (https:// only). Must be reachable by FaxSeal servers. Private/internal URLs are rejected.

toNumberstringrequired

Destination fax number in E.164 format, e.g. +12025551234. US, Canada, and international numbers are supported.

notestring

Optional 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
}
POST/api/fax-from-file

Upload 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)required

The PDF to fax. Must be a valid application/pdf file. Maximum 20 MB.

toNumberstringrequired

Destination fax number in E.164 format.

notestring

Optional 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
}
POST/api/fax-from-selection

Pass 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)

htmlstringrequired

Raw HTML to render. Maximum 500,000 characters. Inline styles are preserved; external stylesheets are not loaded.

toNumberstringrequired

Destination 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

GET/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

FieldDescription
status"queued" | "sending" | "delivered" | "failed"
pagesNumber of pages in the fax
toNumberDestination number (E.164)
failureReasonPresent when status is "failed" — e.g. "busy", "no-answer", "timeout"
refundStatus"credit_restored" when credits have been refunded on failure
sendAttemptsHow many send attempts have been made (max 3)
FaxSeal retries failed faxes up to 3 times before marking as permanently failed and restoring credits. Poll at 30–60 second intervals — typical delivery takes 1–3 minutes.

Error Codes

All errors return JSON with an error string. HTTP status codes follow standard conventions.

StatusMeaning
400Bad request — missing required field, invalid E.164 number, unsupported file type, or page limit exceeded.
401Unauthorized — missing or invalid Authorization header. Check your token starts with "fsx_" and has not been revoked.
402Insufficient credits — the fax would cost more credits than your balance. Top up at /credits.
403Forbidden — your token's plan does not include outbound sending (Receive-Only plan).
415Unsupported media type / wrong tool — most often caused by sending letter text to the PDF upload endpoint instead of using the text-fax endpoint.
429Rate limit exceeded — max 60 faxes per hour per token. Back off and retry.
500Server 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.

Credit cost per fax
PagesUS & CanadaEurope / AU / JPRest of world
1–5 pages1 credit2 credits3 credits
6–15 pages2 credits4 credits6 credits
16–30 pages3 credits6 credits9 credits
Credit packs
PackCreditsPricePer fax (1–5 pg, US)
Starter Pack10$12.99$1.30
Pro Pack30$24.99$0.83
Office Pack100$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 fax30 pages
Max file size20 MB
Max HTML length500,000 characters
Rate limit60 faxes per hour per token
Token inactivity90 days — revoked if unused
Max tokens per account5 active tokens
Supported file typesPDF only (for file upload)
URL protocolshttps:// 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.