POST a small JSON description and get back a deck-ready PNG (or SVG). The endpoint is open and CORS-enabled, so it works from browsers, scripts, CI, and anywhere else you can make an HTTP call.
| Field | Type | Description |
|---|---|---|
| title | string | Project title shown above the chart. Default: "Project Timeline". |
| columns | number | Number of time-unit columns (2–52). Default 8. |
| unit | string | Column unit label, e.g. "Week", "Sprint", "Month". Default "Week". |
| start | number | Starting column number — header reads "Week 1", "Week 2", …. Default 1. |
| width | number | Output width in pixels (640–2400). Default 1280. PNG renders at 2× DPR. |
| labelsInBars | boolean | Show task names inside each bar. Default true. |
| tasks | Row[] | Array of rows (max 100). Normally just task bars — section dividers are entirely optional. See below. |
| Field | Type | Description |
|---|---|---|
| type | string | Entirely optional — most charts never set this. "section" renders a full-width labeled divider band that groups the rows below it (start/duration are ignored), e.g. { "type": "section", "name": "Phase 1" }. Omit for a normal task bar. |
| name | string | Task or section label (truncated if it overflows). |
| start | number | Column offset from the left of the track (supports 0.25 increments, e.g. 2.75). Tasks only. |
| duration | number | Length in columns. 0.25 renders as a milestone diamond. Tasks only. |
| color | string | Hex color. Tasks default to #4f46e5; sections default to a neutral light grey (#e2e8f0). Section label text automatically flips between dark and white for contrast. |
POST /api/timeline → image/png (default)POST /api/timeline?format=svg → image/svg+xmlGET /api/timeline?d=<payload> → renders a chart from a URL-embedded payload: the JSON body, raw-deflate compressed (plain uncompressed also accepted), base64url-encoded. Nothing is stored server-side — the link is permanent, re-renders on demand, and is cached immutably. Ideal for sharing a download link from chat tools.GET /api/timeline?demo=1 → returns the example chart for quick tests{ error: string, ... } with status 400/413/429/500You probably want the hosted MCP server instead — it wraps this exact endpoint as a create_timeline tool that Claude, Cursor, and other MCP clients can call directly. See the MCP page →