init.Tasks openapi.json inittasks.com

your first request in five minutes

Quickstart

You need init.Tasks installed and signed in on one device, and curl. There is no registration and no approval step.

1. Create a token

In init.Tasks, open settings → api keys (the account page lists them too) and create a key. Give it the todos:read and todos:write scopes.

The key is shown once. It is itk_ and 44 more characters. Copy all of it:

text
itk_xPVI8n9JBtWHk76bLvrPdEWY5AuEdpkOCQkUVs-Whb6y

The token unlocks your encryption key. Store it the way you store a password, not the way you store an API key.

Put it in your shell:

bash
# every example below reads this variable
export INITTASKS_TOKEN='itk_…'   # the whole key

2. Call the API

GET /v1/me reports which scopes your token holds. It is the cheapest way to prove the token works.

bash
curl -s https://api.inittasks.com/v1/me \
  -H "Authorization: Bearer $INITTASKS_TOKEN"
json
{
  "sub": "kQ8vM2xRpL4Ns1Zd7Ty6Ye3Wu0Bg5Mj2Hc7Qf4Ln8A",
  "scopes": ["todos:read", "todos:write"],
  "grant": { "id": "4F2A1B8E-6C3D-4A57-9E20-1B8D5F3C7A64", "kind": "pat", "clientId": null },
  "webhooks": { "disabled": 0 }
}

A 401 means the token is wrong, expired, or revoked. See unauthorized.

3. Create a to-do

POST /v1/todos takes a title and returns the row it created. The Idempotency-Key header makes the call safe to retry. Send the same key with the same body, and the server replays its first answer instead of writing twice.

bash
curl -s https://api.inittasks.com/v1/todos \
  -X POST \
  -H "Authorization: Bearer $INITTASKS_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"title":"buy milk","whenDate":"2026-09-16","tags":["errands"]}'
json
{
  "id": "9C3F1A72-8E4F-4B21-A0D5-3F7B2C1E6A94",
  "createdAt": "2026-09-16T08:12:03.441+00:00",
  "updatedAt": "2026-09-16T08:12:03.441+00:00",
  "title": "buy milk",
  "parentId": null,
  "headingId": null,
  "subtitle": null,
  "description": null,
  "tags": ["errands"],
  "whenDate": "2026-09-16",
  "deadline": null,
  "status": "open",
  "priority": null,
  "colorHex": null,
  "colorStyle": null,
  "reminderTime": null,
  "recurrenceRule": null,
  "recurrenceAnchor": null,
  "completedAt": null,
  "trashedAt": null,
  "sortKey": "zV3",
  "sorted": true,
  "whenTime": null,
  "durationMin": null,
  "reminders": [],
  "subtasks": []
}

Every field is described under Todo.

The title is encrypted on the way in and decrypted on the way out. The tag errands is created if it does not exist, so there is no vocabulary to register first.

4. Read it back

GET /v1/todos returns a page of rows and a cursor.

bash
curl -s "https://api.inittasks.com/v1/todos?limit=5" \
  -H "Authorization: Bearer $INITTASKS_TOKEN"

Each row in data is the same to-do object, shortened here:

json
{
  "data": [
    { "id": "9C3F1A72-8E4F-4B21-A0D5-3F7B2C1E6A94", "title": "buy milk", "whenDate": "2026-09-16", "tags": ["errands"], "status": "open", "…": "…" }
  ],
  "next_cursor": null
}

Follow next_cursor until it comes back null. Do not build a cursor yourself.

Next