Fax API for developers & AI agents
The simplest Fax API available.
FaxDrop's REST fax API lets you send faxes programmatically with a single POST request. Any US or international fax number. HIPAA compliant. Pay per fax, no monthly minimum. API keys available now from your account dashboard.
Quickstart
Three steps. Under five minutes. No SDK required.
Create an account
Sign in with Google at faxdrop.com. You get 2 free faxes per month on the free plan. No credit card required to get started.
Generate an API key
Go to your account dashboard and open the API Keys section. Click Generate New Key. Copy the key immediately. You can create up to 3 active keys per account.
Store your key securely. It is shown once at creation. If you lose it, revoke it and generate a new one. Never commit API keys to source control.
Send a fax
POST a multipart form with the recipient number and your document. We accept PDF, DOCX, JPEG, and PNG files up to 10MB. Pass your key as an X-API-Key request header.
curl -X POST https://www.faxdrop.com/api/send-fax \
-H "X-API-Key: fd_live_your_api_key_here" \
-F "recipientNumber=+12125551234" \
-F "senderName=Your App" \
-F "senderEmail=you@example.com" \
-F "recipientName=Dr. Jane Smith" \
-F "subject=Patient records request" \
-F "senderCompany=Acme Medical Group" \
-F "senderPhone=+13155550123" \
-F "file=@document.pdf"Use with an AI agent
NewCopy a ready-made prompt that teaches any AI assistant (Claude, ChatGPT, etc.) how to send faxes using your FaxDrop API key.
API Reference
Base URL: https://www.faxdrop.com
Authentication
All API requests require an API key passed via the X-API-Key header. API keys start with fd_live_ followed by 32 hex characters.
You can also use FaxDrop programmatically through a web session (cookie-based auth), but API keys are required for server-to-server integrations and AI agent workflows. Requests authenticated with an API key are tracked separately in your usage dashboard.
X-API-Key: fd_live_a1b2c3d4e5f6.../api/send-faxSend a fax to any US or international fax number.
Request Headers
X-API-KeyRequired. Your API key. Generate one at faxdrop.com/account.Content-TypeSet to multipart/form-data (most HTTP clients set this automatically when you pass form data).Form Fields
| Field | Type | Required | Description |
|---|---|---|---|
file | File | Yes | Document to fax. PDF, DOCX, JPEG, or PNG. Max 10MB. |
recipientNumber | String | Yes | Recipient fax number in international format. Example: +12125551234 |
senderName | String | Yes | Sender name. Appears on the fax cover page. Can be your app name or a person's name. |
senderEmail | String | Yes | Email address for delivery confirmation. Does not need to match your account email. |
coverNote | String | No | Message printed on the cover page. Max 500 characters. |
recipientName | String | No | Recipient's display name for the cover page. Example: Dr. Jane Smith |
subject | String | No | RE: subject line printed on the cover page. Max 200 characters. |
senderCompany | String | No | Sender's company or organization name. Displayed alongside senderName on the cover page. Max 100 characters. |
senderPhone | String | No | Sender's phone number. Printed on the cover page for recipient callbacks. Example: +13155550123 |
Success Response 200 OK
{
"success": true,
"faxId": "fax_abc123",
"status": "queued",
"statusUrl": "/status/fax_abc123"
}| Field | Type | Description |
|---|---|---|
success | Boolean | Always true on a 200 response. |
faxId | String | Unique identifier for this fax. Use this to track delivery status. |
status | String | Initial status. Always queued on a successful send. |
statusUrl | String | Relative URL for the fax status page. Append to the base URL to get the full link. |
/api/v1/fax/{faxId}Check the delivery status of a fax. Poll this endpoint as an alternative to webhooks.
Path Parameters
faxIdRequired. The fax ID returned from POST /api/send-fax.Request Headers
X-API-KeyRequired. Your API key. You can only check faxes sent from your own account.Status Values
| Status | Meaning |
|---|---|
queued | Fax accepted and waiting to be transmitted. |
sending | Fax is currently being transmitted to the recipient. |
delivered | Fax was successfully delivered. pages and completedAt will be populated. |
failed | Fax delivery failed. Check the error field for details. |
partial | Some pages were delivered but the transmission was interrupted. |
Success Response 200 OK
{
"id": "fax_abc123",
"status": "delivered",
"recipientNumber": "+12125551234",
"pages": 3,
"completedAt": "2026-03-03T12:34:56.000Z",
}When a fax fails, the response includes an error field:
{
"id": "fax_abc123",
"status": "failed",
"recipientNumber": "+12125551234",
"pages": null,
"completedAt": null,
"error": "Line busy. No answer after 3 attempts."
}| Field | Type | Description |
|---|---|---|
id | String | The fax ID you queried. |
status | String | Current delivery status. One of: queued, sending, delivered, failed, partial. |
recipientNumber | String | null | The fax number the document was sent to. |
pages | Number | null | Number of pages transmitted. Populated after delivery completes. |
completedAt | String | null | ISO 8601 timestamp when the fax finished (delivered or failed). Null while in progress. |
error | String | null | Error description. Only present when status is failed or partial. |
Polling Tips
Most faxes deliver in under 90 seconds. A reasonable polling strategy:
- Poll every 5 seconds for the first 2 minutes
- Then every 30 seconds for up to 10 minutes
- Stop polling once status is
delivered,failed, orpartial
Status checks count toward your API rate limits (10/min, 100/hr, 500/day).
Example Requests
cURL
curl https://www.faxdrop.com/api/v1/fax/fax_abc123 \
-H "X-API-Key: fd_live_your_api_key_here"Python
import requests
response = requests.get(
"https://www.faxdrop.com/api/v1/fax/fax_abc123",
headers={"X-API-Key": "fd_live_your_api_key_here"},
)
data = response.json()
print(data["status"]) # "delivered"Node.js
const res = await fetch(
"https://www.faxdrop.com/api/v1/fax/fax_abc123",
{ headers: { "X-API-Key": "fd_live_your_api_key_here" } },
);
const data = await res.json();
console.log(data.status); // "delivered"Error Reference
All errors follow the same JSON schema.
Error responses include an error message, a machine-readable error_type, and when applicable a hint with a suggested fix and a retry_after value in seconds.
// 401 - Invalid or missing API key
{
"error": "API key not found or revoked.",
"error_type": "unauthorized",
"hint": "Check your key at https://faxdrop.com/account or generate a new one."
}
// 402 - No credits remaining
{
"error": "Insufficient credits. Please top up your account.",
"error_type": "payment_required",
"hint": "Add credits at https://faxdrop.com/pricing.",
"retry_after": 3600
}
// 429 - Rate limit hit
{
"error": "Rate limit exceeded. You are allowed 10 requests per minute.",
"error_type": "rate_limited",
"retry_after": 42
}
// 400 - Bad request
{
"error": "Unable to process your document.",
"error_type": "bad_request",
"hint": "Supported formats: PDF, DOCX, JPG, PNG. Max 10MB."
}| HTTP Status | error_type | When it happens |
|---|---|---|
400 | bad_request | Missing required fields, invalid fax number format, unsupported file type, file too large |
401 | unauthorized | Missing API key, key not found, key revoked, wrong key format |
402 | payment_required | No credits remaining, free tier exhausted. Check retry_after for when you can try again after topping up. |
429 | rate_limited | Per-key rate limit exceeded. See Rate Limits below. retry_after tells you exactly how many seconds to wait. |
500 | internal_error | Unexpected server error. These are rare. Retry after a few seconds. Contact support if they persist. |
Rate Limits
Three independent fixed-window buckets per API key.
| Window | Limit | Response header |
|---|---|---|
| Per minute | 10 requests | X-RateLimit-Limit / X-RateLimit-Remaining |
| Per hour | 100 requests | X-RateLimit-Limit-Hour / X-RateLimit-Remaining-Hour |
| Per day | 500 requests | X-RateLimit-Limit-Day / X-RateLimit-Remaining-Day |
Every successful response includes X-RateLimit-* headers so you can track your quota in real time. When you hit a limit, the response also includes a Retry-After header (seconds until the window resets) and a retry_after field in the JSON body.
Rejected requests (429 responses) do not count against your limit. Only successful requests consume quota.
X-RateLimit-Limit: 10 X-RateLimit-Remaining: 7 X-RateLimit-Reset: 1740924120 X-RateLimit-Limit-Hour: 100 X-RateLimit-Remaining-Hour: 93 X-RateLimit-Limit-Day: 500 X-RateLimit-Remaining-Day: 493
Usage Tracking
All faxes sent via API key are logged separately from web UI faxes. Your account dashboard shows monthly API usage counts and recent activity per key. Usage data is retained for 400 days.
Credits are shared across API and web UI usage. Each fax costs the same regardless of how it was initiated. Check your pricing plan for per-fax rates.
FaxDrop Fax API vs. the alternatives
Most fax APIs are built for enterprises with monthly minimums and complex onboarding. FaxDrop is built for developers who need fax without the overhead. Migrating from Twilio? See our Twilio migration guide.
| Feature | FaxDrop | Fax.Plus | Telnyx | RingCentral |
|---|---|---|---|---|
| Pricing model | Pay per fax ($1.99) | Subscription + overage | Per page ($0.007+) | Enterprise contract |
| Monthly minimum | None | Yes | Yes | Yes |
| HIPAA compliant | Yes (Sinch BAA) | Paid plans only | Yes (BAA required) | Enterprise only |
| Time to first fax | Under 5 minutes | 15-30 minutes | 30+ minutes | Days (sales process) |
| Free tier | 2 faxes/month | 10 pages/month | None | None |
| Document retention | Zero (browser-based) | Stored on servers | Stored on servers | Stored on servers |
| API complexity | 2 endpoints | Full REST + webhooks | Full REST + webhooks | Complex SDK required |
What developers are building
FaxDrop handles the fax infrastructure so you can focus on your product.
Healthcare platforms
Send prescriptions, referrals, and medical records to providers who still require fax. HIPAA compliant out of the box with zero document retention.
Legal document systems
Court filings, signed agreements, and discovery documents sent to fax-only recipients. Delivery confirmations for your audit trail.
Government form automation
IRS submissions, state filings, permit applications. Many government agencies still require fax. Automate the last mile.
AI agents and workflows
Give your AI agent the ability to fax. Your agent handles the workflow logic, FaxDrop handles the fax transmission. MCP server coming soon.
Why developers choose FaxDrop
HIPAA Compliant
Sinch BAA-backed transmission. AES-256 encrypted transport. Zero document retention. Built for healthcare and legal workflows.
Under 90 Seconds
Most US faxes deliver in under 90 seconds. Status webhook callbacks let you track delivery in real time.
Two Endpoints
POST /api/send-fax to send. GET /api/v1/fax/{id} to poll status. Multipart form. PDF, DOCX, JPEG, or PNG. That is the entire integration.
Pay Per Fax
No monthly minimums. No seat licensing. $1.99 per fax or subscribe for volume discounts. Credits never expire.
Agent-Ready
Built for the MCP era. Your AI agent can send faxes the same way a human does. No browser required.
Twilio Fax Is Gone
Twilio deprecated their fax API. FaxDrop is the modern replacement: simpler, cheaper, compliant out of the box.
Ready to integrate?
Sign in with Google, generate an API key from your account dashboard, and send your first fax in under five minutes.
Questions? Email us at support@faxdrop.com or visit /support.
Security & Compliance
HIPAA Compliant
Signed BAA on file · No document retention
PCI DSS Level 1
Payments secured by Stripe · No card data touches our servers
256-bit SSL
End-to-end TLS 1.2+ encryption in transit
Zero Retention
Files deleted immediately after transmission completes