Developers
Integrations made simple.
Every request acts on behalf of one person and sees only what that person can see. There is a REST API with OAuth 2 and PKCE, board tokens, real-time events and an MCP server for AI assistants.
curl -s https://producteev.de/app/api/v1/boards \
-H "Authorization: Bearer $PRODUCTEEV_TOKEN" \
-H "Accept: application/json"Base URLhttps://producteev.de/app/api/v1
This address is the prefix for all API paths and is not an endpoint by itself. Open the API reference or call a path such as /plans (public) or /boards (with a Bearer token).
Authentication
How to authenticate.
Send the token in the Authorization: Bearer header. A token can never do more than the person it belongs to.
Board tokens
You create the token in the board’s settings under API access and choose its scopes. By default it only works for that board; you can allow every board you have access to instead. It expires after 12 months and is shown only once.
OAuth 2 with PKCE
Redirect people to /app/oauth/authorize with an S256 code challenge, then exchange the code at /app/oauth/token.
Access tokens last 15 days, refresh tokens 30 days. Clients are registered by the operator.
MCP for assistants
The assistant signs in to the remote MCP server at /app/mcp with OAuth or an MCP token from Settings → Access tokens. It then acts on your behalf.
Scopes
Scopes don’t include each other. A token that only has write cannot call read endpoints. OAuth clients that don’t request a scope get read.
| Scope | Grants |
|---|---|
read | Read boards, cards, comments and history |
write | Create and change cards, custom fields, checklists, comments, attachments and automations |
manage | Manage boards, subpages, lists and members |
Conventions
What to keep in mind when sending requests.
Card versions
With every update you send the version you last read. If it is out of date, the API answers with 409 Conflict and the current card, so you can apply your change again.
Moves by neighbour
before_id is the card directly above the target position, after_id the card below it. Moving a card into a done list marks it as completed.
Idempotency-Key
Send this header with writes that must not run twice. With the same key and the same body you get the stored response for 30 days.
Cursor pagination
Card lists take per_page from 1 to 200 and return links.next. Follow it until it is null.
404 for hidden cards
For a card outside your subpage, the API gives the same answer as for a card that doesn’t exist. That way nobody can find out whether a hidden id exists.
Stable v1
Within v1, changes only add things. Breaking changes ship as /app/api/v2, and v1 stays available for at least six months after that.
Rate limits
Limits apply per user. Every response includes the X-RateLimit-Remaining header. A 429 tells you in Retry-After how long to wait.
| Requests | Limit |
|---|---|
| All API requests | 240 per minute |
| Changes | 120 per minute |
| Attachment uploads | 20 per minute |
| Search | 60 per minute |
| Invitations | 50 per hour |
Real-time and sync
Always up to date.
Treat a real-time event as a hint and fetch the change afterwards. That way your copy stays current even if a message gets lost.
Realtime
Changes to a board arrive over a Pusher-compatible WebSocket. Each person has a private channel, and every board has a presence channel.
Sync for offline clients
Load a snapshot of the board, then read the changes after a cursor. The phone app works exactly this way and serves as the reference.
Webhooks
Send card events from a board to Slack, Teams, Discord or another HTTPS endpoint. A test button lets you check the connection.
MCP server
Let an assistant work on your boards.
The assistant does not get its own account and never sees more than you do. Card history shows its name next to yours.
- Tools to read, create, move, complete and comment on cards, and to manage boards, subpages and members. Tools that delete something ask first.
- Prompts for a standup, a plan for the week, and triage of stale, overdue and blocked cards.
- Not included: backups, notification settings, account security, API tokens and the admin area.
claude mcp add --transport http producteev https://producteev.de/app/mcp{
"mcpServers": {
"producteev": {
"url": "https://producteev.de/app/mcp"
}
}
}Docs
Further reading
The API reference is generated from the server’s OpenAPI document and rebuilt with each app release. There are also guides on sign-in, conventions, real-time and sync.

