Create your account
Sign up and verify your email to access the developer console.
Developer preview
Build browserless fax sending into apps, workflows, and agents. Create a job, attach documents, confirm the quote, and send with prepaid credits.
Connecting an AI assistant? Read about our MCP server.
curl https://app.onetimefax.com/api/v1/faxes \
-H "Authorization: Bearer otf_live_..." \
-H "Content-Type: application/json" \
-d '{
"recipientNumber": "+14155551212"
}' Set up billing once, then send faxes from code without stopping for checkout.
Sign up and verify your email to access the developer console.
Add prepaid credits once in the developer console. Fax sends then charge that balance.
Create a fax, upload files, poll for the quote, and send from code or an agent.
The fax API is an async job flow. Credits are charged after documents are counted, when you call send.
These are the routes currently available in the developer preview. All API requests
use an Authorization: Bearer otf_live_...
header.
/api/v1/account Validates an API key and returns the developer account name, credit balance, and key metadata.
Example response
{
"account": {
"name": "Acme Operations",
"creditBalanceCents": 2500,
"creditBalance": "$25.00"
},
"apiKey": {
"name": "Production",
"keyPrefix": "otf_live_abcd...",
"lastUsedAt": "2026-07-03T03:19:09.981Z"
}
} /api/v1/faxes Creates a durable draft fax for an E.164 recipient number. Files and credit debiting happen in later calls.
Example request
{
"recipientNumber": "+14155551212"
} Example response
{
"fax": {
"id": "cmr4...",
"status": "draft",
"recipientNumber": "+14155551212",
"createdAt": "2026-07-05T21:20:00.000Z"
},
"next": {
"uploadFile": "/api/v1/faxes/cmr4.../files",
"status": "/api/v1/faxes/cmr4...",
"send": "/api/v1/faxes/cmr4.../send"
}
} /api/v1/faxes/{faxId}/files Uploads one document to an API fax draft. Send the request as multipart/form-data with a file field.
Example request
curl https://app.onetimefax.com/api/v1/faxes/cmr4.../files \
-H "Authorization: Bearer otf_live_..." \
-F "file=@document.pdf" Example response
{
"file": {
"id": "cmr5...",
"filename": "document.pdf",
"contentType": "application/pdf",
"sizeBytes": 123456,
"status": "uploaded",
"pageCount": null,
"order": 1,
"createdAt": "2026-07-05T21:30:00.000Z"
},
"fax": {
"id": "cmr4...",
"status": "draft"
},
"next": {
"status": "/api/v1/faxes/cmr4...",
"send": "/api/v1/faxes/cmr4.../send"
}
} /api/v1/faxes/{faxId}/files/{fileId} Removes an attachment before the fax is sent. Returns 204 with no response body.
Example request
curl -X DELETE https://app.onetimefax.com/api/v1/faxes/cmr4.../files/cmr5... -H "Authorization: Bearer otf_live_..." Example response
204 No Content /api/v1/faxes/{faxId} Poll until every file is ready and quote is non-null. After sending, this route reports delivery status.
Example response
{
"fax": {
"id": "cmr4...",
"recipientNumber": "+14155551212",
"status": "draft",
"createdAt": "2026-07-05T21:20:00.000Z",
"files": [{
"id": "cmr5...", "filename": "document.pdf",
"sizeBytes": 123456, "pageCount": 2,
"status": "ready", "order": 1,
"createdAt": "2026-07-05T21:30:00.000Z"
}],
"pageCount": 2,
"quote": {
"priceCents": 500,
"creditBalanceCents": 1000,
"shortfallCents": 0
},
"creditsConsumedCents": null
}
} /api/v1/faxes/{faxId}/send Charges the quoted amount and queues delivery. Retrying the same fax ID returns the original charge without another debit. Processing files return 409; insufficient credits return 402 with the shortfall and top-up path.
Example request
curl -X POST https://app.onetimefax.com/api/v1/faxes/cmr4.../send -H "Authorization: Bearer otf_live_..." Example response
{
"fax": { "id": "cmr4...", "status": "queued" },
"creditsConsumedCents": 500,
"creditBalanceCents": 500,
"replayed": false,
"next": { "status": "/api/v1/faxes/cmr4..." }
} A person adds funds in the developer console. Send calls debit that balance atomically. If funds are low, the API returns the shortfall and a path to add credits.
Store the API key as a secret in your agent's environment. The agent can upload a file, read the quote, and send without opening a checkout during the workflow.
The final docs page can grow from this outline without needing a separate marketing page first.