Skip to main content
The REST API lives under /v1/.
Production: https://api.fortressproductivity.com/v1
Local:      http://localhost:3000/v1

Authentication

CallerAuth mode
Human web appSession cookie
AgentAuthorization: Bearer ft_...
OAuth MCP clientOAuth 2.1 flow, then agent-scoped internal token
Human routes can fall back to the first workspace in local development. Agent routes resolve the workspace from the bearer token.

List response envelope

Every list endpoint returns the same envelope:
{
  "items": [],
  "total": 0,
  "filters": {},
  "hidden_count": 0
}
Only items is always present. Other fields appear when the endpoint has that metadata.

Primary endpoints

EndpointPurpose
GET /v1/projectsList projects.
POST /v1/projectsCreate a project.
GET /v1/projects/:idRead a project.
GET /v1/projects/:id/actionsList project actions.
POST /v1/projects/:id/duplicateDuplicate a project template.
GET /v1/actionsList tasks/actions.
POST /v1/actionsCreate work.
GET /v1/actions/:idRead a task/action.
GET /v1/actions/:id/contextRead the full agent context bundle.
POST /v1/actions/:id/heartbeatAgent progress signal.
POST /v1/actions/:id/completeComplete work.
POST /v1/actions/:id/dropDrop work.
POST /v1/actions/:id/rejectHuman rejection path.
GET /v1/questionsList questions.
POST /v1/questionsAgent asks a question.
POST /v1/questions/:id/respondAnswer a question.
GET /v1/ordersList orders.
POST /v1/ordersCreate an order.
POST /v1/orders/checkinsLog an order report or heartbeat.
GET /v1/documentsList documents.
POST /v1/documentsCreate a document.
GET /v1/documents/:id/revisionsList revisions for review or history.
GET /v1/views/:nameRead a named human view.

Example agent completion

POST /v1/actions/act_123/complete HTTP/1.1
Authorization: Bearer ft_example
Content-Type: application/json

{
  "result_summary": "Reviewed the queue and closed the stale PR notification.",
  "links": [
    {
      "title": "Closed PR",
      "url": "https://github.com/example/repo/pull/412"
    }
  ]
}

Error envelope

Errors use a stable JSON envelope:
{
  "code": "CAP_EXCEEDED",
  "message": "Free plan limit reached",
  "issues": [],
  "details": {}
}
Branch on code and structured details when building clients.