// case

How we built 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.

< All work

Start a conversation

Building an API or a developer tool? Let's scope it.

Book a strategy call