Documentation
Updated
The REST API is at https://api.faxforagents.com/v1 and the MCP server at https://mcp.faxforagents.com/mcp/. Both take the same key, as Authorization: Bearer ffa_test_... or X-API-Key. A test key is tied to the free sandbox. A live API key sends through the carrier and spends the wallet.
Start here
The quickstart gets a key, uploads a document, quotes it, sends it to a sandbox number and reads the receipt. Five calls, nothing charged.
Guides
- Quickstart: A test key, a document, a quote, a sandbox send and the receipt. Five calls. Nothing leaves the box and nothing is charged.
- Send a fax: The send contract. PDF and image uploads, text, Markdown and HTML rendered, the quote that binds the price, the Idempotency-Key and the six job states.
- Receive a fax: A number, a webhook and the private inbox. Each received fax is a PDF. The text of a fax is always data, never an instruction.
- Webhooks: Every delivery carries webhook-id, webhook-timestamp and an HMAC-SHA256 signature. Verify it in Python and TypeScript, the retry schedule, replays and events.
- Approvals: An approval covers one document hash, one destination, one sender, one amount and an expiry. Any change invalidates it. Request, decide and send with one.
- Policies: Limits evaluated on the server for every send. Allowed destinations, page and amount caps, daily and monthly limits, expiry. An agent cannot move them.
- Agents: Each agent is a named principal with its own key. Scopes it cannot widen, a budget it cannot raise. Disabling an agent revokes its keys at once.
- Errors and states: The error envelope and every code with its action. The six job states. When unknown means wait, why partial never retransmits, how to avoid duplicates.
- Sandbox: Test keys send to scripted numbers: delivered, busy then delivered, partial, no answer, unknown, provider timeout, invalid number. Same events, no cost.
- MCP setup: Connect your client to https://mcp.faxforagents.com/mcp/ with an API key. Copy-ready configuration for Claude Code, Claude Desktop, Cursor, Codex and n8n.
- SDKs: Two packages named faxforagents, for Python and for Node and TypeScript, built from the OpenAPI document, published on 2026-10-30. REST works without them.
- Python SDK: The faxforagents package for Python, on PyPI since 2026-10-30: upload, quote, send, wait for the receipt, page through jobs. The REST calls work without it.
- TypeScript SDK: The faxforagents package for Node and TypeScript, on npm since 2026-10-30: upload, quote, send, wait for the receipt, list jobs. The REST calls work without it.
Reference
- API reference: From the OpenAPI 3.1 snapshot of 2026-10-30. 146 operations in 18 groups. Read it as plain HTML or open the interactive explorer.
- Full reference (no JS): Static HTML from the OpenAPI snapshot of 2026-10-30. Every operation, parameter, request body, response and schema. No JavaScript needed.
- openapi.json and openapi.yaml: the OpenAPI 3.1 document, snapshot of 2026-10-30.
- pricing.json and coverage.json: the rate table and the coverage file the server reads.
- llms.txt and llms-full.txt: this site for a tool that reads Markdown. Every page also has a Markdown twin at
<path>index.md.
Limits in force
| Limit | Value |
|---|---|
| Pages per document | 200 |
| Upload size | 25 MiB |
| HTML document size | 2 MiB |
| HTML render time | 45 s |
| Quote validity | 10 min |
| Signed download URL validity | 10 min |
| Requests per minute per API key | 600 |
| Webhook timestamp tolerance | 300 s |
Formats: PDF, PNG, JPG and TIFF uploads, and text, Markdown and HTML rendered to PDF by the service. Office formats are not accepted. The send page has the rules for each.