SelfManager API
Version 1.0.0 · OpenAPI description
Read and change your SelfManager tables from your own scripts and automations.
Keys. Make a personal API key in SelfManager, under My Profile, Connected apps, and send it with every request as Authorization: Bearer <key>. A key acts as you, with the permissions you gave it: read (read your tables, tasks, notes and comments); write (create tables and tasks, and change them); shared (add tasks, comments and notes in tables other people can see, and set deadlines there); journal (read your journal, and add to it with write). Keep it out of web pages and apps other people run: the API sends no CORS headers.
Ids. A table is addressed by the table_id every answer gives it: /v1/tables/ followed by that id. URL-encode each part.
Answers are JSON. A range of days, totals, the journal, a search and most lists answer a page at a time, and a range can be any length, years too: an answer with a cursor has more, so send the same request with that cursor for the next page. Other lists are bounded: what didn't fit is left out, and the answer says truncated: true with a hint. Text that people wrote (names, notes, comments) is plain text.
Changes take their values as one JSON object in the body, sent as application/json, at most 1 MiB. What a change writes is what SelfManager itself would write, and the table's log says it came through the API.
Retries. Send an Idempotency-Key header of your choosing (up to 200 characters) with a request that changes something. Sent again with the same key after the first has finished, the same request answers what it answered first and changes nothing twice. A first attempt that failed before it changed anything is forgotten, so sending it again runs it. A key is remembered for 24 hours, for the API key it came with and the kind of change (a table's two addresses are one kind). The same key with a different request is a 409, and so is one sent while the first is still running.
Limits. 120 requests a minute for an account, refused requests included, and 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 of one thing; 20 downloads; 30 docs read. Also 10,000 requests a day (UTC), and 8 at once. Past them the answer is 429 with Retry-After: the seconds to wait, until midnight UTC for the day's, 5 for too many at once. Each of SelfManager's servers counts on its own, so under load a burst may get further before a 429: don't count on it.
Prices, while Integration Credits are charged: Reading a day, a table or a list, ticking or editing tasks, pinning tables, editing a repeating table, opening a day's repeating tables, deleting, and reading a recording's transcript or a doc's text are free. Reading several days, which days have tables, or totals, searching, downloading a file, copying or moving a table (once it is done), and adding tables, repeating tables, tasks, comments, notes or a conversation saved to AI History, or adding to or rewriting a journal line, use 1 Integration Credit a request (each page of a long range is one). Tasks use 1 Integration Credit for every 25 added or part of 25, a new table's first 25 included, and making many tables at once 1 Integration Credit for every 10 tables or part of 10. Weekly credits reset on Monday (UTC). Each endpoint below says its own.
Errors are {"error": {"code", "message"}}; the message is written for a person. Every answer the API gives has an X-Request-Id header. A request that can't be taken at all (a body larger than 1 MiB, a compressed body, a path whose % doesn't begin a UTF-8 character) can be turned away before it reaches the API, with a plain-text 400, 413 or 415 and neither.
| Status | code | When |
|---|---|---|
| 400 | invalid_request | A parameter is missing, wrong or unknown, or the address isn't well formed. |
| 401 | unauthorized | No key was sent, or it has expired, was revoked, or its account is gone. |
| 402 | insufficient_credits | Requests use Integration Credits, and fewer are left than this one costs. |
| 403 | forbidden | SelfManager's access rules refused it, or it is a change the API doesn't make (such as renaming a task in a table other people can see). |
| 403 | insufficient_scope | The key lacks a permission the request needs. |
| 403 | not_in_beta | The API, or its webhooks, are in a private beta that doesn't include this account yet. |
| 403 | plan_inactive | The account has no active plan. |
| 403 | viewer_role | You are a viewer on that table, so you can't change it. |
| 403 | writes_off | Changes through the API aren't switched on. |
| 404 | not_found | No such table, task, file or webhook, or you can't see it; or no such endpoint. |
| 405 | method_not_allowed | The endpoint doesn't take that method. Allow lists those it takes. |
| 409 | conflict | That Idempotency-Key was used before, with another request. |
| 409 | request_in_progress | The request with that Idempotency-Key is still running. |
| 413 | too_large | The body is larger than 1 MiB; usually turned away before it reaches the API, as plain text. |
| 415 | unsupported_media_type | The body isn't sent as application/json. |
| 422 | cannot_apply | The request is fine, but the data's state prevents it. |
| 429 | rate_limited | Too many requests in a minute or in a day, or the credits left are held by requests still running or webhook events still being sent. Retry-After says how long to wait. |
| 500 | server_error | Something failed on SelfManager's side. Quote request_id when you report it. |
| 503 | unavailable | The API, or its webhooks, are switched off. |
| 504 | timed_out | A change stopped before it could run out of time. Nothing was half written: a request that makes many tables made some of them whole, and says how many. Send it again with the same Idempotency-Key to make the rest. |
Endpoints
GET /v1/me Your SelfManager accountGET /v1/days Tables over several daysGET /v1/totals Totals over a rangeGET /v1/dates Days with tablesGET /v1/days/{date} Tables on a dayPOST /v1/days/{date}/open Open a dayGET /v1/tables/{date}/{table_key} One tableGET /v1/search Search your tablesGET /v1/pins Pinned tablesGET /v1/deadlines DeadlinesGET /v1/repeats Repeating tablesGET /v1/repeats/{repeat_id} One repeating tablePATCH /v1/repeats/{repeat_id} Change a repeating tableGET /v1/journal JournalGET /v1/ai-history Your AI HistoryPOST /v1/ai-history Save to AI HistoryGET /v1/ai-history/{conversation_id} One AI History conversationPOST /v1/tables Create a tablePOST /v1/tables/batch Create many tablesPOST /v1/tables/{date}/{table_key}/tasks Add tasksPATCH /v1/tables/{date}/{table_key}/tasks/{task_id} Update a taskPOST /v1/tables/{date}/{table_key}/tasks/{task_id}/complete Complete a taskPOST /v1/tables/{date}/{table_key}/tasks/{task_id}/reopen Reopen a taskPOST /v1/tables/{date}/{table_key}/comments Add a commentPOST /v1/tables/{date}/{table_key}/notes Add to a table's notesPOST /v1/journal/{date} Add to your journalGET/v1/me
Your SelfManager account.
Whose key this is: display name, plan, today's date and the timezone used, what the key may do, and the Integration Credits its requests spend. When requests use them, it also says how many are left.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/me"
Answer
display_namestring, optionalplan"Individual", "Team", "Trial", "Team credits", optionaltodaystring, optional Today's date in your timezone, as YYYY-MM-DD. Absent when the timezone isn't known.timezonestring, optional The IANA timezone in use. Absent when none is known.timezone_notestring, optionalscopeslist of "read", "write", "shared", "delete", "journal", "media", "docs", "webhooks" What this connection may do.connection"assistant", "personal_api_key"ai_credits_leftinteger, optional Only while requests use AI credits, which the API's no longer do: see integration_credits_left.ai_credits_notestring, optionalcreditsobject, optional Your AI credits, which SelfManager's AI features and AI assistants spend; the API's requests spend Integration Credits. Absent when they can't be read, or there are none to spend.weekly_leftinteger This week's AI credits left.weekly_allowanceinteger The plan's AI credits each week.used_this_weekinteger Weekly AI credits used this week.purchasedinteger Bought AI credits left. They never expire.totalinteger All AI credits left: weekly, then purchased.renews_onstring The Monday (UTC) the weekly AI credits renew, as YYYY-MM-DD.pool"yours", "team_owner" Your own credits, or a Team owner's you spend.
integration_credits_leftinteger, optional Only while requests use Integration Credits.integration_credits_notestring, optionalintegration_creditsobject, optional The credits the API's requests spend. Absent when they can't be read, or there are none to spend.weekly_leftinteger This week's Integration Credits left.weekly_allowanceinteger The plan's Integration Credits each week.used_this_weekinteger Weekly Integration Credits used this week.purchasedinteger Bought Integration Credits left. They never expire.totalinteger All Integration Credits left: weekly, then purchased.renews_onstring The Monday (UTC) the weekly Integration Credits renew, as YYYY-MM-DD.pool"yours", "team_owner" Your own credits, or a Team owner's you spend.
storageobject, optional Your docs storage. What you add to someone else's table counts on its owner, not here. Absent when it can't be read.used_bytesinteger What your own docs take, in bytes.allowance_bytesinteger or null What you may hold in docs, in bytes: your plan's, plus any extra space bought; null without a plan.used_percentinteger The share used, 0 to 100.usedstring In words, as the app's meter says it: "1.2 GB of 5 GB used".
GET/v1/days
Tables over several days.
Tables over a range of any length (years too), by day, with progress and tracked time, a page at a time: when the answer has a cursor, ask again with the same arguments and that cursor for the next page. Days with no tables are left out. Set detail to tasks for their tasks too. Repeating tables that haven't been created yet appear with planned: true. For totals over a long range, GET /v1/totals is shorter.
A key needs: read. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
start_date | query | string | A date as YYYY-MM-DD, from 2000 to 2099. |
end_date | query | string | A date as YYYY-MM-DD, from 2000 to 2099. |
scope | query, optional | "all", "mine", "shared" | Whose tables: all (default), only yours, or only those shared with you. |
detail | query, optional | "summary", "tasks", "full" | summary (default): tables only; tasks: their tasks too; full: their tasks with every field (when each was created and started, and by whom). |
cursor | query, optional | string | The cursor an earlier answer gave, with the same other arguments: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/days?start_date=…&end_date=…"
Answer
start_datestringend_datestringdayslist of objectdatestringtableslist of objecttable_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestring The table's day, as YYYY-MM-DD.sharedboolean, optional True when other people can see the table.your_role"owner", "admin", "member", "viewer", optionalcompletion_percentinteger, optionaltask_countinteger, optionalcompleted_countinteger, optionaltracked_minutesinteger, optional Only for a table that tracks time, or one with tasks timed one by one (those alone count).has_notesboolean, optionalplannedboolean, optional True for a repeating table that hasn't been created for that day yet.too_bigboolean, optional True for a table with more than 1,000 tasks: too many to read here, so neither its tasks nor its progress are given. Open it in SelfManager.taskslist of object, optionaltask_idstring, optional The task's id. A task of a repeating table not created yet has none.namestringstatus"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optionalpriority"critical", "high", "medium", "low", "minor", "optional"completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.duration_minutesinteger, optional Tracked time of a completed task: in a table that tracks time, or a task timed one by one.created_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.started_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.created_by_namestring, optionalcompleted_by_namestring, optionaldeadlinestring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.deadline_metboolean, optional
timezonestring or null, optional The IANA timezone the answer was worked out in, or null when none is known.todaystring or null, optional Today's date in that timezone, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.cursorstring, optional Present when there is more: ask again with the same arguments and this cursor for the next page. Absent on the last page.
GET/v1/totals
Totals over a range.
Totals over a range of any length (years too), per week or month: tables, tasks, completed tasks, completion and tracked time, also by table name. Every task counts as in GET /v1/days; repeating tables not created yet don't. Weeks or months with no tables are left out. A page at a time: when the answer has a cursor, ask again with the same arguments and that cursor. A period marked partial is split across pages: add up the parts with the same start.
A key needs: read. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
start_date | query | string | A date as YYYY-MM-DD, from 2000 to 2099. |
end_date | query | string | A date as YYYY-MM-DD, from 2000 to 2099. |
scope | query, optional | "all", "mine", "shared" | Whose tables: all (default), only yours, or only those shared with you. |
group_by | query, optional | "week", "month" | week (Monday to Sunday) or month (the default). |
cursor | query, optional | string | The cursor an earlier answer gave, with the same other arguments: where the next page starts. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/totals?start_date=…&end_date=…"
Answer
start_datestringend_datestringgroup_by"week", "month"periodslist of objectstartstring The period's first day in the range, as YYYY-MM-DD.endstring Its last day in the range.tablesintegertoo_big_tablesinteger, optional Of them, tables with more than 1,000 tasks: too many to read here, so their tasks aren't in these counts.task_countintegercompleted_countintegercompletion_percentinteger Progress of the tasks that count (canceled ones don't), by the same weights as a table's.tracked_minutesinteger, optional Where a table counts time: one that tracks time, or one with tasks timed one by one.by_namelist of object The 10 table names with the most tables, most first.namestringtablesintegertoo_big_tablesinteger, optional Of them, tables with more than 1,000 tasks: too many to read here, so their tasks aren't in these counts.task_countinteger, optionalcompleted_countinteger, optionalcompletion_percentinteger, optional Progress of the tasks that count (canceled ones don't), by the same weights as a table's.tracked_minutesinteger, optional Where a table counts time: one that tracks time, or one with tasks timed one by one.
other_namesobject, optional Every other name, added up.namesinteger How many other names.tablesinteger, optionaltoo_big_tablesinteger, optional Of them, tables with more than 1,000 tasks: too many to read here, so their tasks aren't in these counts.task_countinteger, optionalcompleted_countinteger, optionalcompletion_percentinteger, optional Progress of the tasks that count (canceled ones don't), by the same weights as a table's.tracked_minutesinteger, optional Where a table counts time: one that tracks time, or one with tasks timed one by one.
partialboolean, optional True when another page holds the rest of this period.
truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.cursorstring, optional Present when there is more: ask again with the same arguments and this cursor for the next page. Absent on the last page.
GET/v1/dates
Days with tables.
The days that have tables, each once with how many tables it has, over any range: all time when no dates are given. Days from today on also count the repeating tables planned there and not made yet (planned), through end_date; without end_date, only today's: give end_date to see repeats planned ahead. Without start_date it starts at your first day with a table, or today if that's earlier (end_date, if earlier still); without end_date it runs through your last day with a table, or today if that's later. A page at a time: when the answer has a cursor, ask again with the same arguments and that cursor, and add up the pages' counts. GET /v1/days lists the tables themselves.
A key needs: read. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
start_date | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
end_date | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
scope | query, optional | "all", "mine", "shared" | Whose tables: all (default), only yours, or only those shared with you. |
cursor | query, optional | string | The cursor an earlier answer gave, with the same other arguments: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/dates"
Answer
start_datestring The first day read, as YYYY-MM-DD: the one asked for, or your first day with a table, or today if earlier (end_date, if earlier still).end_datestring The last day read: the one asked for, or your last day with a table (today, if later).dateslist of objectdatestring The day, as YYYY-MM-DD.tablesinteger How many tables it has.plannedinteger, optional How many repeating tables are planned on it and not made yet, through end_date or, without one, today; absent when none.
date_countinteger How many days this answer lists.table_countinteger Their tables, added up.planned_countinteger Their planned repeating tables, added up.timezonestring or null, optional The IANA timezone the answer was worked out in, or null when none is known.todaystring or null, optional Today's date in that timezone, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.cursorstring, optional Present when there is more: ask again with the same arguments and this cursor for the next page. Absent on the last page.
GET/v1/days/{date}
Tables on a day.
The tables on one day, with their tasks, progress and tracked time. Repeating tables that haven't been created yet appear with planned: true.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. Or today, which needs your timezone to be known (see GET /v1/me). |
scope | query, optional | "all", "mine", "shared" | Whose tables: all (default), only yours, or only those shared with you. |
detail | query, optional | "normal", "full" | normal (default) keeps the answer small; full allows more tables, tasks and text. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/days/<date>"
Answer
datestring The day, as YYYY-MM-DD.tableslist of objecttable_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestring The table's day, as YYYY-MM-DD.sharedboolean, optional True when other people can see the table.your_role"owner", "admin", "member", "viewer", optionalcompletion_percentinteger, optionaltask_countinteger, optionalcompleted_countinteger, optionaltracked_minutesinteger, optional Only for a table that tracks time, or one with tasks timed one by one (those alone count).has_notesboolean, optionalplannedboolean, optional True for a repeating table that hasn't been created for that day yet.too_bigboolean, optional True for a table with more than 1,000 tasks: too many to read here, so neither its tasks nor its progress are given. Open it in SelfManager.taskslist of object, optionaltask_idstring, optional The task's id. A task of a repeating table not created yet has none.namestringstatus"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optionalpriority"critical", "high", "medium", "low", "minor", "optional"completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.duration_minutesinteger, optional Tracked time of a completed task: in a table that tracks time, or a task timed one by one.created_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.started_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.created_by_namestring, optionalcompleted_by_namestring, optionaldeadlinestring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.deadline_metboolean, optional
timezonestring or null, optional The IANA timezone the answer was worked out in, or null when none is known.todaystring or null, optional Today's date in that timezone, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.
POST/v1/days/{date}/open
Open a day.
Make the repeating tables planned for a day (planned: true in GET /v1/days/{date}), exactly as opening that day in SelfManager does, and answer with the day's tables and every task's id. Only your own repeating tables, only from today on; nothing else changes, and a table already made is left as it is.
A key needs: read, write. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. Or today, which needs your timezone to be known (see GET /v1/me). |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
"https://api.selfmanager.ai/v1/days/<date>/open"
Answer
datestring The day, as YYYY-MM-DD.tableslist of objecttable_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestring The table's day, as YYYY-MM-DD.sharedboolean, optional True when other people can see the table.your_role"owner", "admin", "member", "viewer", optionalcompletion_percentinteger, optionaltask_countinteger, optionalcompleted_countinteger, optionaltracked_minutesinteger, optional Only for a table that tracks time, or one with tasks timed one by one (those alone count).has_notesboolean, optionalplannedboolean, optional True for a repeating table that hasn't been created for that day yet.too_bigboolean, optional True for a table with more than 1,000 tasks: too many to read here, so neither its tasks nor its progress are given. Open it in SelfManager.taskslist of object, optionaltask_idstring, optional The task's id. A task of a repeating table not created yet has none.namestringstatus"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optionalpriority"critical", "high", "medium", "low", "minor", "optional"completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.duration_minutesinteger, optional Tracked time of a completed task: in a table that tracks time, or a task timed one by one.created_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.started_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.created_by_namestring, optionalcompleted_by_namestring, optionaldeadlinestring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.deadline_metboolean, optional
timezonestring or null, optional The IANA timezone the answer was worked out in, or null when none is known.todaystring or null, optional Today's date in that timezone, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.changedboolean True: this request made at least one repeating table.madelist of object The repeating tables this request made.table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestring The table's name.
not_madelist of object, optional Planned ones SelfManager can't make from here, and why.table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestring The table's name.reasonstring
notestring, optional Something worth knowing: a day that has passed, or more to make.
GET/v1/tables/{date}/{table_key}
One table.
One table with every task, your deadlines on it, its notes, and its comments if asked. Completion times are kept on tables that track time, and for tasks timed one by one on others.
A key needs: read. Price: free.
For a table that someone else owns: GET /v1/tables/{date}/{table_key}/{owner_tag}
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
owner_tag | address | string | The third part of the id of a table someone else owns. |
include_notes | query, optional | boolean | Include the notes (default true). |
include_comments | query, optional | boolean | Include comments (default false). |
comments_limit | query, optional | integer | Comments per page (default 20). |
cursor | query, optional | string | comments_cursor from a previous answer. |
detail | query, optional | "normal", "full" | normal (default) keeps the answer small; full allows more tables, tasks and text. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestring The table's day, as YYYY-MM-DD.sharedboolean, optional True when other people can see the table.your_role"owner", "admin", "member", "viewer", optionalcompletion_percentinteger, optionaltask_countinteger, optionalcompleted_countinteger, optionaltracked_minutesinteger, optional Only for a table that tracks time, or one with tasks timed one by one (those alone count).has_notesboolean, optionalplannedboolean, optional True for a repeating table that hasn't been created for that day yet.too_bigboolean, optional True for a table with more than 1,000 tasks: too many to read here, so neither its tasks nor its progress are given. Open it in SelfManager.taskslist of objecttask_idstring, optional The task's id. A task of a repeating table not created yet has none.namestringstatus"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optionalpriority"critical", "high", "medium", "low", "minor", "optional"completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.duration_minutesinteger, optional Tracked time of a completed task: in a table that tracks time, or a task timed one by one.created_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.started_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.created_by_namestring, optionalcompleted_by_namestring, optionaldeadlinestring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.deadline_metboolean, optional
descriptionstring, optionalnotesstring, optional The table's notes, as plain text.commentslist of object, optionalcomment_idstringauthor_namestring, optionalby_youbooleanwritten_viastring, optional The connected app that wrote it for its author, when one did.textstringcreated_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.image_idslist of string, optional Its images, when it has any, while this connection may delete or see them.recording_idslist of string, optional Its voice recordings, when it has any, while this connection may delete or listen to them.
comments_cursorstring, optional Pass it as cursor for the next page of comments. Absent on the last page.imageslist of object, optional The table's own images, newest first, while this connection may delete or see them.image_idstringadded_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.
recordingslist of object, optional Voice recordings in its Audio section and notes, newest first, while this connection may delete or listen to them.recording_idstringwhere"audio", "notes" The table's Audio section, or its notes.added_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.length_secondsinteger, optional
docslist of object, optional The files in its Docs section, newest first, while this connection may read them.doc_idstringfile_namestringkindstringhas_textboolean WhetherGET /v1/tables/{date}/{table_key}/docs/{doc_id}has its text.added_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.
peoplelist of object, optional Who a comment of yours can @mention on this table, while this connection may mention people.person_idstring The id a comment's mentions name them by.namestring Write @ and this name in a comment that mentions them.role"owner", "admin", "member", "viewer"
planned_notestring, optionaltimezonestring or null The IANA timezone the answer was worked out in, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.
GET/v1/search
Search your tables.
Search the tables you own for a word or phrase (the exact text, in any case, not each word apart) in their name, description, tasks or notes, and in comments when fields includes comments, within a date window of any length (the last 30 days by default), newest first. One call looks through up to 1,000 tables: when the answer has a cursor, older tables in the window are left, so ask again with the same arguments and that cursor. It searches only tables you own: GET /v1/days/{date} and GET /v1/days read the ones others share with you.
A key needs: read. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
query | query | string | The words to find. |
fields | query, optional | list of "name", "description", "tasks", "notes", "comments" | Where to look (default name, description, tasks and notes). |
date_from | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
date_to | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
limit | query, optional | integer | At most this many tables (default 10). |
cursor | query, optional | string | The cursor an earlier answer gave, with the same other arguments: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/search?query=…"
Answer
querystringdate_fromstringdate_tostringresultslist of objecttable_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestringmatched_inlist of "name", "description", "tasks", "notes", "comments"matching_taskslist of objecttask_idstringnamestring
searchedstring Which tables were searched.truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.cursorstring, optional Present when there is more: ask again with the same arguments and this cursor for the next page. Absent on the last page.
GET/v1/pins
Pinned tables.
Your pinned tables, in their order, with their date and progress.
A key needs: read. Price: free.
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/pins"
Answer
pinslist of objecttable_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestringdatestring The table's day, as YYYY-MM-DD.sharedboolean, optional True when other people can see the table.your_role"owner", "admin", "member", "viewer", optionalcompletion_percentinteger, optionaltask_countinteger, optionalcompleted_countinteger, optionaltracked_minutesinteger, optional Only for a table that tracks time, or one with tasks timed one by one (those alone count).has_notesboolean, optionalplannedboolean, optional True for a repeating table that hasn't been created for that day yet.too_bigboolean, optional True for a table with more than 1,000 tasks: too many to read here, so neither its tasks nor its progress are given. Open it in SelfManager.taskslist of object, optionaltask_idstring, optional The task's id. A task of a repeating table not created yet has none.namestringstatus"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optionalpriority"critical", "high", "medium", "low", "minor", "optional"completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.duration_minutesinteger, optional Tracked time of a completed task: in a table that tracks time, or a task timed one by one.created_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.started_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.created_by_namestring, optionalcompleted_by_namestring, optionaldeadlinestring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.deadline_metboolean, optional
truncatedboolean True when something was left out or cut to keep the answer small.
GET/v1/deadlines
Deadlines.
Your deadlines, as the Deadlines page shows them: overdue, today, the next 7 days, later, or met. Grouping needs your timezone.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
filter | query, optional | "overdue", "today", "week", "later", "completed", "all" | Which deadlines (default all). |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/deadlines"
Answer
filter"overdue", "today", "week", "later", "completed", "all"timezonestring or null The IANA timezone the answer was worked out in, or null when none is known.deadlineslist of objecttask_namestringtable_namestringtable_idstring, optional The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.due_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.group"overdue", "today", "week", "later", "completed", optional Absent for an open deadline when the timezone isn't known.completed_atstring, optional A time as ISO 8601 with the timezone's offset, or in UTC (ending in Z) when the timezone isn't known.
truncatedboolean True when something was left out or cut to keep the answer small.
GET/v1/repeats
Repeating tables.
Your repeating tables: what repeats, how often, the next date, and whether it is paused. Each date it repeats on gets its own copy; changing one day's copy doesn't change the repeat. GET /v1/repeats/{repeat_id} reads one whole, and PATCH /v1/repeats/{repeat_id} changes it.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/repeats"
Answer
repeats_enabledboolean False when repeating tables are switched off in Settings.repeatslist of objectrepeat_idstring Its id, forGET /v1/repeats/{repeat_id}andPATCH /v1/repeats/{repeat_id}.namestringcadencestring How often, in words.status"active", "paused"next_datestring, optionalstart_datestring, optionalend_datestring, optional
timezonestring or null The IANA timezone the answer was worked out in, or null when none is known.truncatedboolean True when something was left out or cut to keep the answer small.notestring, optional
GET/v1/repeats/{repeat_id}
One repeating table.
One of your repeating tables whole: its schedule, and the name, description, tasks and notes each copy starts with, plus how many tables it has already made for today on. Its id comes from GET /v1/repeats.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
repeat_id | address | string | The repeating table's id, as GET /v1/repeats gives it. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/repeats/<repeat_id>"
Answer
repeat_idstringnamestring The name each copy gets.status"active", "paused"cadencestring How often, in words.start_datestringend_datestring, optionalnext_datestring, optionalscheduleobjectfrequency"daily", "weekly", "monthly"intervalinteger Every this many days, weeks or months.weekdayslist of "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", optionalmonth_dayslist of integer, optional
descriptionstring, optionaltaskslist of objectnamestringpriority"critical", "high", "medium", "low", "minor", "optional"
too_bigboolean, optional True when its blueprint has more than 1,000 tasks: too many to read here, so none are given.notesstring, optional Its notes, as plain text.future_tablesinteger Tables it has already made, for today on.repeats_enabledboolean False when repeating tables are switched off in Settings.editableboolean WhetherPATCH /v1/repeats/{repeat_id}can change it.timezonestring or nulltruncatedboolean
PATCH/v1/repeats/{repeat_id}
Change a repeating table.
Change a repeating table as SelfManager's Repeats page does: what each new copy starts with (name, description, the whole task list, notes as plain text that replaces them), the schedule, the end date (null removes it), or pause and resume it. Tables already made keep the old version unless also_update_future is true: then those for today on that nobody worked in, and nobody else can see, are updated too, never their notes. It never deletes a repeat or changes its start date.
Give at least one of name, description, tasks, notes, schedule, end_date, status and also_update_future.
A key needs: read, write. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
repeat_id | address | string | The repeating table's id, as GET /v1/repeats gives it. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
namestring, optionaldescriptionstring, optional "" removes it.taskslist of object, optional The whole new task list, in order: tasks left out are removed.namestringpriority"critical", "high", "medium", "low", "minor", "optional", optional critical, high, medium, low, minor or optional (the default).
notesstring, optional Plain text that replaces the notes (each line a paragraph; their formatting isn't kept); "" removes them.scheduleobject, optionalfrequency"daily", "weekly", "monthly"intervalinteger, optional Every this many days, weeks or months (default 1).weekdayslist of "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", optional Weekly only: the days.month_dayslist of integer, optional Monthly only: the days of the month (the 31st falls on a short month's last day).
end_datestring or null, optional The last date it repeats on, as YYYY-MM-DD; null removes the end.status"active", "paused", optional paused stops new copies; active resumes.also_update_futureboolean, optional Also update the tables it already made for today on that nobody worked in (default false).timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X PATCH -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"name":"Call the bank"}' \
"https://api.selfmanager.ai/v1/repeats/<repeat_id>"
Answer
repeat_idstringnamestring The name each copy gets.status"active", "paused"cadencestring How often, in words.start_datestringend_datestring, optionalnext_datestring, optionalchangedbooleanchanged_fieldslist of "name", "description", "tasks", "notes", "schedule", "end_date", "status"future_tablesobject, optional With also_update_future: what happened to the tables already made for today on.updatedinteger, optionalalready_currentinteger, optionalleft_alone_worked_ininteger, optionalleft_alone_sharedinteger, optionalnot_updatedinteger, optionalnot_reachedinteger, optional
notestring, optionaltruncatedboolean
GET/v1/journal
Journal.
Your daily journal (self messages) for one date, or a range of any length, a page at a time: when the answer has a cursor, ask again with the same arguments and that cursor. Without a date it uses today, which needs your timezone.
A key needs: read, journal. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
start_date | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
end_date | query, optional | string | A date as YYYY-MM-DD, from 2000 to 2099. |
detail | query, optional | "normal", "full" | normal (default) keeps the answer small; full allows more tables, tasks and text. |
cursor | query, optional | string | The cursor an earlier answer gave, with the same other arguments: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/journal"
Answer
start_datestringend_datestringentrieslist of objectdatestringtextstring
truncatedboolean True when something was left out or cut to keep the answer small.hintstring, optional What to ask for instead, when something was left out.cursorstring, optional Present when there is more: ask again with the same arguments and this cursor for the next page. Absent on the last page.
GET/v1/ai-history
Your AI History.
The conversations saved in your AI History, newest first: SelfManager's AI Reviews, tables' AI chats, and those an assistant saved. Titles, kinds, dates and a short preview, a page at a time: when the answer has a cursor, ask again with it for older ones. GET /v1/ai-history/{conversation_id} reads one.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
cursor | query, optional | string | The cursor an earlier answer gave: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/ai-history"
Answer
conversationslist of objectconversation_idstringtitlestringkind"ai_review", "table_chat", "pinned_tables", "assistant", "other" ai_review: SelfManager's AI Review; table_chat: a table's AI chat; pinned_tables: the pinned tables' chat; assistant: one an assistant saved.type"summary", "chat", "follow_up"created_atstringentry_countintegerappstring, optional The assistant that saved it, for kind assistant.periodstring, optional The period a review covers.table_namestring, optionalpreviewstring, optional
truncatedbooleancursorstring, optionalhintstring, optional
POST/v1/ai-history
Save to AI History.
Save a review or a chat to your AI History in SelfManager, where it shows beside the app's own AI Reviews, marked as the API's. Plain text: entries in order, each user or assistant. It can't be changed or deleted through the API afterwards.
A key needs: read, write. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
titlestring A short title.kind"review", "chat"periodobject, optionalstart_datestring A date as YYYY-MM-DD, from 2000 to 2099.end_datestring A date as YYYY-MM-DD, from 2000 to 2099.
entrieslist of objectrole"user", "assistant"textstring
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"title":"…","kind":"review","entries":[{"role":"user","text":"…"}]}' \
"https://api.selfmanager.ai/v1/ai-history"
Answer
conversation_idstringtitlestringentry_countintegersaved_atstring
GET/v1/ai-history/{conversation_id}
One AI History conversation.
One conversation from your AI History, its entries in order as plain text (role user or assistant), a page of them at a time: when the answer has a cursor, ask again with it.
A key needs: read. Price: free.
Parameters
| Name | Where | Type | |
|---|---|---|---|
conversation_id | address | string | The conversation's id, as GET /v1/ai-history gives it. |
cursor | query, optional | string | The cursor an earlier answer gave: where the next page starts. |
timezone | query, optional | string | Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you. |
Example
curl -H "Authorization: Bearer $SELFMANAGER_KEY" \
"https://api.selfmanager.ai/v1/ai-history/<conversation_id>"
Answer
conversation_idstringtitlestringkind"ai_review", "table_chat", "pinned_tables", "assistant", "other" ai_review: SelfManager's AI Review; table_chat: a table's AI chat; pinned_tables: the pinned tables' chat; assistant: one an assistant saved.type"summary", "chat", "follow_up"created_atstringentry_countintegerappstring, optional The assistant that saved it, for kind assistant.periodstring, optional The period a review covers.table_namestring, optionalupdated_atstring, optionalentrieslist of objectrole"user", "assistant"textstring
truncatedbooleancursorstring, optionalhintstring, optional
POST/v1/tables
Create a table.
Create one table of yours on a day, with up to 200 tasks and optional notes. For several tables, or one table on many days, use POST /v1/tables/batch: one call. To add tasks to a table that exists, use POST /v1/tables/{date}/{table_key}/tasks. Time isn't tracked unless track_time is true, as in the app. Give an Idempotency-Key header to make a retry safe.
A key needs: read, write. Price: 1 Integration Credit or more, by what it makes (Prices).
Parameters
| Name | Where | Type | |
|---|---|---|---|
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
datestring A date as YYYY-MM-DD, from 2000 to 2099.namestring The table's name.descriptionstring, optional Optional description.taskslist of object, optionalnamestring What to do.priority"critical", "high", "medium", "low", "minor", "optional", optional critical, high, medium, low, minor or optional (the default).
notesstring, optional Optional notes, as plain text: each line becomes a paragraph.track_timeboolean, optional Track time on its tasks (default false).
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"date":"…","name":"…"}' \
"https://api.selfmanager.ai/v1/tables"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.namestring The table's name.datestring The table's day, as YYYY-MM-DD.taskslist of objecttask_idstringnamestringpriority"critical", "high", "medium", "low", "minor", "optional"
has_notesbooleantracks_timeboolean
POST/v1/tables/batch
Create many tables.
Create up to 1,000 tables of yours in one request, on any days, several on one day too. Each entry is one table on its date, or the same table on each of its dates, with up to 200 tasks and optional notes, as POST /v1/tables makes them. The Idempotency-Key header is required: when a request times out, or answers 504 having run out of time, send it again with the same key to make what is missing, never anything twice.
A key needs: read, write. Price: 1 Integration Credit or more, by what it makes (Prices).
Parameters
| Name | Where | Type | |
|---|---|---|---|
Idempotency-Key | header | string | Required here. An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
tableslist of object The tables, in the order to make them.datestring, optional The day, as YYYY-MM-DD. Give date or dates.dateslist of string, optional The same table on each of these days, each day once. Give date or dates.namestring The table's name.descriptionstring, optional Optional description.taskslist of object, optional Up to 200 tasks.namestring What to do.priority"critical", "high", "medium", "low", "minor", "optional", optional critical, high, medium, low, minor or optional (the default).
notesstring, optional Optional notes, as plain text: each line becomes a paragraph.track_timeboolean, optional Track time on its tasks (default false).
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"tables":[{"name":"…"}]}' \
"https://api.selfmanager.ai/v1/tables/batch"
Answer
table_countinteger How many tables the request made, in all.first_datestring The first day a table was made on.last_datestring The last day a table was made on.tableslist of object Each entry's tables, in the order sent.GET /v1/tables/{date}/{table_key}shows a table's tasks.namestringtable_idslist of string One per date, in the order sent.
notestring, optional Something worth knowing, such as tables an earlier attempt made.
POST/v1/tables/{date}/{table_key}/tasks
Add tasks.
Add up to 200 tasks at the end of a table. A repeating table that hasn't been created for that day yet is created first. In a table other people can see (one shared with you, one of yours you share, or one with an invitation waiting), the key needs the shared permission.
A key needs: read, write. Price: 1 Integration Credit or more, by what it makes (Prices).
For a table that someone else owns: POST /v1/tables/{date}/{table_key}/{owner_tag}/tasks
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
taskslist of objectnamestring What to do.priority"critical", "high", "medium", "low", "minor", "optional", optional critical, high, medium, low, minor or optional (the default).
timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"tasks":[{"name":"…"}]}' \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/tasks"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.taskslist of objecttask_idstringnamestringpriority"critical", "high", "medium", "low", "minor", "optional"
notestring, optional Something worth knowing about what happened: a repeating table created first, or an earlier attempt of the same request found to have done it already.
PATCH/v1/tables/{date}/{table_key}/tasks/{task_id}
Update a task.
Rename a task, change its priority, or set its progress short of completed (POST /v1/tables/{date}/{table_key}/tasks/{task_id}/complete and POST /v1/tables/{date}/{table_key}/tasks/{task_id}/reopen change that). Progress canceled leaves a task out of the table's progress, and keeps it; deleting it is DELETE /v1/tables/{date}/{table_key}/tasks/{task_id}'s, where that is listed. Renaming works only in tables nobody else can read.
Give at least one of name, priority and progress.
A key needs: read, write. Price: free.
For a table that someone else owns: PATCH /v1/tables/{date}/{table_key}/{owner_tag}/tasks/{task_id}
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
task_id | address | string | The task's id, as the table's tasks give it. |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
namestring, optional The new name.priority"critical", "high", "medium", "low", "minor", "optional", optional critical, high, medium, low, minor or optional.progress"not_started", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optional How far along it is, short of completed.
Example
curl -X PATCH -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"name":"Call the bank"}' \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/tasks/<task_id>"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.task_idstringnamestring The task's name.status"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled", optional The task's progress as it reads now.changedboolean False when the task already read that way, so nothing was written.notestring, optional Something worth knowing about what happened, or why nothing did.priority"critical", "high", "medium", "low", "minor", "optional", optionalchanged_fieldslist of "status", "name", "priority", optional What was changed, when something was.
POST/v1/tables/{date}/{table_key}/tasks/{task_id}/complete
Complete a task.
Mark a task completed, as ticking it in SelfManager does: its time, who completed it, its deadline and the table's log. Works on your tables and on tables shared with you where you're an admin or member, not a viewer. A task of a table with planned: true has no task_id until POST /v1/days/{date}/open makes that day's copies. A task already completed is left as it is.
A key needs: read, write. Price: free.
For a table that someone else owns: POST /v1/tables/{date}/{table_key}/{owner_tag}/tasks/{task_id}/complete
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
task_id | address | string | The task's id, as the table's tasks give it. |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/tasks/<task_id>/complete"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.task_idstringnamestring The task's name.status"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled" The task's progress as it reads now.changedboolean False when the task already read that way, so nothing was written.notestring, optional Something worth knowing about what happened, or why nothing did.deadline"met", "restored", optional What happens to the task's deadline, when it has one: met, for everyone it reminds, or back.tracked_time_deletedboolean, optional True when reopening deleted the time recorded for the task.
POST/v1/tables/{date}/{table_key}/tasks/{task_id}/reopen
Reopen a task.
Mark a completed task as not started again, as unticking it in SelfManager does. This deletes the time recorded for it, and brings its deadline back.
A key needs: read, write. Price: free.
For a table that someone else owns: POST /v1/tables/{date}/{table_key}/{owner_tag}/tasks/{task_id}/reopen
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
task_id | address | string | The task's id, as the table's tasks give it. |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/tasks/<task_id>/reopen"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.task_idstringnamestring The task's name.status"not_started", "completed", "almost_completed", "done_something", "checked_a_little", "did_overview", "canceled" The task's progress as it reads now.changedboolean False when the task already read that way, so nothing was written.notestring, optional Something worth knowing about what happened, or why nothing did.deadline"met", "restored", optional What happens to the task's deadline, when it has one: met, for everyone it reminds, or back.tracked_time_deletedboolean, optional True when reopening deleted the time recorded for the task.
POST/v1/tables/{date}/{table_key}/comments
Add a comment.
Add a comment, as you, to a table. Plain text; @mentions aren't sent. In a table other people can see (one shared with you, one of yours you share, or one with an invitation waiting), the key needs the shared permission.
A key needs: read, write. Price: 1 Integration Credit.
For a table that someone else owns: POST /v1/tables/{date}/{table_key}/{owner_tag}/comments
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
textstring The comment.timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"text":"…"}' \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/comments"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.comment_idstringnotestring, optional Something worth knowing about what happened: a repeating table created first, or an earlier attempt of the same request found to have done it already.mentionedinteger, optional How many of the people it mentions were told.
POST/v1/tables/{date}/{table_key}/notes
Add to a table's notes.
Add text at the end of a table's notes: each line becomes a paragraph. The version before stays one undo away in SelfManager. In a table other people can see (one shared with you, one of yours you share, or one with an invitation waiting), the key needs the shared permission.
A key needs: read, write. Price: 1 Integration Credit.
For a table that someone else owns: POST /v1/tables/{date}/{table_key}/{owner_tag}/notes
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. |
table_key | address | string | The second part of the table's id, as every answer gives it (table_id is date/table_key). |
owner_tag | address | string | The third part of the id of a table someone else owns. |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
textstring The text, as plain text.timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"text":"…"}' \
"https://api.selfmanager.ai/v1/tables/<date>/<table_key>/notes"
Answer
table_idstring The table's id: YYYY-MM-DD/tableKey, with a third part when someone else owns the table.table_namestring The table's name.changedboolean True: the text is at the end of the notes.notestring, optional Something worth knowing about what happened: a repeating table created first, or an earlier attempt of the same request found to have done it already.
POST/v1/journal/{date}
Add to your journal.
Add text to a day's journal line (your self message for that day), after a space; line breaks become spaces.
A key needs: read, journal, write. Price: 1 Integration Credit.
Parameters
| Name | Where | Type | |
|---|---|---|---|
date | address | string | The day, as YYYY-MM-DD. Or today, which needs your timezone to be known (see GET /v1/me). |
Idempotency-Key | header, optional | string | An id of your choosing for this request. Sent again with the same one, the request answers what it answered first and changes nothing twice. |
Body
textstring The text to add.timezonestring, optional Optional IANA timezone, such as Europe/Bucharest. Defaults to the one SelfManager stored for you.
Example
curl -X POST -H "Authorization: Bearer $SELFMANAGER_KEY" \
-H "Idempotency-Key: a-key-of-your-own" \
-H "Content-Type: application/json" \
-d '{"text":"…"}' \
"https://api.selfmanager.ai/v1/journal/<date>"
Answer
datestring The day written to, as YYYY-MM-DD.changedbooleanentrystring That day's journal line as it reads now, cut when it is long.truncatedboolean True when the line shown was cut.notestring, optional Something worth knowing about what happened: a repeating table created first, or an earlier attempt of the same request found to have done it already.