Skip to content

Deleting and restoring

Deleting a task or an event through the API is not final. The record moves to the trash, where it stays for 30 days and can be restored — by you, through the API, or by anyone in the workspace through the web app.

Method Path
DELETE /tasks/{id} Move a task to the trash
GET /tasks/trash List deleted tasks (cursor-paginated)
POST /tasks/{id}/restore Bring a task back
DELETE /scheduled-events/{id} Move an event to the trash
GET /scheduled-events/trash List deleted events
POST /scheduled-events/{id}/restore Bring an event back

Deleting requires tasks:write or events:write; listing the trash requires the matching :read permission. Deleted records disappear from every other listing and from reports immediately — the trash is the only place they remain visible.

Terminal window
curl "https://api.bordio.com/public/v1/tasks/trash" \
-H "Authorization: Bearer brd_sk_live_..."
{
"data": [
{
"id": "task_65dcc9c66f2e4e001ab18859",
"object": "task",
"title": "Approve the new layout",
"project_id": "proj_65dcc9c66f2e4e001ab18801",
"deleted_at": "2026-09-01T10:00:00.000Z",
"expires_at": "2026-10-01T10:00:00.000Z",
"deleted_by": "user_65dcc9c66f2e4e001ab18802"
}
],
"pagination": { "next_cursor": null, "has_more": false }
}

expires_at is the moment the record leaves the trash. After that it is gone for good and restore returns 404. Everything else about the record — description, custom fields, comments — is not in this listing: read it with a normal GET once it is back.

You see in the trash exactly what you would see elsewhere. A project you have no access to contributes nothing, and a project-scoped key only ever sees its own project. When an assistant or an app acts on your behalf, your role in the workspace also has to allow managing the trash — otherwise both the listing and the restore are refused.

Terminal window
curl -X POST "https://api.bordio.com/public/v1/tasks/task_65dcc9c66f2e4e001ab18859/restore" \
-H "Authorization: Bearer brd_sk_live_..."

The response is the full task, exactly as GET /tasks/{id} would return it.

A few things worth knowing before you build on this:

  • Restoring twice returns 404. Once a record is back, it is no longer in the trash, so there is nothing to restore. Treat 404 as “already restored or gone”, not as an error in your code.
  • The project has to still exist. A task whose project was deleted cannot be restored until the project is; the request fails with 400.
  • A repeat is not restored as a repeat. Deleting one occurrence of a recurring task detaches it, and restoring brings it back as a standalone record. Deleting a whole series (?scope=all) removes the repeat rule itself, and that cannot be undone.
  • A restored task returns to the end of its status column, not to the position it held before.
  • Comments and attachments come back with the record. Time logged against a task returns with it too.

There is no API for it. Records leave the trash on their own after 30 days, or when someone deletes them permanently in the web app. Nothing you call here can destroy a record immediately.

Projects are never deleted through the API. When a project is finished, archive it — that hides it from the workspace without touching anything inside it, and it can be brought back at any time.

Method Path
POST /projects/{id}/archive Move the project to the archive
POST /projects/{id}/unarchive Bring it back
Terminal window
curl -X POST "https://api.bordio.com/public/v1/projects/proj_65dcc9c66f2e4e001ab18801/archive" \
-H "Authorization: Bearer brd_sk_live_..."

Both require projects:write, and both return the project. Archiving a project that is already archived returns 400, as does unarchiving one that is not.

Archived projects stay in GET /projects, with archived_at filled in. Narrow the list with archived:

Terminal window
curl "https://api.bordio.com/public/v1/projects?archived=false" \
-H "Authorization: Bearer brd_sk_live_..."

Omit the parameter and you get both, as before.

Tasks and events inside an archived project are not deleted and do not appear in the trash.