← Home

The gantt400 API for developers

Last updated: 29 October 2026

The API lets your own scripts and tools read and write your team's projects: fetch projects and tasks, create cards on the board, and create or update a whole project plan in one call. It runs at https://app.gantt400.com/api/…, on the same servers in Germany as the app.

1. Create an API key

Team admins and owners create keys in the app: Settings → API keys. Choose a name, the scopes and how long the key stays valid (up to 365 days). The key starts with g4k_ and is shown only once — copy it to a safe place right away. A key writes with editor rights, only in the team it was created in, and only what its scopes allow. You can revoke it at any time in the same place.

Creating, listing and revoking keys works only in the signed-in app, never with a key itself.

2. Your first call

Every request carries the key as a bearer token. To keep it out of your shell history and the process list, read it once without echo and put the header in a file only you can read. This call then lists the projects the key may see (scope projects:read):

mkdir -p ~/.config/g400
printf 'API key: '; read -rs G400_API_KEY; echo
( umask 077; rm -f ~/.config/g400/header
  printf 'Authorization: Bearer %s\n' "$G400_API_KEY" > ~/.config/g400/header )
unset G400_API_KEY

curl -sS https://app.gantt400.com/api/projects -H @"$HOME/.config/g400/header"

The file deliberately lives outside your project so it never ends up in a repository. When you no longer need the key: rm ~/.config/g400/header and revoke the key in the app.

Errors come back as JSON with a stable code in the error field, for example 401 for an invalid or expired key, or 403 with forbidden_api_key_scope when a scope is missing.

3. A project plan in one call

POST /api/projects/{id}/task-tree creates a whole subtree or brings it to the state you describe — a roadmap with phases, steps and milestones, say. Every node carries a key of your choosing, ref: if it is not in the project yet, the task is created; if it is, the task is updated. A second run with the same body writes nothing. With ?dry_run=1 the server computes everything and writes nothing.

curl -sS -X POST "https://app.gantt400.com/api/projects/24/task-tree?dry_run=1" \
  -H @"$HOME/.config/g400/header" \
  -H "Content-Type: application/json" \
  -H "X-Gantt400-Today: $(date +%F)" \
  -d '{"nodes":[
        {"ref":"roadmap/q1","name":"Q1: Pilot","children":[
          {"ref":"roadmap/q1/setup","name":"Setup",
           "start_date":"2026-11-02","end_date":"2026-11-13"},
          {"ref":"roadmap/q1/go","name":"Go-live",
           "start_date":"2026-11-20","end_date":"2026-11-20",
           "is_milestone":true}]},
        {"ref":"roadmap/q2","name":"Q2: Roll-out"}]}'

Required scopes: tasks:create, tasks:update and tasks:read. At most 500 nodes and depth 16 per call; everything runs in one transaction. When a date changes, dependent tasks move with it — just like dragging in the Gantt chart.

4. Reference

Every documented route with its fields, scopes and error codes is in the API reference. The OpenAPI 3.1 description is at /developers/openapi.json — use it to generate clients or load it into tools such as Postman. More routes are added step by step.

Questions

Write to us at info@gantt400.com.

Open the API reference Create a key