Browse the docs

API reference

Projects

Products, the spine everything else hangs off, plus the roadmap and changelog.

List products

GET/v1/projects

Up to 60 products ordered by stage then name, each with its count of planned work and live stats. Pipeline amounts are empty unless the token holds crm.value and the account may view deal values.

Requires projects.read

Request
curl "https://atrix.dev/api/v1/projects" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "items": [
    {
      "id": "cm7a1b2c30000qr12st34uv56",
      "name": "Atrix Mail",
      "slug": "atrix-mail",
      "stage": "BUILDING",
      "summary": "Email hosting for small teams.",
      "accent": "#F97316",
      "logoUrl": null,
      "icon": "mail",
      "platforms": [
        "WEB",
        "BACKEND"
      ],
      "openWork": 13,
      "stats": {
        "battery": {
          "done": 18,
          "progress": 4,
          "todo": 9,
          "total": 31,
          "pct": 58,
          "overdue": 2
        },
        "unassigned": 3,
        "undated": 5,
        "pipeline": {
          "open": 4,
          "byCurrency": [
            {
              "currency": "USD",
              "amount": 12000,
              "deals": 3
            }
          ],
          "unpriced": 1,
          "won90": [
            {
              "currency": "USD",
              "amount": 4500,
              "deals": 1
            }
          ],
          "nextClose": "2026-11-10T00:00:00.000Z",
          "stale": 0
        },
        "health": "late"
      }
    }
  ]
}

Get a product

GET/v1/projects/{slug}

One product as a hub: up to 12 open work items (epics excluded), 8 recent pages, 6 posts, 12 team members with their open work, and stats. Nothing paginates.

Requires projects.read

Path parameters

  • slugstringrequired

    The product's slug.

Request
curl "https://atrix.dev/api/v1/projects/SLUG" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "id": "cm7a1b2c30000qr12st34uv56",
  "name": "Atrix Mail",
  "slug": "atrix-mail",
  "stage": "BUILDING",
  "summary": "Email hosting for small teams.",
  "accent": "#F97316",
  "icon": "mail",
  "logoUrl": null,
  "platforms": [
    "WEB",
    "BACKEND"
  ],
  "url": "https://atrix.dev/dashboard/projects/atrix-mail",
  "openWork": 13,
  "work": [
    {
      "id": "cm9x2k7f40001ab12cd34ef56",
      "title": "Retry failed Stripe webhooks",
      "status": "IN_PROGRESS",
      "daysLate": 2,
      "assignee": {
        "id": "cm8q1z0a10003xy98wv76ut54",
        "name": "Sara Khan",
        "image": null
      }
    }
  ],
  "pages": [
    {
      "id": "cm9p0q1r20005gh67ij89kl01",
      "title": "Pricing decision",
      "icon": null,
      "excerpt": "We charge per mailbox because…",
      "at": "2026-10-22T10:00:00.000Z"
    }
  ],
  "posts": [
    {
      "id": "cm9s2t3u40008mn23op45qr67",
      "body": "Billing is live.",
      "at": "2026-10-24T08:30:00.000Z",
      "author": {
        "id": "cm8q1z0a10003xy98wv76ut54",
        "name": "Sara Khan",
        "image": null
      }
    }
  ],
  "team": [
    {
      "id": "cm8q1z0a10003xy98wv76ut54",
      "name": "Sara Khan",
      "image": null,
      "openWork": 4
    }
  ],
  "stats": {
    "battery": {
      "done": 18,
      "progress": 4,
      "todo": 9,
      "total": 31,
      "pct": 58,
      "overdue": 2
    },
    "unassigned": 3,
    "undated": 5,
    "pipeline": {
      "open": 4,
      "byCurrency": [
        {
          "currency": "USD",
          "amount": 12000,
          "deals": 3
        }
      ],
      "unpriced": 1,
      "won90": [
        {
          "currency": "USD",
          "amount": 4500,
          "deals": 1
        }
      ],
      "nextClose": "2026-11-10T00:00:00.000Z",
      "stale": 0
    },
    "health": "late"
  }
}

Update a product

PATCH/v1/projects/{slug}

Moves a product's stage, renames it or rewrites its summary. A stage move is recorded in the product's stage history; the response carries the resulting stage.

Requires projects.writeand the matching permission on the account

Path parameters

  • slugstringrequired

    The product's slug.

Body

  • stageenum

    The new stage.

    IDEAVALIDATINGBUILDINGLAUNCHEDPAUSED

  • namestring

    New name, 1 to 120 characters.

  • summarystring | null

    What it is for, up to 2000 characters.

Request
curl -X PATCH "https://atrix.dev/api/v1/projects/SLUG" \
  -H "Authorization: Bearer $ATRIX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "stage": "IDEA", "name": "…" }'
Response
{
  "ok": true,
  "stage": "LAUNCHED"
}

List a product's deals

GET/v1/projects/{slug}/deals

The product's pipeline grouped by stage (up to 50 per stage; LOST and won totals cover the last 90 days). Also needs crm.read; amounts are null and totals empty unless the token holds crm.value and the account may view deal values.

Requires projects.read

Path parameters

  • slugstringrequired

    The product's slug.

Request
curl "https://atrix.dev/api/v1/projects/SLUG/deals" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "valueVisible": true,
  "totals": {
    "open": [
      {
        "currency": "USD",
        "amount": 12000,
        "deals": 3
      }
    ],
    "won90": [],
    "unpriced": 1,
    "stale": 0
  },
  "groups": [
    {
      "stage": "QUALIFIED",
      "count": 1,
      "deals": [
        {
          "id": "cm9d1e2f30011st45uv67wx89",
          "title": "Clinic group pilot",
          "stage": "QUALIFIED",
          "amount": 3500,
          "currency": "USD",
          "company": {
            "id": "cm9c0d1e20010yz12ab34cd56",
            "name": "MediCare Group"
          },
          "owner": {
            "id": "cm8q1z0a10003xy98wv76ut54",
            "name": "Sara Khan",
            "image": null
          },
          "expectedCloseOn": "2026-11-10",
          "daysPastClose": null,
          "stale": false
        }
      ]
    }
  ]
}

List a product's updates

GET/v1/projects/{slug}/updates

Posts and stage moves for one product merged newest first, cursored on time. Pass next back as before for the next page.

Requires projects.read

Path parameters

  • slugstringrequired

    The product's slug.

Query parameters

  • limitinteger

    Items per page, 1 to 30; defaults to 20.

  • beforeISO date

    Only items older than this time.

Request
curl "https://atrix.dev/api/v1/projects/SLUG/updates" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "items": [
    {
      "kind": "post",
      "id": "cm9s2t3u40008mn23op45qr67",
      "body": "Billing is live.",
      "at": "2026-10-24T08:30:00.000Z",
      "author": {
        "id": "cm8q1z0a10003xy98wv76ut54",
        "name": "Sara Khan",
        "image": null
      },
      "replies": 2
    },
    {
      "kind": "stage",
      "id": "cm9s1t2u30007mn23op45qr67",
      "from": "VALIDATING",
      "to": "BUILDING",
      "at": "2026-09-02T12:00:00.000Z",
      "by": {
        "id": "cm8q1z0a10003xy98wv76ut54",
        "name": "Sara Khan",
        "image": null
      }
    }
  ],
  "next": null
}

Get a product's profile

GET/v1/projects/{slug}/profile

A product as a company page: identity, links, current team, stage journey, counts and the latest metrics snapshot. counts.deals is null without crm.read.

Requires projects.read

Path parameters

  • slugstringrequired

    The product's slug.

Request
curl "https://atrix.dev/api/v1/projects/SLUG/profile" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "identity": {
    "name": "Atrix Mail",
    "slug": "atrix-mail",
    "tagline": "Email hosting for small teams.",
    "pitch": "Mailboxes that come with an agent.",
    "stage": "BUILDING",
    "kind": "OWN_VENTURE",
    "category": "Email",
    "targetCustomer": "Teams of 2 to 50",
    "foundedOn": "2026-06-01",
    "logoUrl": null,
    "coverUrl": null,
    "icon": "mail",
    "accent": "#F97316",
    "platforms": [
      "WEB",
      "BACKEND"
    ],
    "company": null,
    "webUrl": "https://atrix.dev/dashboard/projects/atrix-mail"
  },
  "links": [
    {
      "id": "cm9l1m2n30012ab34cd56ef78",
      "kind": "WEBSITE",
      "label": "Site",
      "url": "https://mail.atrix.dev"
    }
  ],
  "team": [
    {
      "id": "cm8q1z0a10003xy98wv76ut54",
      "name": "Sara Khan",
      "image": null,
      "title": "Engineer",
      "role": "LEAD",
      "since": "2026-06-01T00:00:00.000Z",
      "openWork": 4
    }
  ],
  "journey": [
    {
      "stage": "IDEA",
      "at": "2026-06-01T00:00:00.000Z",
      "by": null
    },
    {
      "stage": "BUILDING",
      "at": "2026-09-02T12:00:00.000Z",
      "by": {
        "id": "cm8q1z0a10003xy98wv76ut54",
        "name": "Sara Khan"
      }
    }
  ],
  "counts": {
    "work": 13,
    "pages": 9,
    "updates": 21,
    "deals": 4
  },
  "metrics": {
    "capturedAt": "2026-10-27T06:00:00.000Z",
    "p95Ms": 210,
    "errorRate": 0.002,
    "throughput": 38
  }
}

List a product's pages

GET/v1/projects/{slug}/pages

Every page of a product, newest edit first, with an excerpt. Pass next back as before for the next page.

Requires projects.read

Path parameters

  • slugstringrequired

    The product's slug.

Query parameters

  • limitinteger

    Items per page, 1 to 50; defaults to 20.

  • beforeISO date

    Only pages last edited before this time.

  • qstring

    Case-insensitive title search.

Request
curl "https://atrix.dev/api/v1/projects/SLUG/pages" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "items": [
    {
      "id": "cm9p0q1r20005gh67ij89kl01",
      "title": "Pricing decision",
      "icon": null,
      "excerpt": "We charge per mailbox because…",
      "at": "2026-10-22T10:00:00.000Z"
    }
  ],
  "next": null
}

List the roadmap

GET/v1/roadmap

Initiatives (with linked product ids and done/total issue counts) and milestones. Read only; filters keep items overlapping the date window or matching the status.

Requires roadmap.read

Query parameters

  • fromISO date

    Only items ending (or due) on or after this day, YYYY-MM-DD.

  • toISO date

    Only items starting (or due) on or before this day, YYYY-MM-DD.

  • statusenum

    An initiative or milestone status.

    PLANNEDACTIVEPAUSEDDONEIN_PROGRESSCANCELLED

Request
curl "https://atrix.dev/api/v1/roadmap" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "initiatives": [
    {
      "id": "cm9i1n2t30013gh45ij67kl89",
      "kind": "initiative",
      "title": "Self-serve billing",
      "description": "Card trial and add-ons.",
      "startOn": "2026-10-01",
      "endOn": "2026-11-30",
      "status": "ACTIVE",
      "ownerId": "cm8q1z0a10001xy98wv76ut54",
      "ownerName": "Moeid Saleem",
      "projectIds": [
        "cm7a1b2c30000qr12st34uv56"
      ],
      "work": {
        "done": 18,
        "total": 31
      }
    }
  ],
  "milestones": [
    {
      "id": "cm9m1s2t30014mn67op89qr01",
      "projectId": "cm7a1b2c30000qr12st34uv56",
      "projectName": "Atrix Mail",
      "title": "Public beta",
      "description": null,
      "dueOn": "2026-11-15",
      "status": "PLANNED",
      "ownerId": null,
      "ownerName": null
    }
  ]
}

List changelog posts

GET/v1/changelog

Changelog posts, newest edit first, without bodies. Read only; nothing can be published from here.

Requires roadmap.read

Query parameters

  • statusenum

    Only posts in this state.

    DRAFTSCHEDULEDPUBLISHED

  • limitinteger

    1 to 100; defaults to 50.

Request
curl "https://atrix.dev/api/v1/changelog" \
  -H "Authorization: Bearer $ATRIX_TOKEN"
Response
{
  "posts": [
    {
      "id": "cm9c1h2g30015st89uv01wx23",
      "title": "Yearly pricing",
      "slug": "yearly-pricing",
      "status": "PUBLISHED",
      "tags": [
        "billing"
      ],
      "projectId": "cm7a1b2c30000qr12st34uv56",
      "projectName": "Atrix Mail",
      "scheduledFor": null,
      "publishedAt": "2026-10-20T09:00:00.000Z",
      "updatedAt": "2026-10-20T09:00:00.000Z",
      "emailed": true
    }
  ]
}