Backlog
The backlog is the Inbox of Reassign. It holds time blocks that do not have a time yet, for example "Wash the car". Use these endpoints to read the Inbox and to change it.
The machine-readable spec of all public endpoints: openapi.json.
Inbox blocks
- An Inbox block is a time block with no time. It can have a planned day or a range of planned days. With no planned day, the block is in "Someday".
- The
scheduleop puts an Inbox block on a day, at a start time. The block becomes an event and leaves the Inbox. - The
parkop moves an event from the day plan back to the Inbox. scheduleandparkare opposites. To undo aschedule,parkthe event, or use theundoTokenof the request.- The Inbox needs Reassign Pro. The 7-day free trial includes it.
The Inbox block model
durationMinutesis the length of the block in whole minutes, for example90. Reassign uses it when you schedule the block.areaId,activityTypeId, andprojectIdare always present. Each one isnullwhen the block has no link. Refer to Categories and Projects.priorityis always present. It is a whole number from 0 to 4:0none,1low,2medium,3high,4urgent.plannedDateis the planned day,YYYY-MM-DD. When it is absent, the block is in "Someday".plannedUntilis the last day of a planned range,YYYY-MM-DD. It is present only when it is not the same day asplannedDate.checklistholds the steps of the block,{ items: [{ id, text }] }. An Inbox block has nodoneflag on a step.- The response does not include
notes,sourceUrl,durationMinutes, orchecklistwhen the block has no value for them.
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
List the Inbox blocks
Get all the blocks in the Inbox. The list is in Inbox order: the first item is the top of the Inbox.
- This endpoint has no parameters. It has no pagination, and it returns all the blocks. An unknown query parameter returns
422with the codevalidation. - Each item of
backlogis an Inbox block. - The token must have the
events:reador theevents:writescope. - The account needs Reassign Pro. The 7-day free trial includes it.
Response fields
- Name
backlog- Type
- object[], required
- Description
13 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
Responses
| Status | Codes | Meaning |
|---|---|---|
200 | — | Success. |
401 | unauthorized | No Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata. |
403 | permissionscope | A token without events:read or events:write gets scope "This token is not authorized to read events (requires events:read or events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request." |
422 | validation | The request has a query parameter; this operation takes none. |
429 | rate_limited | Too many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds. |
503 | internal | A fault on our side. The request is safe to retry. |
Request
curl "https://reassign.app/api/v1/backlog" \
-H "Authorization: Bearer rsk_live_YOUR_TOKEN"Response
{
"backlog": [
{
"id": "e2f3a4b5-c6d7-4e8f-90a1-b2c3d4e5f607",
"name": "Book the dentist",
"kind": "blocking",
"durationMinutes": 30,
"areaId": null,
"activityTypeId": null,
"projectId": null,
"priority": 0,
"plannedDate": "2026-08-15"
}
]
}Change the Inbox
Capture, update, remove, schedule, or park Inbox blocks in one request. Split raw text into Inbox blocks with AI. Each item in ops is one operation (op). The op field of the item gives the action.
- The token must have the
events:writescope. - The account needs Reassign Pro. The 7-day free trial includes it.
- By default, the request is atomic. If one op fails, Reassign writes no change. Set
partialtotrueto apply the valid ops and to skip the ops that fail. - Target each block or event one time only in a request. A second op on the same block or event fails with
validation. - An
update,remove, orscheduleop can target only a block that was in the Inbox before the request. To schedule a new block, capture it first. Then send a second request.
Validation
Reassign checks the body before it runs an op.
- A body that is not valid as a whole returns
422with the codevalidationand no rows. For example,opsis missing,opshas less than 1 or more than 50 ops, or the body has an unknown key. - An op that is not valid becomes an
errorrow with the codevalidation. The request then follows the rules in "Status of a failed request" below. - An atomic request with an op that is not valid writes nothing. When each failed op is not valid, the status is
422, and the body has the rows. opmust becapture,capture_text,update,remove,schedule, orpark. An unknownopgets the messageUnknown op "<op>". Use one of: capture, capture_text, update, remove, schedule, park.namehas 1 to 200 characters.noteshas a maximum of 2,000 characters. Thetextofcapture_texthas 1 to 2,000 characters.durationMinutesis a whole number from 5 to 1,440. The minimum is the same as the minimum length of a scheduled event, so you can schedule each block.priorityis a whole number from 0 to 4.nullis not valid. To clear the priority, send0.checklist.itemshas a maximum of 50 steps. Eachtexthas 1 to 200 characters.sourceUrlis anhttporhttpsaddress with a maximum of 2,048 characters.plannedDateandplannedUntilare realYYYY-MM-DDdates. Thestartof ascheduleop is a local datetime,YYYY-MM-DDTHH:MM.- Reassign rejects a field that it does not know, also a field of a different op.
- The message of a bad op names the op and the first bad field, for example
Invalid "capture" op. `name`: Too small: expected string to have >=1 characters. An op that is not an object gets the messageEach op must be an object.
Ops
| Op | What it does |
|---|---|
capture | Makes a new Inbox block. |
capture_text | Splits raw text into 1 to 10 new Inbox blocks. |
update | Changes an Inbox block by its id. Send only the fields to change. |
remove | Deletes an Inbox block by its id. |
schedule | Puts an Inbox block on the day plan as an event, at start. The block leaves the Inbox. |
park | Moves an event, by its id, from the day plan back to the Inbox. |
Source of a new block
capture and capture_text take an optional calendarId. It sets the Source of each new block. On capture_text, it goes to every block.
calendarId | Result |
|---|---|
| A task list id | The block goes to that task list. Use an id from GET /schedule integrations.sources[].calendars[] of a task source. |
| Omitted | When the block has a project with a publishCalendarId, the block goes to that task list. Else the block takes the default Source of the account, integrations.defaultCalendarId. This is the same default as for a new event. A task list default creates the task. A calendar default publishes the block when you schedule it. With no default, the block stays in Reassign only. On capture_text, a list that the text names wins over the default. |
null | The block stays in Reassign only, also when there is a default, the project has a list, or the text names a list. |
- When the Source is a writable task list that takes new items, Reassign also creates the block as a task in that list. The plan must have sync access.
- Reassign creates the task after the request returns. The result shape does not change. The block links to the task when the create is done. When the create fails, the block stays in Reassign only. A retry of the create does not make a second task.
- An id that is not a writable task list of the account fails the op with
validation:calendarId "<id>" is not a writable task list that can take a new item. Use a task list `id` from `integrations`, or null.
Areas and activity types
- On
capture,nulland an omittedareaIdoractivityTypeIdhave the same effect: no link. - On
update,nullremoves the link. An omitted key keeps the link. - On
update,nullis a manual choice, also when the block has no link. AI classification does not set that field later. - An ID that the account cannot see fails the op with
not_found, for exampleNo area with id "<id>".
Projects
capture,capture_text, andupdatetakeprojectId: theidof a live project fromGET /api/v1/categories.- On
captureandcapture_text,nulland an omittedprojectIdhave the same effect: no project. - On
update,nullremoves the project and keeps the area. An omitted key keeps the project. - An unknown or an archived project fails the op with
not_found:No live project with id "<id>".A block that already links to an archived project can keep that link.
The area of a project
- When an op changes the project and does not send
areaId, the block takes the area of the project. This also replaces an area that the user set by hand. - When the op sends
areaId, the block keeps that area. - A removal of the project, or the same project again, does not change the area.
- A later change to the area of the project does not change the area of the block.
A block that links to a task
When a block links to a task in a task app, a change of projectId can also move the task.
| Case | Result |
|---|---|
| The list or the Linear project of the task feeds the new project. | The task stays where it is. |
| The new project has one list or Linear project in the same account. | The task moves there. For Linear, the Linear project must be open and in the team of the issue. |
The new project has two or more lists in the same account, and one of them is the publishCalendarId of the project. | The task moves to that list. |
| Any other case | The op fails with read_only. The message gives the reason, for example This project has no Todoist list for this account. |
- The
read_onlymessages are these.<App>is the task app, and<team>is the Linear team of the issue.This project has no <App> list for this account.This project has 2 or more <App> lists. Set "New tasks go to" in project settings.This project has no Linear project for the <team> team.This project has 2 or more Linear projects for the <team> team. Unlink one.<App> tasks cannot move to another project.
- A removal of the project (
projectId: null) never fails. For a Linear issue, it also takes the issue out of its Linear project. A list task stays in its list. - A Microsoft To Do task moves as a new task in the new list.
Priority
captureandcapture_texttakepriority. When you do not send it, the priority is0.- On
update, an omittedprioritykeeps the value. - On
capture_text,prioritygoes to every block. - For a block that links to a task in Todoist, TickTick, Linear, or Microsoft To Do, Reassign syncs the priority with the task. Google Tasks has no priority field.
- Reassign sends a priority to the task only after a pull of the task records its priority. Until then, a priority edit stays in Reassign. A task that went onto the dial with no stop in the Inbox never gets this record.
Planned days
plannedUntilmust be afterplannedDate. For one day, sendplannedDateonly. Onupdate, aplannedDateon or after the storedplannedUntilalso fails withvalidation.plannedUntilneeds aplannedDate. Onupdate, Reassign uses the storedplannedDatewhen you do not send one.- On
update,plannedDate: nullmoves the block to "Someday" and removes the range.plannedUntil: nullmakes the range one day. - For Todoist, TickTick, Google Tasks, Microsoft To Do, and Linear, you can change
plannedDateandplannedUntil, and Reassign sends the date to the task app. - A change to
plannedDateorplannedUntilfails withread_onlywhen the task recurs in the task app, or when the task app cannot take a due date. The message isThis block is linked to a task app — its planned day mirrors the task's due date there. Change the date in the task app instead.Change the date in the task app.
Checklist
checklistreplaces all the steps of the block. Send each step that you want to keep. An emptyitemsarray removes all the steps.- To keep a step, send its
idfrom a read. For a new step, do not send anid. - Reassign removes the spaces at the start and at the end of each
text. It drops a step with no text after that.
Enrich
- Set
enrichtotrueon acaptureof raw text, for example text from a web page. Do not use it for a name that the user wrote. - AI can then change the name. It can also set
durationMinutesandchecklistwhen you do not send them. - The fields that you send stay the same. Only the name can change.
- AI enriches only the first 10 captures with
enrichin one request. Reassign writes the other captures with no change. - If the AI call fails, Reassign writes the capture with no change and no error.
Capture text
- Send what the user typed, dictated, or selected as
text, with no change. AI splits it into 1 to 10 blocks. - AI gives each block a name. It also gives notes, a length, and a planned day when the text names them.
- The optional
notes,durationMinutes,kind,areaId,activityTypeId,projectId,priority,plannedDate,plannedUntil, andsourceUrlgo to every block. Send a field only when the user chose it. durationMinutes,plannedDate, andplannedUntilreplace the AI values. Reassign addsnotesafter the AI notes.- The planned day of the AI comes from the time zone of the user.
- The AI length of a block can be up to 24 hours (1,440 minutes).
- With no
calendarId, the text can name one of the writable task lists of the user, for example "add to Todoist Work: call the bank". AI sends that block to the list and removes the list words from the name. AI never picks a list from the topic of a block. Reassign checks the list. An unknown list uses the default Source. This needs a plan with sync access. - Without AI, Reassign finds a list name only at the start ("add to TickTick Home: …"), in a closing bracket ("… (TickTick Home)"), or at the end ("… in TickTick Home") of the text.
- When AI does not answer, Reassign makes one block. The first line of
textis the name, and the other lines are the notes. - AI splits only the first 5
capture_textops of a request. The other ops make one block each. - The blocks are in the order of the text, at the top of the Inbox. One undo removes all the blocks.
Schedule
- The length of the event comes from
durationMinutesof the block. When the block has no length, the event is 1 hour. - The event keeps the
projectIdand thepriorityof the block. - The event obeys the span rule of an event write: 5 minutes to 168 hours. A block with a stored length under 5 minutes fails the op with
validation. - A blocking event must not overlap a blocking event. An overlap fails the op with
conflict. Theerrorof the row hasconflictsandnearestSlots. - A non-blocking block can overlap other events.
- An earlier
parkin the same request frees its time for a laterschedule. recurrencemakes the event repeat. It is an RRULE, for exampleFREQ=WEEKLY;BYDAY=MO,WE,FR. A rule with a repeat of less than one day fails withvalidation.- When the day of
startis not a day of the rule, the result hasfirstOccurrence: the first day on which the series occurs.
Park
- The event must be a one-off event that is not reviewed. It must be a Reassign event or an event on a calendar that the user owns.
- The new Inbox block keeps the day of the event as
plannedDate. It also keeps theprojectId, thepriority, and the ticked checklist steps. A laterschedulegives the ticked steps back to a one-off event. A read of the block does not show them. - When the event is not eligible, the op fails with
permission. For example, you cannot park a recurring event, an occurrence ID (seriesId@YYYY-MM-DD), or a sleep block.
Results
| Op | result of an ok row |
|---|---|
capture | { created, enriched? }. created is the new Inbox block. enriched lists the fields that AI set: name, durationMinutes, or checklist. |
capture_text | { created, source }. created is a list of the new Inbox blocks, in the order of the text. source is ai when AI split the text, or text when Reassign made one block from the lines. |
update | { updated }, the changed Inbox block. |
remove | { deletedIds: [id] }, the ID of the block. |
schedule | { created, deletedIds, firstOccurrence? }. created is the new event. deletedIds holds the ID of the Inbox block. |
park | { created, deletedIds }. created is the new Inbox block, with a new ID. deletedIds holds the ID of the event. |
- An
errorrow has anerrorobject withcode,message, and optional detail fields. Refer to Error format. Askippedrow has areason. - When a
scheduleop applies or a row has a conflict, the response hastimezone, the time zone of the times in the rows. - When one or more ops apply and the server records an undo receipt, the response has
undoTokenandexpiresAt. Send the token toPOST /api/v1/actions/undobeforeexpiresAt(30 minutes) to reverse all the ops of the request. - A request that applies no op has no
undoToken. If the server cannot record the undo, the response also has noundoToken, and the changes stay. - The undo fails with
stalewhen the area, the activity type, the project, or the priority of a block changed by hand after the request. An AI classification after the request does not stop the undo. Refer to Stale tokens.
Status of a failed request
- Reassign rejects the request when one or more ops fail and no op applies. This is also true for a
partialrequest where all the ops fail. - In an atomic request, one failed op rejects the request. Only the failed ops are
errorrows. The valid ops areskippedrows. - The body of a rejected request is
{ "error": { code, message }, results }. The status followserror.code, as the Responses table shows. - When all failed ops have
read_only, or all havepermission, the status is403. When the codes differ, the status is400withbatch_rejected. - A request where one or more ops apply returns
200. Reassign does not reject it, also when the read of a written op fails after the write. That op gets anerrorrow with the codeinternaland the messageThe change was saved, but the read-back failed. Read it again.The response keeps any recordedundoToken.
Request body
- Name
ops- Type
- object[], required
- Description
6 forms
One form:
op: "capture"- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
durationMinutes- Type
- integer
- Description
Estimated length in whole minutes, 5 to 1440. Sizes the block when placed.
- Name
kind- Type
- "blocking" | "non_blocking" | "reference"
- Description
The kind the event takes when scheduled: "blocking" occupies time, "non_blocking" is an overlay that may overlap others, "reference" is something to see but not do. Omit for "blocking".
- Name
areaId- Type
- string | null
- Description
The area id. null or omitted leaves it unset.
- Name
activityTypeId- Type
- string | null
- Description
The activity type id. null or omitted leaves it unset.
- Name
projectId- Type
- string | null
- Description
A live project id from get_schedule
projects. When the project changes and the op sets no areaId, the item takes the area of the project, also over an area the user set by hand. On an item linked to a task, the task stays when its list (or Linear project) feeds the new project; else it moves to the one target of that project in the same account (for Linear: open, in the issue team). With 2 or more lists it goes to the "New tasks go to" list of the project. Any other case, and a move of a scheduled task, is refused with read_only. A clear is never refused. null or omitted leaves it unset.
- Name
priority- Type
- integer
- Description
0 none, 1 low, 2 medium, 3 high, 4 urgent. Omit for 0.
- Name
plannedDate- Type
- string
- Description
The day this intention is planned for (still untimed — placing it on the dial is a separate
schedule). Groups it under that day in the tray.
- Name
plannedUntil- Type
- string
- Description
Inclusive end of a planned window; it must fall after plannedDate.
- Name
checklist- Type
- object
- Description
The block's microtasks, in order — REPLACES the whole list (send every item you want kept; an empty
itemsclears them). An Inbox block has no occurrence, so nothing is ticked off until it is scheduled.1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string
- Description
Keep an item id from a read; omit for a new item.
- Name
text- Type
- string, required
- Description
- Name
sourceUrl- Type
- string
- Description
Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.
- Name
calendarId- Type
- string | null
- Description
The Source of each item: a writable task list to also create the item in, as an
idfromget_scheduleintegrations.sources[].calendars[]of a task source. null keeps the items in Reassign only. Omit it to use the default list of the item's project, else the account default (defaultCalendarId), which creates the task when it is a task list. Oncapture_text, an item goes to a list that the text explicitly names ("add to Todoist Work: …") instead.
- Name
enrich- Type
- boolean
- Description
Let AI clean this capture up before it is saved: propose a better name, estimate durationMinutes, and copy out any microtasks the captured text spells out. For RAW captures only — text grabbed off a web page, where the name is a paragraph rather than an intention. Do NOT set it for something the user typed or dictated: it may RENAME the block, and a name they chose must stand. Fields you send yourself always win; only the name can be replaced.
One form:
op: "capture_text"- Name
text- Type
- string, required
- Description
What the user typed, dictated or selected, as is. AI splits it into 1 to 10 Inbox items, each with a short name, notes, a length and a day when the text names one. Without the AI the first line is the name and the rest are notes.
- Name
notes- Type
- string
- Description
Notes added to every item.
- Name
durationMinutes- Type
- integer
- Description
A length for every item. Omit it to keep the AI estimate; send it only when the user chose one.
- Name
kind- Type
- "blocking" | "non_blocking" | "reference"
- Description
The kind the event takes when scheduled: "blocking" occupies time, "non_blocking" is an overlay that may overlap others, "reference" is something to see but not do. Omit for "blocking".
- Name
areaId- Type
- string | null
- Description
The area id. null or omitted leaves it unset.
- Name
activityTypeId- Type
- string | null
- Description
The activity type id. null or omitted leaves it unset.
- Name
projectId- Type
- string | null
- Description
A live project id for every item. When the op sets no areaId, each item takes the area of the project. null or omitted leaves it unset.
- Name
priority- Type
- integer
- Description
A priority for every item: 0 none, 1 low, 2 medium, 3 high, 4 urgent.
- Name
plannedDate- Type
- string
- Description
A planned day for every item. Omit it to keep the AI day.
- Name
plannedUntil- Type
- string
- Description
Inclusive end of a planned window; it must fall after plannedDate.
- Name
sourceUrl- Type
- string
- Description
Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.
- Name
calendarId- Type
- string | null
- Description
The Source of each item: a writable task list to also create the item in, as an
idfromget_scheduleintegrations.sources[].calendars[]of a task source. null keeps the items in Reassign only. Omit it to use the default list of the item's project, else the account default (defaultCalendarId), which creates the task when it is a task list. Oncapture_text, an item goes to a list that the text explicitly names ("add to Todoist Work: …") instead.
One form:
op: "update"- Name
id- Type
- string, required
- Description
The Inbox block id (from the schedule read's
backlog).
- Name
name- Type
- string
- Description
- Name
notes- Type
- string
- Description
- Name
durationMinutes- Type
- integer
- Description
Estimated length in whole minutes, 5 to 1440. Sizes the block when placed.
- Name
kind- Type
- "blocking" | "non_blocking" | "reference"
- Description
The kind the event takes when scheduled: "blocking" occupies time, "non_blocking" is an overlay that may overlap others, "reference" is something to see but not do. Omit to keep it.
- Name
areaId- Type
- string | null
- Description
The area id. null clears the link; omit to keep it.
- Name
activityTypeId- Type
- string | null
- Description
The activity type id. null clears the link; omit to keep it.
- Name
projectId- Type
- string | null
- Description
A live project id from get_schedule
projects. When the project changes and the op sets no areaId, the item takes the area of the project, also over an area the user set by hand. On an item linked to a task, the task stays when its list (or Linear project) feeds the new project; else it moves to the one target of that project in the same account (for Linear: open, in the issue team). With 2 or more lists it goes to the "New tasks go to" list of the project. Any other case, and a move of a scheduled task, is refused with read_only. A clear is never refused. null clears the project and keeps the area; omit to keep it.
- Name
priority- Type
- integer
- Description
0 none, 1 low, 2 medium, 3 high, 4 urgent. Omit to keep it.
- Name
plannedDate- Type
- string | null
- Description
Set/move the block's planned day; null clears it back to Someday (also clears any window end). Google Tasks, Microsoft To Do and Linear sync this date both ways. Todoist dates must be changed in Todoist.
- Name
plannedUntil- Type
- string | null
- Description
Inclusive end of a planned window; it must fall after plannedDate. null collapses the window to one day.
- Name
checklist- Type
- object
- Description
The block's microtasks, in order — REPLACES the whole list (send every item you want kept; an empty
itemsclears them). An Inbox block has no occurrence, so nothing is ticked off until it is scheduled.1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string
- Description
Keep an item id from a read; omit for a new item.
- Name
text- Type
- string, required
- Description
- Name
sourceUrl- Type
- string | null
- Description
Where this was captured from — the http(s) page address. Shown as a source chip; never parsed. Set it only for something grabbed off a real page, not for an intention the user typed.
One form:
op: "remove"- Name
id- Type
- string, required
- Description
The Inbox block id to delete from the Inbox.
One form:
op: "schedule"- Name
id- Type
- string, required
- Description
The Inbox block id to place on the dial.
- Name
start- Type
- string, required
- Description
Local start "YYYY-MM-DDTHH:MM"; the block's duration sizes it.
- Name
recurrence- Type
- string
- Description
Optionally make the placed block repeat, as an RRULE (e.g. "FREQ=WEEKLY;BYDAY=MO,WE,FR"). Omit for a one-off.
One form:
op: "park"- Name
id- Type
- string, required
- Description
The dial event id to move to the Inbox (from a schedule or search read). Must be a native or owned-calendar one-off that hasn't been reviewed.
- Name
partial- Type
- boolean
- Description
Best-effort mode instead of the default all-or-nothing.
Response fields
- Name
timezone- Type
- string
- Description
- Name
undoToken- Type
- string
- Description
- Name
expiresAt- Type
- string
- Description
- Name
results- Type
- object[], required
- Description
3 forms
One form:
status: "ok"- Name
index- Type
- integer, required
- Description
- Name
result- Type
- object, required
- Description
6 forms
One form: Without
source,updated,deletedIds- Name
created- Type
- object, required
- Description
13 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
- Name
enriched- Type
- "name" | "durationMinutes" | "checklist"[]
- Description
One form: With
source- Name
created- Type
- object[], required
- Description
13 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
- Name
source- Type
- "ai" | "text", required
- Description
One form: With
updated- Name
updated- Type
- object, required
- Description
13 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
One form: Without
source,updated- Name
created- Type
- object, required
- Description
26 fields
- Name
start- Type
- string, required
- Description
- Name
end- Type
- string, required
- Description
- Name
id- Type
- string, required
- Description
- Name
seriesId- Type
- string
- Description
- Name
originalDate- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
source- Type
- "google" | "google_tasks" | "linear" | "microsoft" | "microsoft_todo" | "ticktick" | "todoist" | "reassign", required
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
meeting- Type
- object
- Description
2 fields
- Name
url- Type
- string, required
- Description
- Name
label- Type
- string, required
- Description
- Name
location- Type
- object
- Description
2 fields
- Name
text- Type
- string, required
- Description
- Name
url- Type
- string
- Description
- Name
recurrence- Type
- string
- Description
- Name
warning- Type
- string
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
calendarId- Type
- string | null
- Description
- Name
mirrorCalendarIds- Type
- string[]
- Description
- Name
mirrorStyles- Type
- map of "full" | "private" | "busy"
- Description
- Name
readOnly- Type
- true
- Description
- Name
focusIntervals- Type
- object
- Description
2 fields
- Name
focusMin- Type
- integer, required
- Description
- Name
breakMin- Type
- integer, required
- Description
- Name
completedFocusIntervals- Type
- integer
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
3 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
- Name
done- Type
- boolean, required
- Description
- Name
reflect- Type
- object
- Description
2 forms
One form: Without
actualStart,actualEnd- Name
status- Type
- "kept" | "skipped" | "changed" | "added", required
- Description
One form: With
actualStart,actualEnd- Name
status- Type
- "changed", required
- Description
- Name
actualStart- Type
- string, required
- Description
- Name
actualEnd- Type
- string, required
- Description
- Name
deletedIds- Type
- string[], required
- Description
- Name
firstOccurrence- Type
- string
- Description
One form: Without
source,updated- Name
created- Type
- object, required
- Description
13 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
notes- Type
- string
- Description
- Name
sourceUrl- Type
- string
- Description
- Name
kind- Type
- "blocking" | "non_blocking" | "reference", required
- Description
- Name
durationMinutes- Type
- integer
- Description
- Name
areaId- Type
- string | null, required
- Description
- Name
activityTypeId- Type
- string | null, required
- Description
- Name
projectId- Type
- string | null, required
- Description
- Name
priority- Type
- integer, required
- Description
- Name
plannedDate- Type
- string
- Description
- Name
plannedUntil- Type
- string
- Description
- Name
checklist- Type
- object
- Description
1 fields
- Name
items- Type
- object[], required
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
text- Type
- string, required
- Description
- Name
deletedIds- Type
- string[], required
- Description
One form: Without
created,source,updated- Name
deletedIds- Type
- string[], required
- Description
- Name
warnings- Type
- "classification_pending"[]
- Description
One form:
status: "error"- Name
index- Type
- integer, required
- Description
- Name
error- Type
- object, required
- Description
11 fields
- Name
code- Type
- "conflict" | "not_found" | "validation" | "permission" | "scope" | "stale" | "read_only" | "rate_limited" | "internal", required
- Description
- Name
message- Type
- string, required
- Description
- Name
issues- Type
- object[]
- Description
3 fields
- Name
path- Type
- string | integer[], required
- Description
- Name
message- Type
- string, required
- Description
- Name
expected- Type
- string
- Description
- Name
feature- Type
- string
- Description
- Name
conflictingRows- Type
- object[]
- Description
3 fields
- Name
entity- Type
- string, required
- Description
- Name
id- Type
- string, required
- Description
- Name
reason- Type
- "changed" | "deleted" | "newly_present", required
- Description
- Name
conflictingRowsTruncated- Type
- true
- Description
- Name
usage- Type
- object
- Description
5 fields
- Name
events- Type
- integer, required
- Description
- Name
inboxItems- Type
- integer, required
- Description
- Name
trackers- Type
- integer, required
- Description
- Name
calendars- Type
- integer, required
- Description
- Name
projects- Type
- integer
- Description
- Name
reassignTargets- Type
- object[]
- Description
2 fields
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
- Name
unlinkedCheckout- Type
- object
- Description
3 fields
- Name
sessionId- Type
- string, required
- Description
- Name
paymentReceived- Type
- boolean, required
- Description
- Name
supportUrl- Type
- string, required
- Description
- Name
conflicts- Type
- object[]
- Description
2 forms
One form: With
id- Name
start- Type
- string, required
- Description
- Name
end- Type
- string, required
- Description
- Name
id- Type
- string, required
- Description
- Name
name- Type
- string, required
- Description
One form: With
batchIndex- Name
start- Type
- string, required
- Description
- Name
end- Type
- string, required
- Description
- Name
batchIndex- Type
- integer, required
- Description
- Name
name- Type
- string, required
- Description
- Name
nearestSlots- Type
- object[]
- Description
4 fields
- Name
start- Type
- string, required
- Description
- Name
end- Type
- string, required
- Description
- Name
score- Type
- number
- Description
- Name
reason- Type
- string
- Description
One form:
status: "skipped"- Name
index- Type
- integer, required
- Description
- Name
reason- Type
- string, required
- Description
Responses
| Status | Codes | Meaning |
|---|---|---|
200 | — | Success. |
400 | batch_rejected | Every op failed, and the failed ops have different codes. The code is batch_rejected. |
401 | unauthorized | No Bearer token and no session cookie, or the token is invalid, expired, or revoked. The response carries a WWW-Authenticate challenge that points at the protected-resource metadata. |
403 | permissionscoperead_only | A token without events:write gets scope "This token is not authorized to modify events (missing events:write scope)." An account without Reassign Pro access gets permission "Reassign needs an active subscription." The 7-day free trial includes Reassign Pro. A cookie session from another site gets permission "Cross-origin request." A rejected batch also answers 403 when every failed op has the same code: read_only (an update changes the planned day of an item that a task app owns) or permission (a park names a recurring, sleep, reviewed, or not-owned calendar event). |
404 | not_found | An op names an item that does not exist. |
409 | conflict | The request conflicts with the current state: conflict "The time overlaps an existing event." or conflict "The time overlaps an earlier op in this batch." |
422 | validation | The request body is not valid. The message names the first bad field by its path. A repeated or unknown query parameter is also a 422. |
429 | rate_limited | Too many requests. The edge firewall limits each IP to 2000 requests per minute across /api/v1; that 429 comes from the edge and can have a body that is not this JSON and no Retry-After header. When an edge 429 has no Retry-After, retry after 60 seconds. The app also limits each Bearer credential to 600 requests per minute, and some routes limit each user. These limits return this body. This app 429 always has Retry-After: retry after that number of seconds. |
503 | internal | A fault on our side. The request is safe to retry. |
Most error responses: When no op of the batch applied, the body also has the results rows, so the caller sees which op failed.
Request
curl -X POST "https://reassign.app/api/v1/backlog" \
-H "Authorization: Bearer rsk_live_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ops": [
{
"op": "capture",
"name": "Call the bank",
"durationMinutes": 30,
"calendarId": null
},
{
"op": "schedule",
"id": "e2f3a4b5-c6d7-4e8f-90a1-b2c3d4e5f607",
"start": "2026-08-15T11:00"
}
]
}'Response
{
"timezone": "Europe/Ljubljana",
"results": [
{
"index": 0,
"status": "ok",
"result": {
"created": {
"id": "d1e2f3a4-b5c6-4d7e-8f90-a1b2c3d4e5f6",
"name": "Call the bank",
"kind": "blocking",
"durationMinutes": 30,
"areaId": null,
"activityTypeId": null,
"projectId": null,
"priority": 0
}
}
},
{
"index": 1,
"status": "ok",
"result": {
"created": {
"id": "b7f1c2a0-1d2e-4f3a-9b8c-5d6e7f801234",
"start": "2026-08-15T11:00",
"end": "2026-08-15T11:30",
"kind": "blocking",
"name": "Book the dentist",
"source": "reassign",
"areaId": null,
"activityTypeId": null,
"projectId": null,
"priority": 0
},
"deletedIds": [
"e2f3a4b5-c6d7-4e8f-90a1-b2c3d4e5f607"
]
}
}
]
}