---
name: sendfax
description: Send a real fax over HTTP via SendFax.sh -- pay per page with x402 or MPP (USDC), no account or API key. Use when the user asks to fax a PDF to a fax number.
homepage: https://sendfax.sh
license: See https://sendfax.sh for terms
metadata:
  pricing: $0.05 per page, USDC (agent rails have no minimum)
  auth: none -- per-request payment (x402/MPP) is the credential
---

# Send a fax with SendFax.sh

> Install into your agent: `npx skills add DanielSinclair/sendfax.sh --skill sendfax -g`

SendFax.sh sends real faxes to any fax number. You pay per request with x402 or
MPP (USDC); there is no account and no API key. Faxes are real-time -- the PDF is
deleted after sending and never stored.

## When to use

The user wants to send a PDF to a fax number (an E.164 number like
`+14155550123`). You have, or can produce, the document as a PDF.

## Inputs you need

- `document`: the PDF to send (unencrypted, <=20 MB).
- `to`: the destination fax number in E.164 format (`+` then country code and
  number, e.g. `+14155550123`). SendFax delivers to the US, Canada, Mexico, and
  St. Pierre & Miquelon; a number outside those countries returns HTTP 422.
- An x402- or MPP-capable payment client with a funded USDC wallet.

## Steps

1. **Submit** -- `POST https://sendfax.sh/api/v1/faxes` as `multipart/form-data`
   with fields `document` (the PDF file) and `to` (the E.164 number).

   ```bash
   curl -sS https://sendfax.sh/api/v1/faxes \
     -F document=@document.pdf \
     -F to=+14155550123
   ```

2. **Pay** -- the first response is `HTTP 402 Payment Required`. It advertises
   $0.05/page in USDC via a `PAYMENT-REQUIRED` header + `accepts` JSON body
   (x402) and a `WWW-Authenticate: Payment` header (MPP). Amounts are in USDC
   base units (6 decimals): `50000` = $0.05 per page.

   Settlement is by **Stripe deposit mode** (no facilitator, no CDP, no signed
   authorization). The 402 also carries deposit headers: `x-payment-deposit-address`,
   `x-payment-deposit-network` (e.g. `base`), `x-payment-deposit-token` (USDC), and
   `x-payment-deposit-amount` (exact, 6 decimals). Send **exactly** that amount of
   USDC to that address as a **plain ERC-20 transfer**; Stripe watches the chain
   and captures it.

3. **Retry to claim** -- after sending the USDC, resend the identical request
   (same `to` + `document`, **no payment header**). The server polls Stripe and,
   once your transfer is detected, returns `HTTP 202` with:

   ```json
   { "id": "fax_...", "statusUrl": "https://sendfax.sh/f/fax_..." }
   ```

   Until then it returns the same 402 (same address, safe to retry); poll every
   few seconds.

4. **Poll** -- `GET https://sendfax.sh/api/v1/faxes/{id}` (free) until `status`
   is `delivered` or `failed`. Progression is
   `queued -> media_processed -> sending -> delivered`. On failure, read
   `failureReason`. Report the outcome (and `statusUrl`) to the user.

## Notes

- No accounts, ever. The payment authorizes the send; there is no key to store.
- Privacy: the document is streamed to the carrier and deleted after sending;
  the destination number is redacted to its last 4 digits at terminal state.
- Errors are `application/problem+json` (RFC 9457) with `type`, `title`,
  `status`, `detail`.
- If your fax fails or is not delivered within an hour, card and USDC-via-Stripe
  payments are refunded in full automatically -- USDC paid via the x402 rail
  (Stripe deposit mode) returns to your sending wallet. MPP-native payments, a
  raw on-chain transfer with no Stripe charge to reverse, need a manual refund:
  email support@sendfax.sh with your fax id.
- Writing TypeScript/JavaScript? Prefer the `sendfax` SDK skill instead of raw
  HTTP: `npx skills add DanielSinclair/sendfax --skill sendfax-sdk -g`.
- Full reference: https://sendfax.sh/llms-full.txt *
  OpenAPI: https://sendfax.sh/openapi.json
