Fax
Orbit’s Fax channel sends and receives T.38 / G.711 faxes via Telnyx Programmable Fax — the named exception to Orbit’s outbound-termination policy (voice and SMS exit only via the Devotel softswitch; fax/T.38 and MMS are the two channels permitted to terminate on Telnyx). Documents are delivered as PDF or TIFF; status updates flow through the same channel-agnostic webhook contract as other channels. Fax is on-success-charge: Orbit only bills your wallet when the carrier confirms a successful fax transmission. Failed attempts (busy, no-answer, line-quality) are NOT billed.Send a fax
Request fields
Idempotency: every fax send carries a stable provider-side idempotency key (
orbit-fax:<message-id>), so a retry of the same send — from your client or from Orbit’s queue worker — dedups at the carrier and does not bill twice. Re-sending the same payload is safe; you do not need to mint your own idempotency key.Response
id is the Orbit message ID — use it to poll status or match webhook events. The provider-side fax ID is attached asynchronously as external_id once the transmission is dispatched and is readable via GET /api/v1/fax/:id.
Receive an inbound fax
An inbound fax arrives as a Telnyxfax.received webhook on Orbit’s inbound endpoint. Orbit resolves the tenant from the recipient DID, writes a messages row with channel: "fax" and direction: "inbound", and then runs the per-DID routing config to deliver the fax downstream.
Routing a number’s inbound faxes
Routing is per-DID and lives on the number detail view (and its API pair):
Because a deliverable inbound fax only requires an HTTPS
media_url on the webhook payload, everything below applies when routing is enabled; without routing the only record of the fax is the message row.
Webhook payload
Telnyx delivers inbound faxes to Orbit with this shape (fields Orbit consumes):from is the sender’s ANI, to is your DID, and media_url is the PDF of the received pages. Orbit stores the PDF into secure storage when routing email/inbox delivery needs the bytes, and the mailbox/ticket carries the download link or a link-only pointer when the bytes could not be fetched at that moment.
Download URL lifetime:
media_url points at the carrier’s media store. The URL is a presigned, expiring link at ingest time — your downstream consumer (the email forwarder or inbox ticket) must fetch it promptly. Orbit’s email forwarder fetches within a 15-second window when routing is enabled; a missed fetch degrades to a link-only email, and once the link is expired the message row keeps the record but not the document bytes. Do not re-share the URL beyond your recipient list.status: "received" confirms the carrier accepted the fax. Orbit’s dedup marker keys on the provider fax_id, so a Telnyx retry of the same fax.received event creates only one message row.
Retention
The message record of an inbound fax is retained like every other message row (no special purge). The carrier-issuedmedia_url, however, expires on the carrier’s schedule — treat the media copy forwarded to email/inbox (or fetched by your webhook consumer) as the durable artifact, and the message row as the audit record.
Capabilities
- Outbound fax — PDF or TIFF input; the carrier converts the document to T.38 packets in real time.
- Inbound fax — received as PDF with sender ANI, recipient DID, and a download URL POSTed to your webhook; per-DID routing forwards the PDF to email and/or opens an inbox ticket.
- Quality —
normal,high, orvery_highto control transmission resolution. - Document size — PDF or TIFF up to 50 MB per outbound fax (the carrier’s hard media-size limit); multi-page documents are supported, with no separate page-count cap.
- Delivery status — outcomes arrive on the channel-agnostic
message.delivered/message.failedwebhook events withchannel: "fax"(there is no separatefax.*event to subscribe to). Each payload carriesmessage_id,status,state_class, andis_terminalfor reconciliation. - Per-tenant carrier connection — orgs can attach a dedicated Telnyx Fax application connection for compliance / data-residency (resolution: tenant-level
fax_connection_id→ platform default → legacy voice connection fallback).
Status lifecycle
queued → sending → sent → delivered (or failed)
Every outbound fax moves through the states below. A fax is single-attempt: it is never retried once it reaches failed. The queue worker re-dispatches the same send only while it is still queued (e.g. on a transient provider 408), and the stable idempotency key dedups the carrier side.
failed is terminal and sent is non-terminal: a fax that shows sent will still receive delivered or failed when the carrier finishes negotiating with the end station.
Errors
A failed API request returns the standard JSON error envelope whoseerror.code is one of the values below.
Carrier passthrough errors
A fax that is accepted but cannot be delivered is reported asynchronously on themessage.failed webhook with the record marked failed. When the carrier supplies a diagnostic, Orbit passes it through unchanged in the error_code and error_message fields — these carry the carrier’s own text, not a fixed Orbit enum, so the exact set of values depends on the upstream carrier. Common diagnostics:
When no carrier detail is available, the record simply reaches
failed with no further reason. Failed faxes are never billed.
Limits
quality: very_high lengthens the T.38 handshake; on lossy lines it can tip a long fax into poor_line_quality failure. For high-volume fax, default to high and fall back to normal on long documents to lossy destinations.
Dashboard walkthrough
Fax read surfaces (
GET /api/v1/fax, GET /api/v1/fax/:id, GET /api/v1/fax/:id/status) and both inbound/outbound routing live in the dashboard under Numbers → (pick your DID) for routing, and Messages → Fax (or the Messages list filtered by channel) for transmission history.fax_connection_id in tenant settings — the send pipeline resolves it before the platform default, so all subsequent sends for that org route through your assigned Telnyx Fax application. Resolution order is: tenant fax_connection_id → platform default → legacy voice connection (fallback that logs a deprecation warning).
To view inbound faxes and set up routing:
- Open Numbers and pick the DID that should receive faxes.
- Open the Fax routing card on the number detail page.
- Enable Fax routing, add up to 20 forwarding recipients, and optionally toggle Open an inbox ticket.
- (Optional) Set an Archive label to sort forwarded faxes.
Common patterns
Idempotent send with metadata — attach a correlation key you can match on later webhook events:external_id is attached:
external_id is null before then), so poll the detail route first if you just got the send response.
Handling carrier passthrough errors — match error_code on message.failed and branch like:
Related
- Webhook events — the
message.delivered/message.failedpayloads and the channel-agnostic event contract. - Error codes — the JSON error envelope and
error_codecatalog. - Message failed troubleshooting — general guidance on diagnoses that close into terminal failure.
- Webhook security — how to verify
status_callbacksignatures with your per-sendstatus_callback_secret.