HTTP API-справка

Полный справочник по REST API Fathom. Управляйте автономными задачами, стримьте события и программно управляйте ИИ-воркерами.

Full reference for the Fathom REST API. Manage autonomous worker sessions, stream events, and operate coworkers, schedules, memory, governance and computer use programmatically.

Обзор

Fathom API — это REST-интерфейс для управления автономными задачами и сессиями воркеров. Все ответы закодированы в JSON. Стриминговые эндпоинты используют Server-Sent Events (SSE).

The Fathom API is a RESTful control plane for universal autonomous workers. It manages sessions, persistent coworkers, scheduled operations, memory, governance, computer use and notifications; research is one supported workflow. All responses are JSON-encoded. Streaming endpoints use Server-Sent Events (SSE).

Базовый URL
http://localhost:8080

API поддерживает два метода аутентификации через HTTP-заголовки:

The API supports two authentication methods via HTTP headers:

HTTP Headers
Authorization: Bearer <your-api-key>
X-Api-Key: <your-api-key>

Аутентификация

Все API-запросы (кроме /health и /metrics) требуют действительный API-ключ. Ключи настраиваются через переменную окружения FATHOM_API_KEYS списком через запятую.

When FATHOM_API_KEYS is configured, API requests under /api/v1 require a matching Bearer token or X-Api-Key header. With no keys configured, loopback deployments allow open access; binding the server to a non-loopback address requires configuring keys.

Environment
FATHOM_API_KEYS=key-abc123,key-def456,key-ghi789

Каждый ключ соответствует независимой идентичности. Rate limiting применяется по ключу: 120 запросов/минуту на клиента; публичные маршруты health, metrics и dashboard освобождены. Превышение лимитов возвращает 429 Too Many Requests.

Each key maps to an independent identity. Rate limiting is applied per-key: 120 requests/minute for standard endpoints. Exceeding limits returns 429 Too Many Requests.

⚠
Примечание по безопасности: никогда не раскрывайте API-ключи в клиентском коде или публичных репозиториях. Используйте переменные окружения или секретохранилище.

Эндпоинты

POST/api/v1/sessions

Создать новую сессию исследования. API запускает агента-координатора, который оркестрирует субагентов на основе запроса.

Тело запроса

JSONЗапрос
{
"query": "Find SaaS companies in Berlin with 10-50 employees",
"output_dir": "session-001"
}
ПараметрТипОписание
querystringПоисковый запрос или описание задачи
output_dirstringКаталог для хранения результатов (опционально)

Ответ — 202 Accepted

JSONОтвет
{
"id": "sess_a1b2c3d4",
"status": "running",
"query": "Find SaaS companies in Berlin...",
"output_dir": "./results/session-001"
}
GET/api/v1/sessions

Перечислить все сессии исследования. Возвращает массив, отсортированный по дате создания (новейшие первыми).

Ответ — 200 OK

JSONОтвет
{
"sessions": [
  {
    "id": "sess_a1b2c3d4",
    "query": "Find SaaS companies in Berlin...",
    "status": "completed",
    "output_dir": "./results/session-001",
    "total_tokens": 42000,
    "total_agents": 3,
    "created_at": "2026-08-07T10:30:00Z",
    "updated_at": "2026-08-07T10:35:00Z",
    "active": false
  },
  {
    "id": "sess_e5f6g7h8",
    "query": "Analyze competitor pricing...",
    "status": "running",
    "output_dir": "./results/session-002",
    "total_tokens": 18000,
    "total_agents": 2,
    "created_at": "2026-08-07T11:00:00Z",
    "updated_at": "2026-08-07T11:02:00Z",
    "active": true
  }
],
"count": 2
}
GET/api/v1/sessions/:id

Получить подробный статус конкретной сессии, включая всех запущенных агентов и их текущие состояния.

Параметры пути

ПараметрТипОписание
idstringИдентификатор сессии (например, sess_a1b2c3d4)

Ответ — 200 OK

JSONResponse
{
"id": "sess_a1b2c3d4",
"query": "Find SaaS companies in Berlin...",
"status": "running",
"output_dir": "./results/session-001",
"total_tokens": 42000,
"total_agents": 3,
"created_at": "2026-08-07T10:30:00Z",
"updated_at": "2026-08-07T10:31:00Z",
"active": true
}
DELETE/api/v1/sessions/:id

Отменить выполняющуюся сессию. Все активные агенты корректно завершаются.

Ответ — 200 OK

JSONОтвет
{
"id": "sess_a1b2c3d4",
"status": "cancelled"
}
POST/api/v1/sessions/:id/steer

Отправить промежуточное указание, чтобы скорректировать направление исследования, не останавливая сессию.

Тело запроса

JSONЗапрос
{
"message": "Focus only on companies with Series A funding"
}

Ответ — 202 Accepted

JSONОтвет
{
"id": "sess_a1b2c3d4",
"steered": true,
"message": "Instruction delivered to session sess_a1b2c3d4"
}
GET/api/v1/sessions/:id/results

Получить завершённые результаты исследования сессии. Возвращает 404, если сессия ещё выполняется.

Ответ — 200 OK

JSONОтвет
{
"session_id": "sess_a1b2c3d4",
"status": "completed",
"summary": "Found 3 SaaS companies in Berlin matching criteria.",
"output_dir": "./results/session-001",
"total_tokens": 42000,
"total_agents": 3,
"findings": [
  {
    "file": "./results/session-001/techcorp.md",
    "content": "TechCorp GmbH — B2B SaaS, 25 employees, Series A 2025"
  }
]
}
GET/api/v1/ws

Multiplexed bidirectional WebSocket connection for live agent streaming, control frame dispatch, and session telemetry. Supports token authentication via ?api_key= query parameter.

JavaScriptClient
const ws = new WebSocket('ws://localhost:8080/api/v1/ws?api_key=sk-fathom-...');
ws.onmessage = (event) => console.log(JSON.parse(event.data));
POST/api/v1/webhooks/inbound

Inbound webhook reactor for GitHub, Sentry, Stripe, and CRM triggers. Verified using HMAC-SHA256 via X-Fathom-Signature or X-Hub-Signature-256.

JSONRequest
{
"source": "github",
"event_type": "issues.opened",
"payload": { "issue": { "number": 42, "title": "Memory leak in agent" } }
}
GET/api/v1/openapi.json

Download the complete OpenAPI 3.1 schema defining all available endpoints, request bodies, and response structures.

GET/api/v1/sessions/:id/events

Открыть SSE-поток для событий конкретной сессии в реальном времени. Каждое событие — это JSON-объект с полями event и data.

Ответ — 200 OK (text/event-stream)

SSEПоток
data: {"type":"agent_spawned","agent_id":"agent_x1y2z3","role":"web-researcher"}

data: {"type":"finding","agent_id":"agent_x1y2z3","title":"TechCorp GmbH","confidence":0.92}

data: {"type":"session_completed","session_id":"sess_a1b2c3d4"}
GET/api/v1/events

Глобальный SSE-поток. Получает события от всех активных сессий. Полезен для дашбордов и мониторинга.

Параметры запроса

ПараметрТипОписание
typesstringТипы событий через запятую для фильтрации (опционально)
GET/api/v1/agents

Перечислить всех активных и недавно завершённых агентов по всем сессиям.

Ответ — 200 OK

JSONОтвет
{
"agents": [
  {
    "id": "agent_x1y2z3",
    "session_id": "sess_a1b2c3d4",
    "task": "Research web presence of SaaS companies",
    "status": "completed",
    "depth": 0,
    "tokens_used": 18420
  }
],
"count": 1
}
GET/api/v1/agents/:id

Получить подробный статус и метаданные конкретного агента, включая вызовы инструментов и журнал взаимодействий с LLM.

Ответ — 200 OK

JSONОтвет
{
"id": "agent_x1y2z3",
"session_id": "sess_a1b2c3d4",
"parent_id": null,
"task": "Research web presence of SaaS companies",
"role": "web-researcher",
"depth": 0,
"status": "completed",
"tokens_used": 18420,
"created_at": "2026-08-07T10:30:01Z",
"completed_at": "2026-08-07T10:30:42Z"
}
POST/api/v1/sessions/:id/answer

Answer a pending question tool call. The agent blocks until the operator responds or timeout expires.

Request Body

JSON
{"request_id": "ctrl_abc123", "text": "Focus on Series B companies"}

Response — 200 OK

JSON
{"answered": true, "request_id": "ctrl_abc123"}

Returns 410 GONE if agent stopped waiting, 404 if no such request_id.

POST/api/v1/sessions/:id/approve

Allow or deny a pending side-effect tool call (e.g. save_contacts, git_push).

Request Body

JSON
{"request_id": "ctrl_def456", "approved": true}

Response — 200 OK

JSON
{"approved": true, "request_id": "ctrl_def456"}
POST/api/v1/jobs

Submit a durable background job. Spawns a fully detached runner process.

Request Body

JSON
{"task": "Find CTOs at fintech startups in Berlin", "attempts": 3}

Response — 202 ACCEPTED

JSON
{"id": "job_abc123", "status": "queued", "task": "...", "attempts": 3, "max_attempts": 3, "output_dir": "./jobs/job_abc123", "log": "./jobs/job_abc123/run.log"}
GET/api/v1/jobs

List all jobs. Jobs with running status but dead PID are marked “stale”.

Response — 200 OK

JSON
{"jobs": [...], "count": 5}
GET/api/v1/jobs/:id

Get job status by full ID or unique prefix.

Response — 200 OK

JSON
{"id": "job_abc123", "status": "completed", "task": "...", "attempts": 1, "max_attempts": 3}
DELETE/api/v1/jobs/:id

Cancel an active job. Terminates the runner process and marks the job cancelled.

Response — 200 OK

JSON
{"id": "job_abc123", "status": "cancelled"}
GET/api/v1/jobs/:id/log

Tail the job log file.

Query Parameters

HTTP
?lines=100  (default 100, cap 2000)

Response — 200 OK

JSON
{"lines": ["...", "..."], "total_lines": 150, "returned": 100}
POST/api/v1/jobs/:id/rerun

Re-run a finished or stale job. Resets state and spawns a new runner.

Response — 202 ACCEPTED

JSON
{"id": "job_abc123", "status": "queued", ...}
GET/api/v1/memories

List memories or perform hybrid search. If ?q= is non-empty, does semantic search.

Query Parameters

HTTP
?q=CTO+fintech&scope=agent&status=active&limit=20&top_k=10

Response — 200 OK

JSON
{"query": "CTO fintech", "memories": [...]}
POST/api/v1/memories/absorb

Absorb facts through the full memory pipeline (classification, embedding, dedup, storage).

Request Body

JSON
{"facts": [{"content": "Acme Corp uses React", "confidence": 0.9}], "source": "research", "scope": "agent"}

Response — 200 OK

JSON
{"created": 1, "duplicates": 0, "superseded": 0}
GET/api/v1/memories/stats

Memory store statistics: scope counts, entity graph nodes/edges.

Response — 200 OK

JSON
{"embedding_model": "text-embedding-3-small", "scopes": {"agent": {"active": 42, "superseded": 5, "archived": 12}}, "entity_graph": {"nodes": 28, "edges": 45}}
POST/api/v1/memories/distill

Promote run-scoped facts into agent-scoped knowledge.

Query Parameters

HTTP
?session=sess_abc123&dry_run=true

Response — 200 OK

JSON
{"promoted": 8, "archived": 3}
POST/api/v1/memories/gc

Garbage-collect expired/stale facts and compact groups.

Query Parameters

HTTP
?ttl_days=30&dry_run=false

Response — 200 OK

JSON
{"stale_archived": 15, "compacted": 2, "dry_run": false}
GET/api/v1/memories/:id

Get one memory by ID with optional history following.

Query Parameters

HTTP
?follow=latest  (options: active, latest, full_history)

Response — 200 OK

JSON
{"memories": [...]}
DELETE/api/v1/memories/:id

Soft-delete a memory by setting status to “archived”.

Response — 200 OK

JSON
{"archived": "mem_abc123"}
GET/health

Эндпоинт проверки здоровья. Аутентификация не требуется. Возвращает статус сервера и версию.

Ответ — 200 OK

JSONОтвет
{
"status": "ok",
"service": "fathom",
"version": "0.3.0",
"database": "ok",
"active_sessions": 2
}

// Possible values:
// status: "ok" | "degraded"
// database: "ok" | "error"
GET/metrics

Эндпоинт метрик, совместимых с Prometheus. Аутентификация не требуется. Снимайте любым коллектором, совместимым с Prometheus.

Ответ — 200 OK (text/plain)

PrometheusМетрики
# HELP pr_sessions_total Total number of sessions
# TYPE pr_sessions_total counter
pr_sessions_total 42

# HELP pr_agents_active Currently active agents
# TYPE pr_agents_active gauge
pr_agents_active 3

# HELP pr_request_duration_seconds Request latency
# TYPE pr_request_duration_seconds histogram
pr_request_duration_seconds_bucket{le="0.1"} 120
GET/dashboard

Embedded single-file HTML dashboard. Sessions, agent tree, memory stats, jobs, and live SSE event feed. The page itself is public, while its API data requests use the configured API key when authentication is enabled.

Response — 200 OK

text/html — self-contained dashboard page. Open in a browser.

Типы SSE-событий

Server-Sent Events отправляются по постоянным HTTP-соединениям. Каждое событие имеет имя типа и JSON-закодированный payload данных.

Server-Sent Events are pushed over persistent HTTP connections. Each event is sent as a data: line with a JSON payload. Event types use snake_case in the JSON type field (e.g., session_started, agent_spawned). There is no event: field in the SSE frame.

Тип событияОписание
session_startedСрабатывает при инициализации новой сессии
agent_spawnedВ сессии создан новый агент
agent_state_changedАгент перешёл между состояниями (idle → running → completed)
findingАгент обнаружил исследовательскую находку
tool_call_startedАгент начал выполнение инструмента (веб-поиск, скрейпинг и т.п.)
tool_call_completedВыполнение инструмента завершилось с результатами
llm_stream_chunkСтриминговый токен из ответа LLM (для живого UI)
agent_completedАгент успешно завершил свою задачу
agent_failedАгент столкнулся с неисправимой ошибкой
session_completedВсе агенты завершились; результаты сессии готовы
session_failedСессия прекращена из-за критической ошибки
question_askedИнструмент question агента ждёт ответа оператора (используйте POST /answer)
approval_requestedАгент хочет вызвать инструмент с побочным эффектом, требующий одобрения (используйте POST /approve)
session_forkedСессия была форкнута из другой сессии
file_change_undoneИзменение файла откачено через undo
title_generatedЗаголовок сессии был сгенерирован автоматически

Governance, collaboration & computer relay

Current servers may expose governance decisions, coworker/channel state, AG-UI events, and computer relay controls under the same authenticated /api/v1 prefix.

RouteDescription
GET /api/v1/governance/policyRead the active governance policy.
PUT /api/v1/governance/policyReplace the governance policy.
POST /api/v1/governance/decideEvaluate a governed action.
GET /api/v1/governance/auditRead governance audit events.
GET|POST /api/v1/coworkersList or create coworker records.
GET|POST /api/v1/channelsList or create collaboration channels.
GET /api/v1/ag-ui/eventsStream AG-UI events.
GET /api/v1/computers/healthCheck the default computer relay.
POST /api/v1/computers/navigateNavigate the default computer relay.
POST /api/v1/computers/click|type|keyControl the default computer relay.

Coworkers, channels & schedules

These authenticated routes persist worker identity and recurring operations. Request bodies are validated by the server; consult the root docs/HTTP-API.md for field-level contracts.

RouteDescription
GET|POST /api/v1/coworkersList or create persistent coworker profiles.
GET|PUT|PATCH|DELETE /api/v1/coworkers/:idInspect or update a coworker. There is no separate coworker run route.
GET /api/v1/channels?coworker_id=…List channels for a coworker; the query parameter is required.
POST /api/v1/channelsCreate a channel linked to a coworker and optionally a session.
PUT|PATCH|DELETE /api/v1/channels/:idUpdate or delete a channel.
GET|POST /api/v1/schedulesList or create cron-like schedules with a coworker, query, timezone and enabled flag.
GET|PUT|PATCH|DELETE /api/v1/schedules/:idInspect, update or delete a schedule.
POST /api/v1/schedules/claimAtomically claim due schedules for a bounded scheduler tick.

Credentials vault

Credentials are encrypted at rest with the key configured by FATHOM_CREDENTIAL_KEY. Plaintext secrets are accepted only when storing and are never returned by list or create responses.

RouteDescription
GET /api/v1/credentialsList metadata: id, name, kind and timestamps.
POST /api/v1/credentialsStore a credential with the fields name, kind and secret.
DELETE /api/v1/credentials/:idDelete a stored credential; secrets cannot be retrieved through the API.

Replay, observability & notifications

RouteDescription
GET /api/v1/replayList redacted governed actions; optional session, agent and bounded limit filters.
GET /api/v1/observability/summaryRead live counters and bounded governance audit counts.
POST /api/v1/notifications/testTest one configured symbolic channel: webhook, email or telegram. The request accepts only a channel field.

Computer-use relay

Computer routes proxy to the configured service (default loopback URL via FATHOM_COMPUTER_SERVICE_URL). Browser actions use POST routes such as /computers/navigate, while health, snapshots, screenshots and tabs use GET; supervised agent routes additionally require COMPUTER_TOKEN.

RouteDescription
POST /api/v1/computers/sessionStart or refresh a computer session.
GET /api/v1/computers/health|snapshot|screenshot|tabsInspect computer health, accessibility snapshot, screenshot or open tabs.
POST /api/v1/computers/navigate|click|type|key|secretPerform browser actions; secret avoids returning or logging the value.
POST /api/v1/computers/control/take|releaseHand control to or from an operator.
GET|DELETE /api/v1/computers/filesList or delete files in the confined workspace.
GET /api/v1/computers/files/read · PUT /api/v1/computers/files/writeRead or write a confined workspace file; DELETE /api/v1/computers/files removes one.
GET|POST /api/v1/computers/:agent_id/…Agent-scoped relay routes are available when a supervised computer is configured with COMPUTER_TOKEN.

CLI-команды

CLI fathom предоставляет инструменты локальной разработки и эксплуатации. Соберите репозиторий Fathom через cargo build --release или установите локально командой cargo install --path ..

The fathom CLI provides local development and operational tools. Available on servers provisioned for you — request access at [email protected].

КомандаОписание
fathom runВыполнить разовый исследовательский запрос и вывести результаты в stdout
fathom tuiЗапустить интерактивный терминальный интерфейс для мониторинга сессий
fathom serveЗапустить HTTP API-сервер (этот API)
fathom contactsУправлять списками контактов для аутрич-кампаний
fathom resumeВозобновить ранее прерванную сессию с точки сохранения
fathom configПросмотр и управление конфигурацией (API-ключи, настройки модели и т.п.)
fathom memorySearch and maintain semantic memory
fathom sessionsBrowse stored sessions
fathom profilesList, show, or create profiles
fathom jobsSubmit and manage background jobs
fathom benchBenchmark tool execution without network or LLM calls
fathom statsShow tool-call statistics for a recorded session

Коды ошибок

Все ответы об ошибках следуют единому JSON-формату с машиночитаемым code и человекочитаемым message.

All error responses follow a consistent JSON format with a human-readable error string.

JSONФормат ошибки
{
"error": "Invalid or missing API key"
}
СтатусКодОписание
400bad_requestInvalid or missing required parameters
401unauthorizedОтсутствует или недействителен API-ключ в заголовках запроса
404not_foundЗапрашиваемый ресурс (сессия, агент) не существует
429rate_limitedСлишком много запросов — повторите после заголовка Retry-After
500internal_errorНепредвиденная ошибка сервера — подробности в логах
503service_unavailableLLM API key not configured or memory subsystem disabled
409conflictРесурс в состоянии, не позволяющем операцию (напр. сессия не запущена)
410goneАгент перестал ждать ответа (таймаут одобрения/вопроса)