Разработчики
Факс-API, работающий так же привычно, как и весь ваш стек.
REST через HTTPS с JSON, API-ключи bearer, подписанные вебхуки и MCP-сервер, сгенерированный из того же API. Повторный запрос никогда не создаст дубликат факса.
HTTP API
REST и JSON с ключами bearer. Загрузите файл, отправьте с Idempotency-Key, затем опрашивайте статус или ожидайте вебхук.
POST /v1/accounts/{id}/faxesMCP-сервер
Тот же API в виде инструментов Model Context Protocol, отфильтрованных по скоупам вашего ключа, для факсимильных агентов.
send_fax · get_fax · list_faxesВебхуки
Доставки с подписью HMAC-SHA256 и тем же объектом факса, с повторными попытками по расписанию. Игнорируйте дубликаты доставок (сверяйте delivery_id).
fax.received · fax.succeededНа этой странице
Быстрый старт
Создайте API-ключ в приложении в разделе ключей вашего аккаунта. Ключи имеют вид bfx_live_… или bfx_test_…. Тестовый ключ создает факсы в песочнице: они рендерятся и проверяются как реальные, затем помечаются succeeded без набора номера и списаний. Передавайте ключ в заголовке Authorization: Bearer.
- 1. ЗагрузкаPDF, TIFF, JPEG или PNG до 20 МиБ. Значение
content_refдействует один час и используется однократно. - 2. Отправка
toв формате E.164. Повторно используйте тот жеIdempotency-Keyпри повторах в течение 24 часов. - 3. ОтслеживаниеОпрашивайте факс или ожидайте событие
fax.succeededлибоfax.failed.
Когда документ создан, links.document перенаправляет (302) авторизованный запрос на пятиминутный URL для скачивания. В аккаунтах с журналированием доступа тот же запрос возвращает сам документ (200), а ?redirect=false возвращает одноразовую ссылку, действующую 60 секунд. Каждое чтение документа фиксируется в журнале аудита. Если факс доставлен через резервную сеть оператора, caller_id_delivery принимает значение "not_guaranteed": страницы переданы, но получатель может увидеть другой номер отправителя.
Ответы
Факс проходит этапы queued → rendering → admitted → … и завершается как succeeded, failed, cancelled, expired, или rejected. Вебхук передает тот же объект. Значения статусов:
queued,rendering: принят и преобразуется в страницы факса.admitted: проверен и поставлен в очередь на отправку.transmitting: страницы передаются прямо сейчас.retrying: попытка не удалась; следующая уже запланирована, возможно, через другую сеть оператора. Отправлять повторно вручную не нужно.succeeded: доставлен и тарифицирован за фактически переданные страницы.failed,cancelled,expired, аrejectedне тарифицируются.
Факс может проходить другие промежуточные статусы при установке соединения. Считайте любой нетерминальный статус выполняющимся, а полную историю попыток смотрите в links.attempts .
Ошибки и повторы
Ошибки возвращаются как application/problem+json со стабильным машиночитаемым полем code. Сетевые ошибки и коды 429 / 5xx можно повторять с тем же Idempotency-Key, учитывая заголовок Retry-After. Не повторяйте другие ответы 4xx без изменения тела запроса.
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"
}Вебхуки
Зарегистрируйте эндпоинт HTTPS для каждого аккаунта или один общий для всей организации. Каждая доставка подписывается секретом эндпоинта, отображаемым при его создании или ротации.
Fax-Timestamp: секунды Unix.Fax-Signature:hex(hmac_sha256(secret, "{timestamp}.{raw_body}")).- Отклоняйте метки времени с расхождением более пяти минут и игнорируйте повторы доставок (сверяйте
delivery_id), сохраняющийся при повторах. - Повторные попытки выполняются через 1 минуту, 5 минут, 30 минут, 2 часа и 8 часов.
- Вебхук никогда не передает содержимое документа; запрашивайте
fax.links.documentс вашим 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" } }
}Используйте тестовое действие эндпоинта, чтобы получить подписанное событие webhook.test до отправки первого реального факса.
MCP для ИИ-агентов
Интерфейс FaxDev API также работает как сервер Model Context Protocol (Streamable HTTP) по адресу https://api.faxdev.com/mcp. Он использует тот же bearer API-ключ, что и REST. Список инструментов генерируется из API и фильтруется по уровню и скоупам ключа, поэтому агент не видит недоступные инструменты.
Выдавайте агентам ключи только с необходимыми скоупами. Агент для чтения не должен иметь скоуп faxes:send.
. Инструменты, доступные ключу аккаунта при наличии скоупов:
| Инструмент | Операция REST | Скоуп |
|---|---|---|
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 возвращает короткоживущий URL вместо содержимого файла, чтобы логи агента не засорялись документами; каждый вызов протоколируется в аудите. send_fax принимает content_ref из предварительной загрузки (рекомендуется) или данные base64 объемом до 20 МиБ.
Полный справочник: Документация API . Вопросы: свяжитесь с нами.
Доставка и надежность
Мы гарантируем доставку. Каждый исходящий факс маршрутизируется через несколько независимых операторов с контролем качества и коррекцией ошибок. Занятые линии, неотвеченные вызовы и сбои соединения обрабатываются автоматически. Если основные маршруты недоступны, подключается резервная сеть оператора (при этом номер отправителя может измениться). Повторно отправлять факс не требуется, а оплата взимается только за доставленные страницы.
- Журнал каждой попытки доставки. Каждая попытка отображается в
links.attemptsс результатом, переданными страницами и длительностью. - Идемпотентный API. Повторите запрос создания с тем же
Idempotency-Keyи получите исходный факс — дубликат никогда не будет создан. - Подписанные вебхуки. Подпись HMAC-SHA256 по метке времени и телу запроса с повторами по графику. Игнорируйте дубликаты доставок (сверяйте
delivery_id). - Шифрование при хранении. Документы и резервные копии зашифрованы, а каждое чтение фиксируется в журнале аудита.
- Емкость по требованию. Пропускная способность масштабируется по регионам США; узлы плавно выводятся из работы, давая завершиться текущим факсам.
Вопросы разработчиков
Как пройти аутентификацию?
Передайте API-ключ в заголовке Authorization: Bearer. Ключи имеют префикс bfx_live_ или bfx_test_, содержат только выданные скоупы и могут быть отозваны в любой момент.
Как избежать повторной отправки одного факса?
Передавайте заголовок Idempotency-Key при каждом создании. Повторный запрос с тем же ключом в течение 24 часов возвращает исходный ответ без создания второго факса.
Как проверить подпись вебхука?
Вычислите hex(hmac_sha256(secret, timestamp + '.' + raw_body)) и сравните за постоянное время с заголовком Fax-Signature. Отклоняйте метки времени с расхождением более пяти минут и игнорируйте дубликаты доставок (сверяйте delivery_id).
Как ИИ-агент подключается через MCP?
Укажите MCP-клиенту адрес https://api.faxdev.com/mcp по Streamable HTTP с тем же bearer API-ключом, что и для REST. Список инструментов генерируется из API и фильтруется по скоупам ключа.
Можно ли протестировать без набора номера и оплаты?
Да. Ключ bfx_test_ создает тестовые факсы: они рендерятся и проверяются как реальные, затем помечаются succeeded без набора номера и списаний.
Что происходит при неудачной попытке доставки?
Вам ничего не нужно делать. Занятая линия, отсутствие ответа или сбой рукопожатия автоматически обрабатываются повторами и сменой маршрута через независимых операторов. Если основные маршруты недоступны, используется альтернативная сеть. В этом случае caller_id_delivery принимает значение not_guaranteed: страницы доставлены, но получатель может увидеть другой номер отправителя. Каждая попытка отражена в links.attempts, а недоставленные страницы не тарифицируются.