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.