REST API

The same capabilities as the MCP tools, for anything that cannot speak MCP. Same token, same authorisation, same code underneath — the two doors cannot drift.

Authentication

A bearer token from Agents & MCP. It resolves to one workspace, and every call is scoped to it.

TIC=https://ticulate.com
TOKEN=tic_your_token

List projects

curl -s "$TIC/api/v1/projects" -H "Authorization: Bearer $TOKEN"

Returns the workspace, its projects, and the tool names this endpoint accepts.

Read a project

curl -s "$TIC/api/v1/projects/<slug>" -H "Authorization: Bearer $TOKEN"

The same document project_resume returns. It is also what /owner/project/json serves publicly for a published project.

Write

One dispatcher rather than an endpoint per capability. The slug in the URL supplies project, so the params never need it. Tool names are dotted here, where MCP uses underscores.

curl -s -X PATCH "$TIC/api/v1/projects/<slug>" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "update.create",
    "params": {
      "title": "Cutover rehearsal passed; legal review outstanding",
      "body": "41M rows copied and checksums matched. The addendum is the only thing left, so the 14 August date is a plan, not a promise.",
      "tags": ["cutover"]
    }
  }'

Tools: project.list, project.resume, project.ensure, project.import, status.set, next.set, update.create, feature.upsert, feature.toTask, task.upsert, task.list, task.delete, purpose.set, architecture.set, roadmap.set, theme.get, theme.set, publish.set, feedback.list, feedback.reply, review.open.

project.import takes the whole document — state, purpose, architecture, roadmap, features, tasks, backfilled updates, theme and visibility — in one request. Use it to set a project up rather than sending thirty separate patches.

Creating a project

project.ensure has no slug to address yet, so send it to any existing one — the params carry the real name.

curl -s -X PATCH "$TIC/api/v1/projects/any-existing-slug" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"tool":"project.ensure","params":{"name":"Warehouse migration"}}'

Responses

200{ "tool": …, "result": … }
400Unknown tool, or a value outside a fixed vocabulary. The response names the valid ones.
401Token missing, wrong or revoked
403A read-only token attempted a write
404No such project in this workspace
409A stale write — see several agents at once

The MCP endpoint

POST https://ticulate.com/api/mcp, streamable HTTP, same bearer token. Prefer it where you can: the tool descriptions carry guidance the REST surface cannot.