Permanently delete a project
Erases the project row for good. Only valid on a project already in Recently Deleted - anything else, including a live project, is a 404. Issues sitting in Recently Deleted are NOT erased with it: permanent deletion never cascades destruction downward, and issues.project_id is ON DELETE SET NULL, so they simply lose the link and stay independently restorable.
View as MarkdownAuthorization
bearer In: header
Path Parameters
uuidResponse Body
application/json
application/json
application/json
application/json
curl -X DELETE "https://example.com/v1/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08/permanent"{ "message": "string"}Restore a deleted project
Moves a soft-deleted project out of Recently Deleted, and with it every issue currently pointing at it that belongs to the project's own team - unconditionally, regardless of when each issue was deleted, so restore is the exact mirror of the delete it undoes. A project that is not soft-deleted is a 404, as is one belonging to another org.
List issues
Issues across the teams the CALLER IS IN (see listTeams for how that set is decided), ordered by position, then number, then id. Each row OMITS description: descriptions are unbounded markdown and no list renders one, so read it from getIssue instead. Filters combine with AND; q is a case-insensitive title substring match (LIKE wildcards in q are escaped and match literally), or with scope=all a full-text search over titles, descriptions and comments. KEYSET PAGED. Send limit to choose a page size and pass the nextCursor from the previous response to continue. nextCursor is present only while more rows remain, so its absence means the end of the list rather than a truncation the caller was never told about. total counts every row the filters match, not the page, because counts and progress in the UI are drawn from it and a page cannot say how many there are. Cursors are opaque and must not be constructed or parsed by clients: the sort key they encode is free to change. A malformed cursor is a 400 rather than a silent restart, which would re-deliver the whole list. limit defaults to 50. The old behaviour of returning up to 1000 rows in one response is still available by asking for it. An issue in a team the caller is not in is invisible everywhere, not just here: reading one by id is a 404, never a 403, so the response does not confirm that it exists.