Planzer.io API

Read and create tasks and get notified when tasks are created or completed. It powers the Planzer.io apps for Zapier and Make, and you can use it from your own scripts.

Base URL: https://api.planzer.io/v1 · OpenAPI: openapi.json · Help: [email protected]

Authentication

Create a personal API key in Planzer under Settings → Integrations → API keys. It's shown once; copy it right away. Send it with every request:

curl https://api.planzer.io/v1/me \
  -H "Authorization: Bearer pk_your_key"

A key gives full access to the tasks of the account that created it. Delete a key in the same place to revoke it; Zaps, scenarios and webhooks using it stop right away.

Errors and limits

Errors use HTTP status codes with a JSON body:

{ "error": { "status": 400, "message": "title is required" } }
StatusMeaning
400Invalid input; the message says what.
401Missing or invalid API key.
402The free plan's task limit is reached.
404The task doesn't exist or isn't yours.
429More than 120 requests per minute.

The task object

{
  "id": "6f1c2b8e-1a2b-4c3d-9e8f-0a1b2c3d4e5f",
  "title": "Send the proposal to Acme",
  "notes": "Attach the pricing sheet.",
  "status": "open",                 // open | completed
  "date": "2026-10-06",             // planned day; null = inbox
  "deadline": "2026-10-10",
  "estimate_minutes": 45,
  "priority": "high",               // none | low | medium | high | urgent
  "project": { "id": "…", "name": "Acme" },
  "tag": { "id": "…", "name": "Work" },
  "source": "PLANZER",              // or the integration it came from
  "created_at": "2026-10-06T08:00:00.000Z",
  "completed_at": null,
  "url": "https://app.planzer.io/dashboard"
}

Account

GET /me

The account the key belongs to: id, name, email, timezone. Useful to test a key.

Tasks

GET /tasks

Lists tasks, newest first, as { "data": [Task, …] }.

QueryValues
statusopen, completed or all (default)
sortcreated (default) or completed (most recently completed first)
searchOnly tasks whose title contains this text
limit1–100, default 25

GET /tasks/{id}

One task.

POST /tasks

Creates a task and answers 201 with it. Only title is required.

FieldDescription
titleUp to 255 characters
notesText
dateYYYY-MM-DD, or today in the account's time zone. Leave out to add it to the inbox.
deadlineYYYY-MM-DD
estimate_minutesWhole minutes
prioritynone, low, medium, high or urgent
project_id, tag_idFrom /projects and /tags
curl -X POST https://api.planzer.io/v1/tasks \
  -H "Authorization: Bearer pk_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Call Anna", "date": "today", "estimate_minutes": 15 }'

POST /tasks/{id}/complete

Completes the task like ticking it off in the app (a running timer on it is stopped) and answers with the task. Completing a completed task changes nothing.

Projects and tags

GET /projects

Active projects: { "data": [{ "id", "name", "color", "due_date" }] }.

GET /tags

Tags: { "data": [{ "id", "name", "color" }] }.

Webhooks

Get notified the moment a task is created or completed, anywhere in Planzer (web, desktop, phone or an integration).

POST /webhooks

{ "event": "task.created", "target_url": "https://hooks.example.com/planzer" }

Events: task.created, task.completed. Answers 201 with { "id", "event", "target_url" }. The URL must be a public https address; up to 50 webhooks per account.

DELETE /webhooks/{id}

Unsubscribes. Answers 204, also when the webhook is already gone.

What you receive

POST https://hooks.example.com/planzer
Content-Type: application/json

{ "event": "task.completed", "created_at": "2026-10-06T15:30:00.000Z", "data": { …task… } }

Answer with any 2xx status. Answer 410 Gone to unsubscribe. Deliveries time out after 10 seconds and aren't retried. Deleting the API key removes the webhooks it created.