Get started
- In SelfManager, open My Profile → Connected apps and make a personal API key: choose what it may do, and whether it lasts 30, 90 or 365 days. It is shown once, so keep it somewhere safe. Connected apps appears there once your account is in the beta.
- Send it with every request, as
Authorization: Bearer <your key>. Your first request says whose key it is:
curl https://api.selfmanager.ai/v1/me \ -H "Authorization: Bearer <your key>"
Then read today's tables with GET /v1/days/today, or make a table with its tasks:
curl https://api.selfmanager.ai/v1/tables \
-H "Authorization: Bearer <your key>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: launch-prep-1" \
-d '{"date": "2026-10-26", "name": "Launch prep", "tasks": [
{"name": "Write the changelog"},
{"name": "Record the demo", "priority": "high"}]}'- Answers are JSON. A range of days, a search and most lists come a page at a time: an answer with a
cursorhas more, so send the same request with it. - Every table has an id. Each answer gives a table its
table_id; address the table as/v1/tables/followed by it. Dates areYYYY-MM-DD, ortodaywhere a day is asked for. - Retries are safe. Send an
Idempotency-Keyheader with a change: sent again with the same key, it answers as it did the first time and changes nothing twice. A key is remembered for 24 hours. Making many tables at once, and copying or moving a table, need one. - Keep your key on your server. A key acts as you. The API sends no CORS headers: keep it out of web pages and apps other people run.
Every endpoint, with its parameters, answers, permissions and price, is in the API reference, also as OpenAPI.
What you can build
Anything that can send a request can work with your tables. For example:
- Post today's list to your team's chat every morning.
- Make a table on the day of each new booking, with the tasks it needs.
- Turn every form a client sends into tasks on a table called Inbox.
- When a task is done, update an invoice or a CRM in your own app.
- When a table's last task is done, email the client.
- Copy a year of days, tasks and tracked time into a spreadsheet.
- Plan a month of workouts as 30 tables in one request.
- Copy new images, recordings and docs to your own storage, up to 8 MB each.
Prefer to ask in words? Connect an AI assistant through the MCP server instead.
What it can and can't do
It can
- Read your days, tables, tasks, notes, comments, deadlines, pinned and repeating tables, including tables shared with you; totals per week or month, and the days you have tables on; every comment and every table's notes in one list; which of your tables other people can see and who is on them (by name); your AI History and what used your AI credits; and, with the journal permission, your journal.
- Make changes, if the key may: create tables (up to 1,000 in one request) and copy them, add tasks (up to 200 at a time), comments and notes, complete, reopen and edit tasks, record how long a task took, set and remove deadlines, pin tables, change a table's settings, make and change repeating tables, add to your journal or rewrite a day's line (the old line is kept), and save a conversation to your AI History.
- Tables other people can see, only with that permission: add tasks, comments and notes there, and set or remove deadlines, for you or for everyone on the table, each of whom is then reminded.
- Images, recordings and docs, only with those permissions: list them, read a recording's transcript or a doc's text, and download the files themselves, up to 8 MB each.
- Delete one thing at a time, only if you ticked "Delete through the API" when you made the key: a task, a comment (with its images and voice recordings), a table's notes, an image, a recording, a doc, or a whole table after its preview, in tables only you can see; in a table other people can see, only your own comment, with that permission too. With the same box it can move a table of yours that nobody else sees to another day, reset a table's task times, delete a repeating table (the tables it made stay) and clear a day's journal line (kept, to bring back). Nothing asks you first, and most of it can't be undone.
- Send events to your app, with the webhooks permission: see Webhooks.
It can never
- Delete many things in one request, or anything in a table other people can see but your own comment.
- Share a table, invite someone, or change who can see what.
- Rename a task, or change a table's settings, where other people can see it; turn a table's log off; or @mention people (a comment it adds is plain text).
- Run SelfManager's own AI, such as AI Plan or AI Review.
- See any account but yours, or anything you can't see in the app.
Webhooks
A webhook sends an event to an address of yours as soon as something happens in your tables: a POST of JSON, signed so your app can tell it came from SelfManager. A key with the webhooks permission makes one:
curl https://api.selfmanager.ai/v1/webhooks \
-H "Authorization: Bearer <your key>" \
-H "Content-Type: application/json" \
-d '{"target_url": "https://example.com/selfmanager",
"events": ["task.completed", "table.completed"]}'The answer holds the webhook's secret, shown only there. The events:
table.createdA table appears on a day.task.createdA task is added.task.completedA task is completed.table.completedThe last of a table's tasks is completed. It says how many tasks the table has.comment.createdA comment with words is added.deadline.dueA task's deadline is reached, for the person it reminds.
Which tables they come from
- Your tables that nobody else can change, unless you ask for more. With
include_shared_tables, also your tables other people can change, and theirs you're on: what others do there can fill the webhook, and use your Integration Credits. - A copy, made by Duplicate or by moving a table, sends none. A repeating table's copy appearing on its day, and its tasks, only with
include_repeat_copies. - What the key itself changes is left out, unless you turn
exclude_own_changesoff, so a script that adds a task for each new task never loops. - An event is sent only while you can still see its table: lose access, and what wasn't sent yet never is.
What arrives
A POST of id, type, occurred_at and data, in the shapes the API answers with, times in UTC; via names the app when an app made the change. For example:
{
"id": "evt_4kQ2mX9vR1sT7bN0pL3wYc",
"type": "task.completed",
"occurred_at": "2026-10-24T09:41:07.312Z",
"data": {
"task": {
"task_id": "…",
"name": "Send the invoice",
"status": "completed",
"priority": "high",
"completed_at": "2026-10-24T09:41:07Z",
"created_at": "2026-10-24T08:02:15Z"
},
"table": {
"table_id": "2026-10-24/…",
"name": "Client work",
"date": "2026-10-24",
"shared": false,
"your_role": "owner"
}
}
}It comes with this header, among others:
SelfManager-Signature: t=1792834867,v1=5257a869e7ec…
- Check the signature before you trust a delivery: it is the hex HMAC-SHA256 of
t, a dot and the body, keyed with the whole secret as text,whsec_included. Compute it over the body exactly as it arrived, compare in constant time, and refuse atmore than 5 minutes old. While a secret is replaced, for 24 hours, there are twov1, one for each. The reference has the code, in Node. - Answer with a 2xx within 10 seconds. A 429, a 5xx, no answer or no connection is sent again after 1, 5 and 15 minutes, then hourly: 8 attempts in all. Any other answer is final, and a 410 deletes the webhook.
- An event can arrive twice, or out of order: its
idtells them apart. - A webhook nothing succeeds for in 3 days is turned off. Turn it on again in My Profile → Connected apps.
- A webhook lasts as long as the key that made it. Revoking the key deletes its webhooks. Once the key expires, or after a password change, they send nothing more and are deleted at their next event, and SelfManager tells you.
Where you see them
- My Profile → Connected apps lists every webhook you have, with where it sends, its events and its latest deliveries. Send it a test, turn it back on, or delete it there.
- SelfManager tells you whenever a webhook is made, and names where it sends.
- An account has up to 25 webhooks, sending to public
httpsaddresses on port 443, and makes up to 50 a day.
The permissions you choose
When you make a key, you choose what it may do:
- Read your tables, tasks, notes and commentsAlways on.
- Make changesTicked unless you untick it.
- Also add tasks, comments and notes, and set deadlines that remind everyone, in tables other people can seeOff unless you tick it.
- Delete through the API: one thing at a time, in tables only you can see; also move tables and reset their task timesOff unless you tick it.
- Your journal: read it, and add to it if it may make changesTicked unless you untick it.
- Your images and voice recordings: see and download them, and read the transcriptsOff unless you tick it.
- Your docs: read and download the files in tables' Docs sectionsOff unless you tick it.
- Make webhooksOff unless you tick it.
To change them, make a new key and revoke the old one in My Profile → Connected apps. A revoked key stops working within about a minute, and its webhooks are deleted. A password or email change ends every key. The same key also connects apps that can't sign in to the MCP server, where it never deletes.
Integration Credits
The API and webhooks run on Integration Credits, kept apart from AI credits: those stay for SelfManager's own AI and for AI assistants connected through MCP.
Included in your plan, every week.
The Individual plan ($8 a month) includes 100 Integration Credits a week, the 7-day free trial too, and the Team plan ($30 a month, for the whole team) 300. They renew every Monday at 00:00 UTC.
Shared with your team, if you like.
A Team plan's owner can let the people who can edit their tables use the plan's Integration Credits, from the Subscription page. They can then use the API without a plan of their own.
What a request costs
0 credits
Reading one thing, and changing what is already there.
- Reading a day, a table or a list (every comment and every table's notes too), your journal, a repeating table, your AI History, what is shared, or your account.
- Tasks: completing, editing or reopening them, recording how long one took, and setting or removing deadlines.
- Tables: pinning them, changing a table's settings, editing a repeating table, and making a day's repeating tables.
- Images, recordings and docs: listing them, and reading a recording's transcript or a doc's text.
- Deleting, and resetting a table's task times.
- Managing webhooks: making, listing, testing and deleting them.
From 1 Integration Credit
Reading many things, searching, downloading, and adding anything new.
- Reading several days or totals, or the days you have tables on. A long range comes a page at a time, each page one request.
- Searching your tables.
- Downloading an image, a recording or a doc.
- Adding a table or a repeating table, tasks, a comment, notes or a journal line, rewriting a day's journal line, or saving a conversation to your AI History.
- Copying or moving a table, charged once it is done, never for one that stops.
- A webhook event, the first time it reaches your endpoint (sent in full, or answered with anything but a 410). Its retries are free, and one that never reached it costs nothing.
Adding a lot at once
25 tasks for 1 Integration Credit
Wherever they are added, so 26 tasks are 2 credits. A new table's first 25 tasks come with it.
10 tables for 1 Integration Credit
When a request makes many tables at once: 30 daily tables of up to 25 tasks each are 3 credits.
1,000 tables in one request
At most, each with up to 200 tasks. Tasks added to a table: up to 200 a request.
- With too few credits left, a request that costs more does nothing and answers 402. Free requests keep working. Webhook events wait for credits, up to 7 days; then they are dropped.
- Your Subscription page shows what is left, and its usage history what used them: each request, and webhook events in batches.
More on plans on the Pricing page.
Limits
- 120 requests a minute for an account, refused ones included. Within them, a minute: 10 searches; 10 requests that make or change many tables at once (making several tables, copying, moving or deleting a table, editing a repeating table, resetting a table's task times, opening a day); 20 deletes; 20 downloads; 30 docs read; and 5 webhook tests.
- 10,000 requests a day (UTC), and 8 at once.
- In a day (UTC), across your keys and assistants: up to 100 deletes and 10 whole tables deleted, 50 tables copied or moved, and 50 deadlines set for everyone.
- Webhooks: from one table, at most 60 events and 300 deliveries a minute; from all your own tables, 300 and 1,500. Tables other people can change have as many again for each of their owners. What is over isn't sent.
- Sizes: a change's body is one JSON object of at most 1 MiB, and a download at most 8 MB; a larger file is downloaded in SelfManager.
Past a limit, the answer is a 429 with a Retry-After header: the seconds to wait.
How you can tell what it did
- Each change it makes to an existing table adds a line to that table's log, if the table keeps one (new tables do), ending in "via the API". Everyone on that table sees it. For example:
Row "Send the invoice" status changed from not started to completed (via the API)
- A comment it adds shows "via the API" next to your name, so the people you share with know. It never shows your key's name.
- The Assistant activity page lists what your keys changed in the last 30 days, also after you revoke them. My Profile → Connected apps lists your keys, and when each was last used.
- SelfManager sends you a notice whenever a key or a webhook is made.
Privacy
A key gets only the SelfManager data its requests ask for, as you, within the permissions you gave it: images, recordings and docs only if you allowed them. On a shared table, that includes what other members wrote, added or recorded, and their names, never their email addresses. Where your program keeps what it reads is up to you.
A webhook sends its events only to the address you chose. Whoever runs that address receives them, so send them only somewhere you trust.
For 30 days we keep a list of what each key changed, for your Assistant activity page: which table (by its name) or day, and when, never the text it wrote or what it deleted. So that a request sent twice is applied once, we keep each change's answer for a day. Each webhook delivery's record is kept for 8 days, for its retries and your list of latest deliveries.
What a key deletes is deleted as it is in SelfManager. Its images, recordings and docs are removed from our storage within minutes, with every stored copy, and a whole table's files go as when you delete the table in SelfManager; as for any file you delete, our storage provider can recover them for up to 7 days.
Read more in our Privacy Policy.
If something doesn't work
An error answers error.code and a message written for a person, and every answer the API gives has an X-Request-Id: quote it if you write to us. The ones you're most likely to meet:
- 401 unauthorized
- No key was sent, or it has expired or was revoked. A password or email change ends your keys too: make a new one.
- 403 not_in_beta
- Your account isn't in the beta yet. Write to marian@selfmanager.ai from the address you sign in with.
- 403 plan_inactive
- Start or renew a plan in SelfManager. The 7-day free trial counts.
- 403 insufficient_scope
- The key wasn't given the permission this request needs. Make a key that has it.
- 403 writes_off
- Changes through the API aren't switched on yet. Reading still works.
- 403 viewer_role
- You're a viewer on that table, so you can read it but not change it.
- 402 insufficient_credits
- Fewer Integration Credits are left than this request costs. Free requests keep working, and your weekly credits renew on Monday (UTC).
- 429 rate_limited
- Too many requests in a minute or in a day, or the Integration Credits left are held by requests still running or webhook events still being sent. Wait the seconds the Retry-After header gives.
- 409 conflict
- That Idempotency-Key was used before, with another request. Give each new request its own key.
- A webhook stopped sending
- A webhook nothing succeeds for in 3 days is turned off: fix your endpoint, then turn it on again in My Profile → Connected apps. One whose key has ended is deleted: make a new key, and the webhook again. With no Integration Credits left, events wait for them up to 7 days.
The endpoints
Each at https://api.selfmanager.ai/v1 followed by its path. Those without a price are free. The reference has every parameter and answer.
Reading 19
GET /v1/meWhose key it is: your name, plan, today's date, what the key may do, and your Integration Credits.GET /v1/days/{date}The tables on one day, with their tasks, progress and tracked time. The date can be today.GET /v1/daysThe same over any range, years too, a page at a time. 1 credit a pageGET /v1/totalsTotals per week or month over any range: tables, tasks, completed tasks, completion and time. 1 credit a pageGET /v1/datesThe days you have tables on, with how many on each. 1 credit a pageGET /v1/tables/{table_id}One table: every task, your deadlines on it, its notes, and its comments if asked.GET /v1/searchYour own tables, by a word or phrase in their name, tasks or notes (and comments if asked), over the last 30 days unless you give dates. 1 credit a pageGET /v1/pinsYour pinned tables, in their order.GET /v1/deadlinesYour deadlines, as the Deadlines page shows them.GET /v1/repeatsYour repeating tables: what repeats, how often, the next date.GET /v1/repeats/{repeat_id}One repeating table whole: its schedule, and the name, tasks and notes each copy starts with.GET /v1/journalYour journal (your daily Self message), for one day or any range. With the journal permission.GET /v1/commentsEvery comment you can see, newest first, with who wrote each (by name).GET /v1/notesEvery table's notes you can see, newest first.GET /v1/shared/with-meThe tables other people share with you, with whose each is and your role.GET /v1/shared/by-meYour tables other people can see, with who is on each (by name) and their role.GET /v1/ai-historyYour AI History: the AI Reviews and chats you saved, newest first.GET /v1/ai-history/{conversation_id}One conversation from your AI History, as text.GET /v1/ai-usageWhat used your AI credits, as the AI Usage page lists it.
Making changes 20
With the Make changes permission. In a table other people can see, adding and deadlines need that permission too.
POST /v1/tablesCreate a table of yours on a day, with up to 200 tasks and notes. 1 credit or morePOST /v1/tables/batchCreate up to 1,000 tables in one request, on any days, several on one day too. Needs an Idempotency-Key. 1 credit or morePOST /v1/tables/{table_id}/tasksAdd up to 200 tasks at the end of a table. 1 credit or morePATCH /v1/tables/{table_id}/tasks/{task_id}Change a task's priority or progress, or rename it in a table nobody else can read.POST /v1/tables/{table_id}/tasks/{task_id}/completeMark a task completed, as ticking it does: its time, who completed it, and the table's log.POST /v1/tables/{table_id}/tasks/{task_id}/reopenMark a completed task as not started. This deletes the time recorded for it.POST /v1/tables/{table_id}/tasks/{task_id}/timeRecord how long a task took: completes it with that time, or changes a done task's time.PUT · DELETE /v1/tables/{table_id}/tasks/{task_id}/deadlineSet or remove a task's deadline and reminder, for you, or for everyone on a table others see.POST /v1/tables/{table_id}/commentsAdd a comment, in your name. 1 creditPOST /v1/tables/{table_id}/notesAdd text at the end of a table's notes. 1 creditPATCH /v1/tables/{table_id}Rename a table, change its description or time tracking, turn its log on, or make it your homepage table.POST /v1/tables/{table_id}/duplicateCopy one of your tables, as Duplicate does: its tasks, and if you ask, its comments, images, audio, notes and log. Needs an Idempotency-Key. 1 credit, once doneGET /v1/jobs/{job_id}Whether a copy or a move is done.PUT · DELETE /v1/tables/{table_id}/pinPin a table, or unpin it.POST /v1/days/{date}/openMake a day's repeating tables, as opening that day in SelfManager does.POST /v1/repeatsMake a repeating table, as the Repeats page does, with its tasks, notes and schedule. 1 credit or morePATCH /v1/repeats/{repeat_id}Change what new copies start with, the schedule or the end date, or pause and resume it.POST /v1/journal/{date}Add text to a day's journal line. With the journal permission. 1 creditPUT /v1/journal/{date}Rewrite a day's journal line. The old line is kept, to bring back in SelfManager. 1 creditPOST /v1/ai-historySave a review or a chat to your AI History. 1 credit
Images, recordings and docs 6
With the images and recordings permission, or the docs permission.
GET /v1/imagesThe images on your tables and those shared with you, with who added each. One table's too.GET /v1/recordingsVoice recordings, with their length and whether they have a transcript. One table's too.GET /v1/tables/{table_id}/recordings/{recording_id}A recording's transcript.GET /v1/docsThe docs on tables you can see, with who added each. One table's too.GET /v1/tables/{table_id}/docs/{doc_id}A doc's text, a page at a time.GET /v1/tables/{table_id}/images/{image_id}/fileDownload the file itself, up to 8 MB: an image (a HEIC as its JPEG), a recording (…/recordings/{recording_id}/file) or a doc (…/docs/{doc_id}/file). 1 credit
Deleting 12
Only with "Delete through the API", ticked when the key was made: one thing at a time, in tables only you can see. Moving a table needs it too, since the table leaves its day.
DELETE /v1/tables/{table_id}/tasks/{task_id}Delete one task, with its deadline.DELETE /v1/tables/{table_id}/comments/{comment_id}Delete one comment, with its images and voice recordings.DELETE /v1/tables/{table_id}/notesEmpty a table's notes. The old notes stay one undo away in SelfManager.DELETE /v1/tables/{table_id}/images/{image_id}Delete one image.DELETE /v1/tables/{table_id}/recordings/{recording_id}Delete one voice recording.DELETE /v1/tables/{table_id}/docs/{doc_id}Delete one doc, with its file and its text. With the docs permission too.GET /v1/tables/{table_id}/delete-previewWhat is in a table, and the confirmation deleting it needs. It changes nothing.DELETE /v1/tables/{table_id}Delete a whole table you own that nobody else can see, within 5 minutes of its preview.POST /v1/tables/{table_id}/moveMove a table of yours that nobody else sees to another day, with everything in it. Needs an Idempotency-Key. 1 credit, once donePOST /v1/tables/{table_id}/reset-timesSet every task's times in a table to now, as "Reset time on all rows" does.DELETE /v1/repeats/{repeat_id}Delete a repeating table: no new copies are made, and the tables it made stay.DELETE /v1/journal/{date}Clear a day's journal line. It is kept, to bring back in SelfManager.
Webhooks 6
With the webhooks permission. A key manages the webhooks it made.
POST /v1/webhooksMake a webhook. The answer holds its secret, shown only there.GET /v1/webhooksThe webhooks this key made, and how each one's last delivery went.GET /v1/webhooks/{webhook_id}One webhook, with its latest 20 deliveries.POST /v1/webhooks/{webhook_id}/testSend it a ping now, and see how your endpoint answered.POST /v1/webhooks/{webhook_id}/rotate-secretA new secret. For 24 hours each delivery is signed with both.DELETE /v1/webhooks/{webhook_id}Delete a webhook: nothing more is sent to it.
