Housekeeping REST API

Trash

Deleting is always reversible. Purged automatically 30 days after deletion.

List trashed items

GET/api/v1/trash

Deleted profiles and projects, newest deletion first, each with how long it has left.

Returns

{ total, items: TrashEntry[] }

Restore a profile

POST/api/v1/trash/profiles/:id/restore

Brings a profile back with its browser data untouched.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

The restored Profile.

Purge a profile

DELETE/api/v1/trash/profiles/:id

Permanent. Removes the profile and its browser data directory from disk.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

{ purged: true }

Restore a project

POST/api/v1/trash/projects/:id/restore

Restores the project and every profile deleted along with it.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

The restored Project.

Purge a project

DELETE/api/v1/trash/projects/:id

Permanent, including every profile inside it.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

{ purged: true }

Restore a warm-up plan

POST/api/v1/trash/warmup/plans/:id/restore

Brings a trashed plan back. DELETE /warmup/plans/:id trashes rather than destroys — a plan is a list of sites somebody assembled by hand, and it takes longer to rebuild than to lose.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

The restored WarmupPlan.

Purge a warm-up plan

DELETE/api/v1/trash/warmup/plans/:id

Permanent. By id only — there is no purge-everything for plans.

Path parameters

FieldTypeWhat it is
idrequiredstringThe record’s id.

Returns

{ purged: true }

Empty the trash

POST/api/v1/trash/empty

Permanent, and the only call here that destroys more than one thing at a time — every profile it removes takes its cookies, logins and browsing history with it, and there is nothing to restore from. It will not guess how much you meant: an empty body is a 400, not a full purge. Name a projectId, name an os list, or send { "all": true } to mean every row. That default cost 586 profiles once — a script that meant "tidy up the one fixture I made" sent no body and purged a library — and on the single irreversible route in this API, absent must not mean maximal. A platform filter deliberately spares trashed projects: a project is not in a platform, and purging one because a caller named android would take desktop profiles nobody asked about. An unknown field is a 400 rather than a silently wider purge.

Body

FieldTypeWhat it is
projectIdstringOnly this project’s trash.
os"windows" | "macos" | "linux" | "android"[]Only these platforms’ profiles, and no projects.
allbooleanEvery row, with nothing spared. Cannot be combined with the other two.

Returns

{ purged: n } — how many profiles and projects were removed.

Errors

  • 400 — no scope at all. Say projectId, os or all.
  • 400 — all combined with projectId or os.
  • 400 — an unknown field, or an os entry that is not a platform.
curl -X POST -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
  -d '{"projectId":"'$PROJECT'","os":["android"]}' "$BASE/trash/empty"
Next Try it on your own accounts

Run the API on your own profiles

The REST API and the MCP server are part of Pro: $49 a month, with the first 14 days free. Free has every browser feature and no API key.