Desenvolvedores
Uma API de fax que se comporta como o restante da sua stack.
REST sobre HTTPS com JSON, chaves de API bearer, webhooks assinados e um servidor MCP gerado a partir da mesma API. Um reenvio nunca cria um segundo fax.
API HTTP
REST e JSON com chaves bearer. Faça o upload, envie com um Idempotency-Key e depois consulte o status ou aguarde o webhook.
POST /v1/accounts/{id}/faxesServidor MCP
A mesma API como ferramentas do Model Context Protocol, filtrada pelos escopos da sua chave, para agentes que utilizam fax.
send_fax · get_fax · list_faxesWebhooks
Entregas assinadas com HMAC-SHA256 contendo o mesmo objeto de fax, com novas tentativas programadas. Ignore repetições da mesma entrega (compare por delivery_id).
fax.received · fax.succeededNesta página
Início rápido
Crie uma chave de API no aplicativo na seção de chaves da sua conta. As chaves começam com bfx_live_… ou bfx_test_…. Uma chave de teste cria faxes no sandbox: renderizados e verificados como os reais, e depois marcados como succeeded sem discagem nem cobrança. Envie a chave como Authorization: Bearer.
- 1. UploadPDF, TIFF, JPEG ou PNG, até 20 MiB. O
content_refdura uma hora e é de uso único. - 2. Enviar
toestá no formato E.164. Reutilize o mesmoIdempotency-Keyem novas tentativas durante 24 horas. - 3. AcompanharConsulte o status do fax ou aguarde
fax.succeededoufax.failed.
Assim que o documento existir, links.document redireciona (302) sua requisição autenticada para uma URL de download válida por cinco minutos. Em contas com registro de acesso a documentos, a mesma requisição retorna o documento diretamente (200), e ?redirect=false retorna um link de uso único que funciona apenas uma vez, durante 60 segundos. Cada leitura de documento é registrada em log de auditoria com quem leu e como. Se o fax for concluído por uma rede alternativa de operadora, caller_id_delivery fica como "not_guaranteed": as páginas foram entregues, mas o destinatário pode visualizar um identificador de chamada diferente.
Respostas
Um fax passa por queued → rendering → admitted → … e termina como succeeded, failed, cancelled, expiredou rejected. O webhook traz o mesmo objeto. Entenda cada status pelo que ele representa:
queued,rendering: aceito e sendo convertido em páginas de fax.admitted: verificado e agendado para entrega.transmitting: as páginas estão sendo transmitidas agora.retrying: uma tentativa não foi concluída; já agendamos a próxima, possivelmente por outra rede de operadora. Você não precisa reenviar.succeeded: entregue e faturado pelas páginas que chegaram.failed,cancelled,expirederejectednão são cobrados.
Um fax pode passar por outros status intermediários enquanto a conexão é estabelecida. Considere qualquer status não terminal como em andamento, e o histórico detalhado em links.attempts como o relatório completo.
Erros e novas tentativas
Erros retornam como application/problem+json com um identificador estável code. Repita erros de rede e 429 / 5xx com o mesmo Idempotency-Key, e respeite o cabeçalho Retry-After. Não repita outros status 4xx sem alterar a requisição.
HTTP/1.1 409 Conflict
Content-Type: application/problem+json
{
"type": "https://api.faxdev.com/problems/idempotency_conflict",
"title": "Idempotency key reused with a different request",
"status": 409,
"detail": "Idempotency-Key was used with a different request",
"instance": "<the X-Request-ID of this request>",
"code": "idempotency_conflict"
}Webhooks
Cadastre um endpoint HTTPS por conta ou um por organização para todas as contas de clientes. Cada envio é assinado com o segredo do endpoint exibido na criação ou rotação.
Fax-Timestamp: segundos Unix.Fax-Signature:hex(hmac_sha256(secret, "{timestamp}.{raw_body}")).- Rejeite timestamps com mais de cinco minutos de diferença do seu relógio e ignore repetições da mesma entrega (verifique por
delivery_id), que permanece o mesmo entre tentativas. - Tentamos novamente após 1 minuto, 5 minutos, 30 minutos, 2 horas e 8 horas.
- Um webhook nunca transmite os bytes do documento; obtenha
fax.links.documentcom sua chave de API.
- fax.queued
- fax.succeeded
- fax.failed
- fax.received
- fax.rejected
- fax.cancelled
- fax.expired
POST /your/webhook HTTP/1.1
Content-Type: application/json
Fax-Timestamp: 1793110800
Fax-Signature: 5b0e6c...e91d
{
"event": "fax.received",
"delivery_id": "0b6f3c7e-2a91-4d5b-8e40-1c7a9f2d6e38",
"occurred_at": "2026-10-27T14:20:00Z",
"fax": { "id": "...", "status": "succeeded", "direction": "inbound", "pages": 3,
"links": { "self": "...", "attempts": "...", "document": "https://api.faxdev.com/v1/accounts/.../faxes/.../document" } }
}Use a ação de teste do endpoint para receber um evento assinado webhook.test antes do seu primeiro fax real.
MCP para agentes de IA
A FaxDev API também funciona como um servidor Model Context Protocol (Streamable HTTP) em https://api.faxdev.com/mcp. Ela utiliza a mesma chave de API bearer do REST. A lista de ferramentas é gerada pela API e filtrada pelo nível e escopos da sua chave, garantindo que o agente nunca veja ferramentas que não pode chamar.
Conceda aos agentes uma chave apenas com os escopos necessários. Um agente somente leitura nunca deve ter faxes:send.
Ferramentas disponíveis para uma chave de conta, de acordo com os escopos:
| Ferramenta | Operação REST | Escopo |
|---|---|---|
send_fax | POST / | faxes:send |
get_fax | GET / | faxes:read |
list_faxes | GET / | faxes:read |
cancel_fax | POST / | faxes:cancel |
list_attempts | GET …/ | faxes:read |
get_fax_document_url | GET …/ | faxes:read |
list_numbers | GET / | numbers:read |
list_contacts | GET / | contacts:read |
create_contact | POST / | contacts:write |
get_usage | GET / | usage:read |
get_fax_document_url retorna uma URL temporária em vez dos bytes do arquivo, evitando encher transcrições de agentes com documentos; cada chamada é registrada em auditoria como um download no aplicativo. send_fax aceita um content_ref de um upload prévio (recomendado) ou conteúdo em base64 de até 20 MiB.
Referência completa: Documentação da API . Dúvidas: fale conosco.
Entrega e confiabilidade
Nós garantimos a entrega. Cada fax de saída é roteado por múltiplas redes de operadoras independentes com transporte e correção de erro dedicados para fax. Linhas ocupadas, não atendimento e falhas de handshake são repetidos e redirecionados automaticamente; se as rotas principais falharem, uma rede alternativa assume, podendo exibir outro identificador de chamada. Você nunca precisa reenviar e só paga pelas páginas que chegarem.
- Registro de entrega por tentativa. Cada tentativa é listada em
links.attemptscom seu resultado, páginas transferidas e duração. - API idempotente. Repita a criação com a mesma
Idempotency-Keye você receberá o fax original, nunca um segundo. - Webhooks assinados. HMAC-SHA256 sobre o timestamp e o corpo, com novas tentativas programadas. Ignore repetições da mesma entrega (verifique por
delivery_id). - Criptografia em repouso. Documentos e backups são criptografados, e cada leitura é auditada.
- Capacidade que acompanha a demanda. A capacidade de entrega escala automaticamente entre regiões dos EUA; um nó passa por drenagem antes de ser desligado para que os faxes em andamento terminem primeiro.
Dúvidas de desenvolvedores
Como faço para me autenticar?
Envie uma chave de API como Authorization: Bearer. As chaves começam com bfx_live_ ou bfx_test_, contêm apenas os escopos concedidos e podem ser revogadas a qualquer momento.
Como evito enviar o mesmo fax duas vezes?
Envie o cabeçalho Idempotency-Key em cada criação. Repetir a requisição com a mesma chave dentro de 24 horas retorna a resposta original em vez de enviar um segundo fax.
Como verifico um webhook?
Calcule hex(hmac_sha256(secret, timestamp + '.' + raw_body)) e compare em tempo constante com o cabeçalho Fax-Signature. Rejeite timestamps com diferença superior a cinco minutos do seu relógio e ignore repetições da mesma entrega (compare por delivery_id).
Como um agente de IA se conecta via MCP?
Aponte um cliente MCP para https://api.faxdev.com/mcp via Streamable HTTP usando a mesma chave de API bearer do REST. A lista de ferramentas é gerada a partir da API e filtrada pelos escopos da chave.
Posso testar sem discar ou pagar?
Sim. Uma chave bfx_test_ cria faxes no sandbox que são renderizados e validados como os reais, sendo depois marcados como succeeded sem discagem nem cobrança.
O que acontece quando uma tentativa de entrega falha?
Você não precisa fazer nada. Linha ocupada, ausência de resposta ou falha de handshake são repetidos e redirecionados automaticamente entre redes de operadoras independentes. Se as rotas principais falharem, uma rede alternativa é utilizada. Quando isso acontece, caller_id_delivery fica como not_guaranteed: as páginas foram entregues, mas o destinatário pode ver outro identificador de chamada. Cada tentativa é listada em links.attempts, e páginas que falharam nunca são cobradas.