Implemented API reference
Release 0.3. This inventory is generated from server route declarations. It describes 365 implemented method/path declarations, not the larger production target. The report format parameter accepts preview or download. Unknown API routes return a structured 404 from the running server.
Transport and authentication
The browser and API share one origin (localhost or the production Vercel URL). API sessions use the HttpOnly dg_session cookie. Sign-in/register/enrollment return a session-bound CSRF token; authenticated changes require X-CSRF-Token. Commands also require a unique Idempotency-Key of at most 128 characters. Reusing a key with identical actor/path/content returns the saved result; changed content conflicts. Invitation bearer URLs are redacted from saved receipts.
Authentication and invitation entry points have a production-default limit of 40 requests per 15 minutes per IP. Hosted limits use a PostgreSQL counter shared by function instances; local limits are per process. Provider-key settings share this limiter. Business routes enforce the server actor and tenant context; no request may select a different tenant or role. Advisor routes manage companies within that tenant. Participant routes and assets enforce the assigned person/company/request.
Use expectedVersion for record edits/actions and case progress. Reports/framework saves and graph rebuild use expectedRevision for the company snapshot. Review current data after a 409; do not blindly retry old content with a new key.
Implemented routes
| Method | Path | Runtime definition |
|---|---|---|
| GET | /api/account-links/{token} | server/account-public.ts |
| POST | /api/account-links/{token}/consent | server/client-entry.ts |
| POST | /api/account-links/{token}/decline | server/client-entry.ts |
| POST | /api/account-links/{token}/interest | server/account-public.ts |
| POST | /api/account-links/{token}/new-link | server/client-entry.ts |
| POST | /api/account-links/{token}/setup | server/account-public.ts |
| GET | /api/account-links/{token}/state | server/client-entry.ts |
| POST | /api/account-links/{token}/stop | server/account-public.ts |
| POST | /api/account-links/{token}/validation | server/account-public.ts |
| POST | /api/account-links/{token}/viewed | server/account-public.ts |
| POST | /api/auth/demo | server/app.ts |
| POST | /api/auth/login | server/app.ts |
| POST | /api/auth/logout | server/app.ts |
| GET | /api/auth/me | server/app.ts |
| GET | /api/auth/options | server/app.ts |
| POST | /api/auth/register | server/app.ts |
| GET | /api/client-status/{token} | server/client-status.ts |
| POST | /api/client-status/{token}/viewed | server/client-status.ts |
| GET | /api/client/v1/results | server/client-access.ts |
| GET | /api/client/v1/results/{reportId} | server/client-access.ts |
| POST | /api/client/v1/results/{reportId}/acknowledge | server/client-access.ts |
| POST | /api/client/v1/session | server/client-access.ts |
| POST | /api/client/v1/sign-out | server/client-access.ts |
| GET | /api/health | server/app.ts |
| GET | /api/invitations/{token} | server/app.ts |
| GET | /api/invitations/{token}/check | server/task-check-link.ts |
| POST | /api/invitations/{token}/check | server/task-check-link.ts |
| POST | /api/invitations/{token}/enroll | server/app.ts |
| GET | /api/invitations/{token}/executive | server/kickoff-meeting.ts |
| POST | /api/invitations/{token}/executive | server/kickoff-meeting.ts |
| GET | /api/invitations/{token}/kickoff | server/kickoff-link.ts |
| POST | /api/invitations/{token}/kickoff | server/kickoff-link.ts |
| POST | /api/invitations/{token}/kickoff/delegate | server/kickoff-link-extras.ts |
| POST | /api/invitations/{token}/kickoff/documents | server/kickoff-link-extras.ts |
| DELETE | /api/invitations/{token}/kickoff/documents/{documentId} | server/kickoff-link-extras.ts |
| GET | /api/invitations/{token}/kickoff/draft | server/kickoff-link-extras.ts |
| PUT | /api/invitations/{token}/kickoff/draft | server/kickoff-link-extras.ts |
| POST | /api/invitations/{token}/kickoff/understand | server/kickoff-link.ts |
| GET | /api/invitations/{token}/roster-delegate | server/kickoff-link-extras.ts |
| PUT | /api/invitations/{token}/roster-delegate | server/kickoff-link-extras.ts |
| POST | /api/invitations/{token}/roster-mapping-suggestions | server/jev-routes.ts |
| GET | /api/invitations/{token}/team | server/team-link.ts |
| POST | /api/invitations/{token}/team | server/team-link.ts |
| POST | /api/invitations/{token}/team/coverage | server/team-link.ts |
| POST | /api/invitations/{token}/team/live-transcription | server/team-link.ts |
| POST | /api/invitations/{token}/team/transcribe | server/team-link.ts |
| POST | /api/invitations/{token}/team/understand | server/team-link.ts |
| POST | /api/invitations/{token}/transcribe | server/kickoff-link.ts |
| GET | /api/maintenance | server/app.ts |
| POST | /api/mcp | server/mcp.ts |
| POST | /api/mcp/agent | server/mcp.ts |
| POST | /api/mobile/v1/enroll | server/mobile-participant.ts |
| GET | /api/mobile/v1/me | server/mobile-participant.ts |
| PATCH | /api/mobile/v1/me/preferences | server/mobile-participant.ts |
| PUT | /api/mobile/v1/me/push-token | server/mobile-participant.ts |
| GET | /api/mobile/v1/requests | server/mobile-participant.ts |
| GET | /api/mobile/v1/requests/{requestId} | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/coverage | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/submit | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/transcription-stream-ticket | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/transcriptions | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/understand | server/mobile-participant.ts |
| POST | /api/mobile/v1/requests/{requestId}/understanding | server/mobile-participant.ts |
| POST | /api/mobile/v1/session/logout | server/mobile-participant.ts |
| POST | /api/mobile/v1/session/refresh | server/mobile-participant.ts |
| GET | /api/mobile/v1/task-cards | server/mobile-participant.ts |
| GET | /api/mobile/v1/task-cards/{taskCardId} | server/mobile-participant.ts |
| POST | /api/mobile/v1/task-cards/{taskCardId}/attest | server/mobile-participant.ts |
| POST | /api/mobile/v1/updates | server/mobile-participant.ts |
| POST | /api/newsletter-interest | server/app.ts |
| GET | /api/payments/return | server/billing/routes.ts |
| POST | /api/payments/simulated/{objectId}/complete | server/billing/routes.ts |
| POST | /api/pilot-applications | server/app.ts |
| GET | /api/proposals/{token} | server/billing/routes.ts |
| POST | /api/proposals/{token}/accept | server/billing/routes.ts |
| POST | /api/proposals/{token}/viewed | server/billing/routes.ts |
| GET | /api/report-links/{token} | server/report-delivery.ts |
| POST | /api/report-links/{token}/acknowledge | server/report-delivery.ts |
| POST | /api/report-links/{token}/viewed | server/report-delivery.ts |
| GET | /api/v1/accounts | server/accounts.ts |
| POST | /api/v1/accounts | server/accounts.ts |
| GET | /api/v1/accounts/{accountId} | server/accounts.ts |
| PATCH | /api/v1/accounts/{accountId} | server/accounts.ts |
| GET | /api/v1/accounts/{accountId}/client-access | server/client-access.ts |
| POST | /api/v1/accounts/{accountId}/client-access | server/client-access.ts |
| POST | /api/v1/accounts/{accountId}/client-access/{grantId}/revoke | server/client-access.ts |
| GET | /api/v1/accounts/{accountId}/client-status | server/client-status.ts |
| POST | /api/v1/accounts/{accountId}/client-status-link | server/client-status.ts |
| POST | /api/v1/accounts/{accountId}/commands | server/accounts.ts |
| GET | /api/v1/accounts/{accountId}/commerce | server/billing/routes.ts |
| POST | /api/v1/accounts/{accountId}/contacts | server/accounts.ts |
| PATCH | /api/v1/accounts/{accountId}/contacts/{contactId} | server/accounts.ts |
| POST | /api/v1/accounts/{accountId}/contacts/{contactId}/suppress | server/outreach.ts |
| GET | /api/v1/accounts/{accountId}/discovery-readiness | server/lifecycle.ts |
| POST | /api/v1/accounts/{accountId}/discovery-sufficient | server/lifecycle.ts |
| POST | /api/v1/accounts/{accountId}/engagement/activate | server/accounts.ts |
| POST | /api/v1/accounts/{accountId}/engagement/approvals | server/billing/routes.ts |
| POST | /api/v1/accounts/{accountId}/engagement/approvals/{approvalId}/decision | server/billing/routes.ts |
| POST | /api/v1/accounts/{accountId}/engagement/approvals/{approvalId}/withdraw | server/billing/routes.ts |
| POST | /api/v1/accounts/{accountId}/engagement/complete | server/engagement-next.ts |
| POST | /api/v1/accounts/{accountId}/engagement/renew | server/engagement-next.ts |
| POST | /api/v1/accounts/{accountId}/engagements | server/engagement-next.ts |
| POST | /api/v1/accounts/{accountId}/kickoff-request | server/kickoff-request.ts |
| GET | /api/v1/accounts/{accountId}/kickoff-request/template | server/kickoff-request.ts |
| POST | /api/v1/accounts/{accountId}/link-corrections/{correctionId}/review | server/prospect-review.ts |
| POST | /api/v1/accounts/{accountId}/link-corrections/accept-confirmations | server/prospect-review.ts |
| GET | /api/v1/accounts/{accountId}/link-review | server/prospect-review.ts |
| POST | /api/v1/accounts/{accountId}/links/{linkId}/revoke | server/outreach.ts |
| GET | /api/v1/accounts/{accountId}/living | server/living.ts |
| POST | /api/v1/accounts/{accountId}/living/items/{itemId}/decide | server/living.ts |
| GET | /api/v1/accounts/{accountId}/living/items/{itemId}/preview | server/living.ts |
| POST | /api/v1/accounts/{accountId}/offers | server/billing/routes.ts |
| POST | /api/v1/accounts/{accountId}/offers/{offerId}/withdraw | server/billing/routes.ts |
| GET | /api/v1/accounts/{accountId}/outreach | server/outreach.ts |
| PUT | /api/v1/accounts/{accountId}/outreach/{kind} | server/outreach.ts |
| POST | /api/v1/accounts/{accountId}/outreach/{kind}/draft | server/outreach.ts |
| POST | /api/v1/accounts/{accountId}/outreach/{kind}/preview | server/outreach.ts |
| POST | /api/v1/accounts/{accountId}/outreach/{kind}/send | server/outreach.ts |
| POST | /api/v1/accounts/{accountId}/outreach/{kind}/test-send | server/outreach.ts |
| GET | /api/v1/accounts/{accountId}/outreach/sponsor_validation_request/review-shape | server/outreach.ts |
| PUT | /api/v1/accounts/{accountId}/outreach/sponsor_validation_request/review-shape | server/outreach.ts |
| POST | /api/v1/accounts/{accountId}/research-authorizations | server/accounts.ts |
| GET | /api/v1/accounts/{accountId}/research-budgets | server/research-budgets.ts |
| POST | /api/v1/accounts/{accountId}/sponsor/accept | server/prospect-review.ts |
| GET | /api/v1/accounts/{accountId}/timeline | server/account-timeline.ts |
| GET | /api/v1/accounts/activation-options | server/accounts.ts |
| PUT | /api/v1/billing/price-book | server/billing/routes.ts |
| GET | /api/v1/billing/settings | server/billing/routes.ts |
| PUT | /api/v1/billing/settings | server/billing/routes.ts |
| GET | /api/v1/companies | server/app.ts |
| POST | /api/v1/companies | server/app.ts |
| PATCH | /api/v1/companies/{companyId} | server/app.ts |
| GET | /api/v1/companies/{companyId}/account | server/accounts.ts |
| GET | /api/v1/companies/{companyId}/agent-requests | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/ai-draft | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/issue | server/agent-requests.ts |
| GET | /api/v1/companies/{companyId}/agent-requests/{requestId}/manifest | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/manifest | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/review | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/simulate | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/{requestId}/withdraw | server/agent-requests.ts |
| POST | /api/v1/companies/{companyId}/agent-requests/demo | server/agent-requests.ts |
| GET | /api/v1/companies/{companyId}/agents | server/agents.ts |
| POST | /api/v1/companies/{companyId}/agents/access | server/agents.ts |
| POST | /api/v1/companies/{companyId}/agents/access/ask | server/agents.ts |
| GET | /api/v1/companies/{companyId}/agents/build/{key} | server/agents.ts |
| GET | /api/v1/companies/{companyId}/agents/manifests | server/agents.ts |
| GET | /api/v1/companies/{companyId}/agents/manifests/{id} | server/agents.ts |
| GET | /api/v1/companies/{companyId}/agents/manifests/{id}/export | server/agents.ts |
| POST | /api/v1/companies/{companyId}/agents/save | server/agents.ts |
| GET | /api/v1/companies/{companyId}/ai | server/ai.ts |
| POST | /api/v1/companies/{companyId}/ai | server/ai.ts |
| POST | /api/v1/companies/{companyId}/assets | server/assets.ts |
| PUT | /api/v1/companies/{companyId}/assets/{assetId}/chunks/{index} | server/assets.ts |
| GET | /api/v1/companies/{companyId}/assets/{assetId}/content | server/assets.ts |
| POST | /api/v1/companies/{companyId}/assets/{assetId}/finalize | server/assets.ts |
| GET | /api/v1/companies/{companyId}/assets/{assetId}/status | server/assets.ts |
| POST | /api/v1/companies/{companyId}/assets/{assetId}/transcribe | server/transcription.ts |
| GET | /api/v1/companies/{companyId}/assets/{assetId}/transcription | server/transcription.ts |
| POST | /api/v1/companies/{companyId}/assets/{assetId}/transcription-review | server/transcription.ts |
| GET | /api/v1/companies/{companyId}/audit-brief | server/audit-brief.ts |
| POST | /api/v1/companies/{companyId}/audit-brief/prepare | server/audit-brief.ts |
| GET | /api/v1/companies/{companyId}/business-classification | server/business-classification.ts |
| POST | /api/v1/companies/{companyId}/business-classification | server/business-classification.ts |
| GET | /api/v1/companies/{companyId}/business-classification/{jobId} | server/business-classification.ts |
| PUT | /api/v1/companies/{companyId}/business-classification/review | server/business-classification.ts |
| PUT | /api/v1/companies/{companyId}/business-profile | server/app.ts |
| GET | /api/v1/companies/{companyId}/claims | server/claims.ts |
| GET | /api/v1/companies/{companyId}/claims/{claimId} | server/claims.ts |
| POST | /api/v1/companies/{companyId}/claims/verifications | server/claims.ts |
| GET | /api/v1/companies/{companyId}/cobalt-loop | server/cobalt-loop.ts |
| POST | /api/v1/companies/{companyId}/cobalt-loop | server/cobalt-loop.ts |
| POST | /api/v1/companies/{companyId}/copilot | server/copilot/routes.ts |
| GET | /api/v1/companies/{companyId}/copilot/chain | server/copilot/routes.ts |
| GET | /api/v1/companies/{companyId}/copilot/notes | server/copilot/routes.ts |
| POST | /api/v1/companies/{companyId}/copilot/notes | server/copilot/routes.ts |
| GET | /api/v1/companies/{companyId}/discovery | server/discovery.ts |
| POST | /api/v1/companies/{companyId}/discovery/{jobId}/apply | server/discovery.ts |
| POST | /api/v1/companies/{companyId}/discovery/draft | server/discovery.ts |
| POST | /api/v1/companies/{companyId}/discovery/meeting | server/discovery.ts |
| GET | /api/v1/companies/{companyId}/engagement-preset | server/engagement-record.ts |
| POST | /api/v1/companies/{companyId}/exports | server/app.ts |
| GET | /api/v1/companies/{companyId}/exports/{recordId}/download | server/app.ts |
| POST | /api/v1/companies/{companyId}/frameworks/{key}/manual | server/app.ts |
| GET | /api/v1/companies/{companyId}/governance | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/agents/{id}/check | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/agents/{id}/end-event | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/agents/{id}/revoke | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/audit/sample | server/governance.ts |
| GET | /api/v1/companies/{companyId}/governance/evidence | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/ledger/verify | server/governance.ts |
| GET | /api/v1/companies/{companyId}/governance/people/{personId} | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests/{id}/clarify | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests/{id}/decide | server/governance.ts |
| GET | /api/v1/companies/{companyId}/governance/requests/{id}/export | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests/{id}/issue | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests/{id}/submit | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/requests/preview | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/suggestions/{id}/assign | server/governance.ts |
| POST | /api/v1/companies/{companyId}/governance/suggestions/{id}/dismiss | server/governance.ts |
| GET | /api/v1/companies/{companyId}/governance/trace/{id} | server/governance.ts |
| GET | /api/v1/companies/{companyId}/graph | server/app.ts |
| POST | /api/v1/companies/{companyId}/graph/rebuild | server/app.ts |
| GET | /api/v1/companies/{companyId}/kickoff-documents | server/kickoff-structured.ts |
| GET | /api/v1/companies/{companyId}/kickoff-documents/{documentId}/download | server/kickoff-structured.ts |
| POST | /api/v1/companies/{companyId}/kickoff-request | server/kickoff-request.ts |
| GET | /api/v1/companies/{companyId}/kickoff-request/template | server/kickoff-request.ts |
| GET | /api/v1/companies/{companyId}/kickoff/agenda-approval | server/discovery-journey.ts |
| POST | /api/v1/companies/{companyId}/kickoff/agenda-approval | server/discovery-journey.ts |
| POST | /api/v1/companies/{companyId}/kickoff/meetings | server/kickoff-meeting.ts |
| GET | /api/v1/companies/{companyId}/kickoff/meetings/{meetingId}/calendar.ics | server/kickoff-meeting.ts |
| POST | /api/v1/companies/{companyId}/kickoff/notes | server/kickoff-meeting.ts |
| GET | /api/v1/companies/{companyId}/kickoff/participants | server/kickoff-meeting.ts |
| GET | /api/v1/companies/{companyId}/kickoff/plan | server/kickoff-meeting.ts |
| GET | /api/v1/companies/{companyId}/kickoff/proposals | server/kickoff-meeting.ts |
| POST | /api/v1/companies/{companyId}/kickoff/proposals/{proposalId}/decision | server/kickoff-meeting.ts |
| DELETE | /api/v1/companies/{companyId}/neo4j | server/neo4j.ts |
| GET | /api/v1/companies/{companyId}/neo4j | server/neo4j.ts |
| PUT | /api/v1/companies/{companyId}/neo4j | server/neo4j.ts |
| POST | /api/v1/companies/{companyId}/neo4j/rebuild | server/neo4j.ts |
| POST | /api/v1/companies/{companyId}/neo4j/test | server/neo4j.ts |
| GET | /api/v1/companies/{companyId}/opportunities | server/opportunities.ts |
| GET | /api/v1/companies/{companyId}/participant-phones | server/participant-phones.ts |
| POST | /api/v1/companies/{companyId}/participant-phones/{deviceId}/revoke | server/participant-phones.ts |
| POST | /api/v1/companies/{companyId}/people/merge | server/people-merge.ts |
| GET | /api/v1/companies/{companyId}/providers | server/providers.ts |
| DELETE | /api/v1/companies/{companyId}/providers/{provider} | server/providers.ts |
| PUT | /api/v1/companies/{companyId}/providers/{provider} | server/providers.ts |
| POST | /api/v1/companies/{companyId}/providers/{provider}/test | server/providers.ts |
| POST | /api/v1/companies/{companyId}/records | server/app.ts |
| PATCH | /api/v1/companies/{companyId}/records/{recordId} | server/app.ts |
| POST | /api/v1/companies/{companyId}/records/{recordId}/actions | server/app.ts |
| GET | /api/v1/companies/{companyId}/records/{recordId}/history | server/app.ts |
| GET | /api/v1/companies/{companyId}/repo | server/company-repo.ts |
| GET | /api/v1/companies/{companyId}/repo/download | server/company-repo.ts |
| GET | /api/v1/companies/{companyId}/repo/files/{path} | server/company-repo.ts |
| GET | /api/v1/companies/{companyId}/report-status | server/report-delivery.ts |
| POST | /api/v1/companies/{companyId}/reports | server/reports.ts |
| GET | /api/v1/companies/{companyId}/reports/{reportId}/{format} | server/reports.ts |
| GET | /api/v1/companies/{companyId}/reports/{reportId}/deliveries | server/report-delivery.ts |
| POST | /api/v1/companies/{companyId}/reports/{reportId}/deliveries | server/report-delivery.ts |
| POST | /api/v1/companies/{companyId}/reports/{reportId}/deliveries/{deliveryId}/revoke | server/report-delivery.ts |
| POST | /api/v1/companies/{companyId}/reports/{reportId}/review | server/reports.ts |
| GET | /api/v1/companies/{companyId}/reports/build | server/report-builds.ts |
| GET | /api/v1/companies/{companyId}/reports/build/{type} | server/report-builds.ts |
| GET | /api/v1/companies/{companyId}/reports/build/{type}/html | server/report-builds.ts |
| GET | /api/v1/companies/{companyId}/reports/build/{type}/markdown | server/report-builds.ts |
| POST | /api/v1/companies/{companyId}/reports/build/{type}/save | server/report-builds.ts |
| POST | /api/v1/companies/{companyId}/requests/{recordId}/email | server/invitations.ts |
| GET | /api/v1/companies/{companyId}/requests/{recordId}/email-preview | server/invitations.ts |
| GET | /api/v1/companies/{companyId}/requests/{recordId}/emails | server/invitations.ts |
| POST | /api/v1/companies/{companyId}/requests/{recordId}/issue | server/app.ts |
| GET | /api/v1/companies/{companyId}/requests/{recordId}/kickoff-preview | server/app.ts |
| POST | /api/v1/companies/{companyId}/requests/{recordId}/kickoff-questions | server/app.ts |
| GET | /api/v1/companies/{companyId}/research | server/research.ts |
| POST | /api/v1/companies/{companyId}/research | server/research.ts |
| GET | /api/v1/companies/{companyId}/research-refresh | server/research-engine/routes.ts |
| PUT | /api/v1/companies/{companyId}/research-refresh | server/research-engine/routes.ts |
| GET | /api/v1/companies/{companyId}/research-runs | server/research-engine/routes.ts |
| POST | /api/v1/companies/{companyId}/research-runs | server/research-engine/routes.ts |
| GET | /api/v1/companies/{companyId}/research-runs/{runId} | server/research-engine/routes.ts |
| POST | /api/v1/companies/{companyId}/research-runs/{runId}/cancel | server/research-engine/routes.ts |
| POST | /api/v1/companies/{companyId}/research-runs/{runId}/resume | server/research-engine/routes.ts |
| POST | /api/v1/companies/{companyId}/research-runs/import-legacy | server/research-engine/routes.ts |
| POST | /api/v1/companies/{companyId}/research/{runId}/sources/{index}/import | server/research.ts |
| POST | /api/v1/companies/{companyId}/responses/{recordId}/kickoff-corrections/generate | server/app.ts |
| POST | /api/v1/companies/{companyId}/responses/{recordId}/kickoff-corrections/review | server/app.ts |
| POST | /api/v1/companies/{companyId}/responses/{recordId}/kickoff-roster | server/app.ts |
| GET | /api/v1/companies/{companyId}/responses/{recordId}/kickoff-roster/preview | server/kickoff-meeting.ts |
| GET | /api/v1/companies/{companyId}/responses/{responseId}/kickoff-structured | server/kickoff-structured.ts |
| POST | /api/v1/companies/{companyId}/responses/{responseId}/kickoff-structured/accept-confirmations | server/kickoff-structured.ts |
| POST | /api/v1/companies/{companyId}/responses/{responseId}/kickoff-structured/decisions | server/kickoff-structured.ts |
| POST | /api/v1/companies/{companyId}/roster/apply | server/app.ts |
| POST | /api/v1/companies/{companyId}/roster/preview | server/app.ts |
| GET | /api/v1/companies/{companyId}/route | server/route.ts |
| GET | /api/v1/companies/{companyId}/route/{candidateId} | server/route.ts |
| POST | /api/v1/companies/{companyId}/route/{candidateId}/accept | server/route.ts |
| POST | /api/v1/companies/{companyId}/route/{candidateId}/ask | server/route.ts |
| POST | /api/v1/companies/{companyId}/route/{candidateId}/baseline | server/route.ts |
| GET | /api/v1/companies/{companyId}/route/{candidateId}/work-order | server/route.ts |
| GET | /api/v1/companies/{companyId}/route/patterns | server/route.ts |
| POST | /api/v1/companies/{companyId}/route/patterns/refresh | server/route.ts |
| POST | /api/v1/companies/{companyId}/runtime/preflight | server/app.ts |
| POST | /api/v1/companies/{companyId}/sample-upgrade | server/app.ts |
| GET | /api/v1/companies/{companyId}/strategy/constraints | server/strategy-constraints.ts |
| POST | /api/v1/companies/{companyId}/strategy/constraints/accept | server/strategy-constraints.ts |
| POST | /api/v1/companies/{companyId}/strategy/constraints/ask | server/strategy-constraints.ts |
| POST | /api/v1/companies/{companyId}/strategy/constraints/reject | server/strategy-constraints.ts |
| POST | /api/v1/companies/{companyId}/strategy/constraints/run | server/strategy-constraints.ts |
| GET | /api/v1/companies/{companyId}/strategy/frameworks | server/strategy-frameworks.ts |
| GET | /api/v1/companies/{companyId}/strategy/frameworks/{key} | server/strategy-frameworks.ts |
| POST | /api/v1/companies/{companyId}/strategy/frameworks/{key}/review | server/strategy-frameworks.ts |
| POST | /api/v1/companies/{companyId}/strategy/frameworks/{key}/run | server/strategy-frameworks.ts |
| GET | /api/v1/companies/{companyId}/team-analysis | server/team-analysis.ts |
| POST | /api/v1/companies/{companyId}/team-analysis | server/team-analysis.ts |
| POST | /api/v1/companies/{companyId}/team-analysis/{runId}/review | server/team-analysis.ts |
| GET | /api/v1/companies/{companyId}/team-analysis/{runId}/sources | server/team-analysis.ts |
| GET | /api/v1/companies/{companyId}/team-delivery | server/team-delivery.ts |
| POST | /api/v1/companies/{companyId}/team-delivery/{requestId}/remind | server/team-delivery.ts |
| GET | /api/v1/companies/{companyId}/voice-interviews | server/voice-interviews.ts |
| POST | /api/v1/companies/{companyId}/voice-interviews | server/voice-interviews.ts |
| GET | /api/v1/companies/{companyId}/voice-interviews/{id} | server/voice-interviews.ts |
| POST | /api/v1/companies/{companyId}/voice-interviews/{id}/{action} | server/voice-interviews.ts |
| GET | /api/v1/companies/{companyId}/work-gaps | server/work-gaps.ts |
| POST | /api/v1/companies/{companyId}/work-gaps/policy | server/work-gaps.ts |
| POST | /api/v1/companies/{companyId}/work-gaps/run | server/work-gaps.ts |
| GET | /api/v1/companies/{companyId}/work-links | server/work-links.ts |
| POST | /api/v1/companies/{companyId}/work-links | server/work-links.ts |
| POST | /api/v1/companies/{companyId}/work-map-quick/duties-from-tasks | server/work-map-quick.ts |
| POST | /api/v1/companies/{companyId}/work-map-quick/handoffs | server/work-map-quick.ts |
| POST | /api/v1/companies/{companyId}/workflows/{workflowId}/cases | server/workflows.ts |
| POST | /api/v1/companies/{companyId}/workflows/cases/{caseId}/actions | server/workflows.ts |
| GET | /api/v1/companies/{companyId}/workspace | server/app.ts |
| GET | /api/v1/inbox | server/inbox.ts |
| POST | /api/v1/inbox/dismissals | server/inbox.ts |
| GET | /api/v1/jev/settings | server/jev-routes.ts |
| PUT | /api/v1/jev/settings | server/jev-routes.ts |
| GET | /api/v1/mcp-tokens | server/mcp-tokens.ts |
| POST | /api/v1/mcp-tokens | server/mcp-tokens.ts |
| POST | /api/v1/mcp-tokens/{tokenId}/revoke | server/mcp-tokens.ts |
| GET | /api/v1/notifications | server/advisor-notifications.ts |
| POST | /api/v1/notifications/{id}/resend | server/advisor-notifications.ts |
| GET | /api/v1/notifications/push | server/advisor-notifications.ts |
| DELETE | /api/v1/notifications/push/subscriptions | server/advisor-notifications.ts |
| POST | /api/v1/notifications/push/subscriptions | server/advisor-notifications.ts |
| DELETE | /api/v1/notifications/push/subscriptions/{id} | server/advisor-notifications.ts |
| POST | /api/v1/notifications/push/test | server/advisor-notifications.ts |
| POST | /api/v1/notifications/seen | server/advisor-notifications.ts |
| GET | /api/v1/outreach/sender-identity | server/outreach.ts |
| PUT | /api/v1/outreach/sender-identity | server/outreach.ts |
| GET | /api/v1/participant/requests | server/app.ts |
| POST | /api/v1/participant/requests/{recordId}/submit | server/app.ts |
| POST | /api/v1/participant/requests/{recordId}/task-draft | server/app.ts |
| GET | /api/v1/pilot-inbox | server/pilot-inbox.ts |
| DELETE | /api/v1/pilot-inbox/{id} | server/pilot-inbox.ts |
| PATCH | /api/v1/pilot-inbox/{id} | server/pilot-inbox.ts |
| POST | /api/v1/pilot-inbox/{id}/assign | server/pilot-inbox.ts |
| POST | /api/v1/pilot-inbox/{id}/close | server/pilot-inbox.ts |
| POST | /api/v1/pilot-inbox/{id}/open | server/pilot-inbox.ts |
| POST | /api/v1/pilot-inbox/{id}/reopen | server/pilot-inbox.ts |
| POST | /api/v1/pilot-inbox/referral-code | server/pilot-inbox.ts |
| GET | /api/v1/pilot-inbox/status | server/pilot-inbox.ts |
| POST | /api/v1/sample-company | server/app.ts |
| GET | /api/v1/shared/companies | server/company-members.ts |
| GET | /api/v1/shared/companies/{companyId}/dashboard | server/company-members.ts |
| PATCH | /api/v1/shared/companies/{companyId}/dashboard | server/company-members.ts |
| GET | /api/v1/shared/companies/{companyId}/deliveries | server/company-members.ts |
| POST | /api/v1/shared/companies/{companyId}/deliveries/{deliveryId}/dispatch | server/company-members.ts |
| GET | /api/v1/shared/companies/{companyId}/members | server/company-members.ts |
| DELETE | /api/v1/shared/companies/{companyId}/members/{userId} | server/company-members.ts |
| PATCH | /api/v1/shared/companies/{companyId}/members/{userId} | server/company-members.ts |
| POST | /api/v1/shared/companies/{companyId}/members/invitations | server/company-members.ts |
| DELETE | /api/v1/shared/companies/{companyId}/members/invitations/{invitationId} | server/company-members.ts |
| PATCH | /api/v1/shared/companies/{companyId}/members/invitations/{invitationId} | server/company-members.ts |
| POST | /api/v1/shared/companies/{companyId}/members/invitations/{invitationId}/resend | server/company-members.ts |
| POST | /api/v1/shared/invitations/accept | server/company-members.ts |
| GET | /api/voice-interviews/{token} | server/voice-interviews.ts |
| POST | /api/voice-interviews/{token}/checkpoint | server/voice-interviews.ts |
| POST | /api/voice-interviews/{token}/session | server/voice-interviews.ts |
| POST | /api/voice-interviews/{token}/submit | server/voice-interviews.ts |
| POST | /api/voice-interviews/{token}/typed | server/voice-interviews.ts |
| POST | /api/webhooks/stripe | server/billing/webhook.ts |
| GET | /pay/simulated/{objectId} | server/billing/routes.ts |
Record payloads
POST records accepts a closed object with kind and data. PATCH records/{recordId} accepts data and expectedVersion; the existing record determines kind. The generated OpenAPI file contains a kind-discriminated creation union and runtime Zod input schemas. FIELD-REFERENCE lists the human-readable field limits. Server-generated snapshots, hashes, workflow checkpoints, review flags and authority states cannot be inserted through generic input. Original evidence and requests cannot be edited.
The route inventory is complete for the current declarations, but full response/error schemas and every non-record request body are not yet expressed in OpenAPI. Use the executable API tests and source validators for those exact payloads. This limitation remains in the production contract backlog.
Main command flows
- Evidence: create a source, inspect it, then record accept; retract requires a reason and invalidates dependent current records.
- Confirmation: review a task, create a request with task IDs, issue a private link, enroll the participant, submit decisions, inspect and accept the returned response. Confirmation binds to the request snapshot, never a client-supplied task hash.
- Report: create with audience/purpose/narrative/recordIds/expectedRevision; review with expectedVersion/contentHash/decision/note; download only when approved and bindings remain current.
- Workflow: create a definition with taskIds/handoffIds/joinPolicy/timeoutHours/maxAttempts; review it; start a case; record step actions with expectedVersion, stepId, action, note and routeIds.
- Asset: create a scoped upload, query status, PUT numbered base64/checksummed chunks, finalize the whole checksum, and read only within scope before expiry. The asset router enforces 25 MB and supported audio MIME types.
- Agents (shared/agents/contracts.ts AGENTS_API): GET agents lists the proposals, Not proposed and the saved manifests with their freshness; GET agents/build/{key} takes a proposal key or a saved manifest id. POST agents/save takes key, manifestId, expectedVersion and the advisor's edits; a stale version is 409 VERSION_CONFLICT and a loosening is 422 ADVISOR_LOOSENS. GET agents/manifests/{id}/export?format=sheet|json|claude-code|managed-agents|openai-agents returns a zip, or the JSON with as=json; {id} may also be a proposal key (the unsaved template, version 0). POST agents/access captures role × system access levels; POST agents/access/ask drafts an ask to the access granter and never sends it. The generic record route cannot change a saved manifest (422 MANIFEST_VIA_AGENTS). No Agents route calls an AI provider or runs an agent.
- Route (shared/route/contracts.ts ROUTE_API): GET route lists 1 card per accepted possible constraint and its rivals (RouteView); GET route/{cardId} is 1 card with its numbers ({cardId} is the candidate id, or "<candidateId>~H2" for a rival); GET route/patterns is the dated pattern library. POST route/{cardId}/ask drafts 1 field-bound ask per person (plan prefix route:ask:v1:) and never sends it; the sample company gets 403 SAMPLE_COMPANY. POST route/{cardId}/accept takes the rung, the owner, the prediction range, the guardrail, the window, the stop rule, the review date and expectedLadderHash; it writes a metric (or takes metricId), an intervention with the route fields (status agreed) and, for rungs 1 to 4, a review decision record. A changed ladder is 409 ROUTE_HASH_MISMATCH; a rung that does not fit, without overrideReason, is 422 ROUTE_NOT_ENOUGH_DATA; a Not proposed rung is 422 ROUTE_NOT_PROPOSED; a withdrawn, rejected or stale candidate is 409. GET route/{cardId}/work-order returns "Work order (draft)" as a zip, or the JSON with as=json, for rungs 5 to 7. GET route/patterns adds the dated options of the patterns research refresh. POST route/patterns/refresh (research.run, consent: true) starts that refresh as a research run (202) or, on the sample company, returns the authored sample with no run (200); refusals are 422 CONSENT_REQUIRED, 409 RESEARCH_SOURCE_MISSING, 409 PATTERNS_NOTHING_FITS and the research refresh rules. The generic record route cannot change an intervention's route fields (422 ROUTE_FIELDS_VIA_ROUTE). An outcome of a routed intervention gets its word from the proof rule (422 ROUTE_PROOF_RULE). Only the pattern refresh starts research; no Route route calls an AI provider for a verdict.
- Graph: GET supports focus, depth 0–4, limit 1–150, allowlisted relationships/kinds/states; it does not accept arbitrary query text. Rebuild uses current authoritative records and never invokes external actions.
Errors and operations
Errors carry a code, readable message, retryable flag and requestId where handled by the application. Typical statuses: 400 invalid command metadata; 401 missing/expired session; 403 actor/origin/CSRF rejection; 404 inaccessible scope; 409 version, binding or transition conflict; 410 expired request/audio; 422 semantic validation; 429 auth throttling; 503 unconfigured runtime. See tests/api.test.ts for executable examples.
The health route checks a live database query and reports service/version/runtime coverage. It does not prove external provider health, signing or customer-system access. Generated client reports are audience-reviewed local downloads; the explicit request email endpoint sends through the configured Resend account. No route executes a customer business action.
Companion mobile contract
contracts/companion-mobile.openapi.json is an authored OpenAPI 3.1 contract for /api/mobile/v1. npm run contracts checks that file and does not rewrite it. React Native generates types from it. The pinned operationIds are enrollParticipant, refreshParticipantSession, logoutParticipantSession, getParticipantProfile, listParticipantRequests, getParticipantRequest, createTranscription, createUnderstanding, and submitParticipantRequest. The QA vertical-slice matrix in docs/qa/companion-mobile-e2e-matrix.md is enforced as contract assertions. Runtime handlers for the pinned paths live in server/mobile-participant.ts. Preferences, push tokens, live transcription tickets, task-card routes, and Something Changed updates may be registered on the server, but they stay out of the pinned file. Browser invitation, team-link, and kickoff routes are unchanged.