For AI agents & automation

The task manager your agent can drive

PerspecTask is an end-to-end encrypted task manager for planning your goals, from a single day up to your whole life. Your scripts, agents, and automations get the same access you have in the app, through a REST API, a TypeScript SDK, and a CLI built to keep token use low.

Three ways in

API, SDK, or CLI

Same tasks and same short ids underneath. Pick the surface that fits your stack.

REST API

A plain HTTPS endpoint. Bearer auth, JSON in and out. Call it from any language.

terminal
Shell
curl https://api.perspectask.com/v1/tasks \
  -H "Authorization: Bearer pt_live_..."

TypeScript SDK

Typed client with autocomplete and { data, error } results. For scripts, backends, and agents.

terminal
Shell
npm install @perspectask/sdk

CLI

JSON by default, so it pipes cleanly and an agent can parse it directly. Ships pt and perspectask.

terminal
Shell
npm install -g @perspectask/cli

Works with the agents you already run

Running an autonomous agent like OpenClaw, Hermes, Claude Code, or Codex? Add the pt CLI as a skill and it can read, create, and schedule your tasks while you steer from the PerspecTask app. The CLI works the same way inside any agent that can run a shell command.

Built for token budgets

A minimal schema that respects your context window

Most task APIs return walls of nulls, empty arrays, and metadata you never asked for, and your agent pays for every byte. PerspecTask returns only what is actually there, so every token in your context window earns its place.

Only present fields are returned

No worked_time until a timer runs. No completion until a task has children. No created timestamp unless you ask for it. A simple task is a simple object.

response.json
JSON
{
  "id": "abc",
  "title": "Buy milk",
  "deadline": "d-07-06-2026",
  "status": "ACTIVE"
}

Trees that never repeat themselves

In tree mode, a task with multiple parents is expanded once. Everywhere else it appears as just its short id string, so the relationship is preserved without re-sending the whole subtree. No duplication, no wasted tokens.

response.json
JSON
[
  {
    "id": "abc",
    "title": "Launch v2",
    "children": [
      {
        "id": "def",
        "title": "Write docs"
      },
      {
        "id": "ghi",
        "title": "Deploy to prod"
      }
    ]
  },
  {
    "id": "xyz",
    "title": "Prepare release",
    "children": ["def"]
  }
]

Open tasks first, finished work out of the way

The task list hides done work by default — completed and cancelled tasks drop out so your agent only sees what's actually actionable, reclaiming context. The one exception: a completed task is kept if it's on the path to an open subtask, so you never lose the context of where live work lives. Want the full archive? Ask for it explicitly with showCompleted (--show-completed in the CLI).

pt tasks abc --tree --show-completed
pt tasks abc --tree

On the right, the completed and the cancelled are all gone. But Migration stays, even though it's COMPLETED, because its child Verify counts is still open. You keep the path to live work and lose the rest.

Need more? Opt in per request with tree, treeFull, showCreated, showCompleted, or includeEncrypted. The default stays lean.

Short ids

Three characters, not thirty-six

Every task id in a response is shortened to its minimum unique prefix,like a git commit hash. Easier for a human to read back, cheaper for an LLM to carry around.

A typical UUID

a3f3e1c2-9b7d-4e5a-8f10-1234567890ab

The same task in PerspecTask

a3f

Use the short prefix anywhere an id is accepted and the API resolves it for you. If a prefix is ever ambiguous, you get a clear 400 asking for one more character.

terminal
Shell
pt tasks a3f --tree
# fetch a whole subtree by a 3-char id

Deadline shorthand

Schedule a task in a single token

One field, one short token. No date math, no ISO strings. Say when, the way a person would.

today

due end of today

tomorrow

due tomorrow

this week

or just w

next month

the month ahead

Q3

third quarter, this year

Q1 2027

first quarter of 2027

W15

ISO week 15

M11

November this year

M3 2028

March 2028

Y2029

all of 2029

D23

the 23rd, this month

lifetime

no deadline — someday

terminal
Shell
pt tasks create "Ship the launch post" --deadline Q3
# or with the SDK:
await pt.tasks.create({ title: "Ship the launch post", deadline: "q3" });

On read, PerspecTask gives you both the canonical id (deadline) and the exact end-of-period timestamp (deadline_date), so an agent gets a clean machine value and you keep the human shorthand.

Safe by default

Hand an agent the keys, not the keys to everything

Scoped API keys let an agent run your workflow without rewriting your words, and end-to-end encrypted tasks stay private even from the API.

tasks:read

List and read tasks.

tasks:write

Full create and update access.

tasks:write:meta

Manage status, priority, scheduling, and parents, but never edit the title or description of an existing task. Built for agents.

End-to-end encrypted tasks appear in listings so your tree stays intact, but their content is never sent over the API. Only you can decrypt them, in the app.

Point your agent at it

Create a scoped key, install the SDK or CLI, and let your automation keep your goals in order.