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.
Listing the trash
Section titled “Listing the trash”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.
Restoring
Section titled “Restoring”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. Treat404as “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.
Permanent deletion
Section titled “Permanent deletion”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.
Archiving a project
Section titled “Archiving a project”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 |
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:
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.