Restore Project

Beta
Walk back a purge. A purged project is recoverable for 30 days: its row and its contents are kept, hidden from every list and read, and permanently deleted only once the window expires. **What comes back:** the project and its resources - agents (with their tests), knowledge bases, tools and audio assets - exactly the rows the purge removed. A resource you had deleted yourself before the purge stays deleted. **What does NOT come back, on purpose:** every credential the purge revoked stays revoked, and every grant it cleared stays cleared. API keys and service accounts pinned to the project are not re-issued, vault credentials and webhook endpoints scoped to it are not undeleted, and member grants and pending-invite scopes are not restored. Bringing a credential or a grant back would re-grant access somebody deliberately ended, so the restore reports them under `still_revoked` instead. Re-create the credentials and re-grant the members the project still needs. The project returns ARCHIVED, the state it was purged from, so nothing dispatches or bills inside it until you unarchive it. Refused with `409 project_not_purged` when the project was never purged, `409 project_restore_window_expired` once the 30 days have passed, and `409 project_name_taken` when another project has taken this one's name since the purge (a purge frees the name immediately - rename the project holding it, then restore).

Authentication

AuthorizationBearer

Enter your API key with the Bearer prefix, e.g. ‘Bearer sk_…’.

Path parameters

project_idstringRequiredformat: "^proj_[0-9a-hjkmnp-tv-z]{26}$"

Project id (prefixed external id, proj_...).

Headers

Speechify-VersionstringOptional

Response headers

Speechify-Request-IdstringOptional
Unique identifier for this request, present on every response (2xx and non-2xx alike). If the caller sends a `Speechify-Request-Id` request header the server echoes it back (sanitized and length-capped) so one logical request can be traced end-to-end; otherwise the server generates a fresh value. Log it on every response and quote it in support requests - it is the stable handle that ties your observation to Speechify's server-side logs, and it matches the `request_id` field in the error envelope. The legacy alias `X-Request-ID` carries the same value and is still accepted on requests, until 2027-07-24. Prefer the un-prefixed name (RFC 6648).

Response

The project is restored, archived, and holds its resources again.
idstringOptionalformat: "^proj_[0-9a-hjkmnp-tv-z]{26}$"
namestringOptional
purged_atdatetimeOptional
When the purge this call walked back happened.
archived_atdatetime or nullOptional

When the project was archived. Always set on a restore: a project comes back suspended, never live.

restoredobjectOptional
What a restore brought back, by kind. Every field is a real count, including zero.
still_revokedobjectOptional

What the restore deliberately left revoked: the credentials the purge killed. Every field is a real count, including zero.

not_restored_notestringOptional

A plain-language statement of what a restore does not bring back. Constant text, meant to be shown to a person; branch on still_revoked rather than parsing it.

Errors

401
Unauthorized Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error