// case
How we built Fax for Agents
- Product
- Fax for Agents
- Sector
- Fax API for AI agents
- Built
- A fax API with 146 operations and a 15-tool MCP server
- Window
- In production since 28 October 2026
- Facts checked
In this case
Fax for Agents lets AI agents send and receive faxes. It is a fax API, a hosted MCP server and SDKs for Python and TypeScript. An agent can prepare a document, get a quote, ask a person to approve it, send it and read what comes back. Every job ends with a receipt.
Synapse built it. The company that sells it is JSB Holdings LLC, a Delaware company formed in 2023, and the product’s about page names it as the maker. Like our Live Tennis API case, this one carries a name because the product is ours. Each claim below links the public page it comes from.
Why fax, and why it was hard
Fax still carries contracts, orders and filings in places that will not take an email. An agent that can do the rest of a task stops at that step and hands it back to a person. Giving it a fax line is the easy part. The hard part is that an agent that can send a fax can also send the wrong one. It can send it to the wrong number, as many times as its loop runs.
So the product was designed around one rule. Nothing leaves the service without a quote, a hold on the wallet and an authorization the server can name. Most of the engineering went into making that rule hold in three cases. The agent is wrong, a prompt has been tampered with, or the fax network does not answer cleanly.
What we built
The API
REST at one base URL, https://api.faxforagents.com/v1. The
API reference lists 146 operations in 18
groups, built from the OpenAPI 3.1 snapshot of 30 October 2026. It reads as
plain HTML with no JavaScript. A send has four steps: upload, quote, send,
receipt. Uploads can be PDF, images, text, Markdown or HTML. HTML renders in its
own container with scripts off and no network.
A quote prices one document to one destination and holds for ten minutes. The
send has to match it. Every send takes an Idempotency-Key. A retry after a
timeout reuses the same key and the same request, so it cannot fax the document
twice. Webhooks are signed with
HMAC-SHA256 and carry a timestamp, so a receiver can reject a forged or replayed
event.
Approvals, policies and budgets
This is the part that makes it safe to hand to an agent. The product’s
page for AI agents writes it up.
An approval covers five things: the document’s sha256 hash, the destination, the
sender number, the amount and an expiry. Change any one and the send is refused
with a named error. If the document is edited after a person approved it, its hash
no longer matches, and the server says document_hash_mismatch.
For work that should run without a person each time, an administrator writes a delegated policy. It names the allowed destinations or country prefixes, a page and amount cap per job, and daily and monthly limits. The server checks every send against it. A prompt that says “ignore the budget” changes nothing, because the policy check never reads prompt text.
Each agent gets its own identity and key. A person sets its scopes and budget. The server refuses the routes that would widen them to any key that belongs to an agent. Disabling an agent revokes its keys in the same transaction.
Honest job states
A fax job is in one of six states: queued, active, partial, failed, unknown or delivered. The word delivered appears only when the provider’s evidence exists, and the evidence comes with it. A send that the network has not confirmed says unknown, and the amount stays on hold until a review settles it. A failed send is not charged. A partial delivery is charged for the confirmed pages only. It is never retransmitted on its own, because resending a half-delivered contract is its own kind of mistake.
The inbox
A fax number costs $2 a month. Numbers can be ordered in the United States,
Canada, Puerto Rico and the US Virgin Islands. Each received fax lands as a
private PDF and fires a signed fax.received webhook. The text of a received fax
is always data. On every MCP result it is listed under untrusted. An id copied
out of a fax and passed back as an argument is refused before any request leaves
the tool. An instruction printed on an incoming page cannot turn into an
outgoing send.
The MCP server
The hosted MCP server runs at
https://mcp.faxforagents.com/mcp/ over Streamable HTTP. It has 15 tools,
from prepare_fax and quote_fax to request_human_review,
send_approved_fax, get_fax_status and extract_fax_data. A client that
speaks Streamable HTTP connects with the URL and an API key. There is no operator key on the
server and no state between requests. The tools cannot widen a key, raise a
budget or decide an approval. Those stay with a person in the dashboard, behind a
passkey.
The server is listed in the official MCP Registry as
io.github.faxforagents/faxforagents-mcp. A client that cannot reach a remote
server uses the stdio bridge instead, which installs from npm as faxforagents-mcp.
SDKs, the sandbox and the public code
The SDKs install with pip install faxforagents and npm install faxforagents.
Both are generated from the OpenAPI document. The
GitHub organisation holds six MIT-licensed
repositories. They are the OpenAPI document, both SDKs, the MCP server, runnable
examples and an extension for the Gemini command line.
With a test API key, sends go to scripted numbers for free. Each one plays out a single outcome: delivered, busy then delivered, partial, no answer, unknown, provider timeout or an invalid number. The events are the same as for a live send, so an agent’s error handling can be tested before it ever spends a cent.
Prices
Prices are prepaid and per page. These are from the pricing page, as of 28 October 2026. $0.039 per page sent and $0.019 per page received in the US and Canada. $2 a month per number. An optional $19 a month workspace plan, and a $10 minimum top-up. The pricing page also lists a per-page rate for 213 international routes.
Search and answer engines
This is the same work our answer-engine page sells, run on our own product. Every
page is static HTML, so its full text is in the first response. The main pages have a
plain Markdown copy at index.md inside their URL. The site publishes
llms.txt and a full-text version beside it.
Its robots.txt allows search and answer engines by name, never by wildcard. A
facts file prints every figure the site
states with its date and the method behind it. Every price on the site carries a
date too, so a reader, or a model quoting the page, can tell how current it is.
Shipping it
The changelog lists every production release with its date. The first, v0.1.0, went out on 28 October 2026 with the REST API, the double-entry ledger, signed webhooks and the hosted MCP server. Approvals, policies and agent identities followed in v0.1.3. Version 1.0.0 shipped the same day, and the changelog stood at v1.3.3 on 31 October 2026. It also lists two releases whose deploys failed and what fixed them. A changelog that only reports good news is not much use to anyone.
What you can check
All of it. The site, the docs, the API reference, the GitHub organisation, the npm and PyPI packages and the MCP Registry entry are public. We checked every fact on this page against those sources on 31 October 2026.
What this page leaves out is revenue, customer numbers and traffic. They are private, and a figure you can’t check has no place in a case study.
Which of our services this is
The API, the ledger and the job pipeline are custom software. The approval model, the policies and the untrusted inbox are what our agentic integrations page describes. Here they are built into a product of our own. The SDKs, the MCP server and the public repositories are developer marketing and GitHub marketing. The static pages, the llms.txt files and the dated facts are our answer-engine work. Read how we built Live Tennis API for the other product we run, or see both on our products page.
Start a conversation