Skip to main content

REST API reference

The REST API is generated from the Tiden gRPC API through grpc-gateway. Public automation should use API tokens and the endpoints listed as public.

Base URL​

https://app.tiden.ai

Authentication header​

Authorization: Bearer <token>

Public API endpoints​

These endpoints are intended for API tokens, CLI, MCP, CI, and customer automation.

Auth, workspace, and product​

MethodPathPurpose
GET/v1/auth/meCurrent user for the token
PUT/v1/auth/onboardingUpdate onboarding state
GET/v1/workspacesList workspaces
POST/v1/workspaces/{workspace_id}/productsCreate product
GET/v1/workspaces/{workspace_id}/productsList products
POST/v1/products/{product_id}/setup:verifyVerify product setup state

Specs​

In the API, a spec is the requirement resource. Paths, path parameters such as requirement_id, and JSON fields such as requirementId keep that name.

MethodPathPurpose
POST/v1/products/{product_id}/requirementsCreate spec
GET/v1/products/{product_id}/requirementsList specs
GET/v1/requirements/{id}Get spec
PUT/v1/requirements/{id}Update spec
DELETE/v1/requirements/{id}Delete spec

Tests​

MethodPathPurpose
POST/v1/products/{product_id}/testsCreate suite or case
PUT/v1/tests/{id}Update test
GET/v1/products/{product_id}/testsList tests
GET/v1/tests/{id}Get test
DELETE/v1/tests/{id}Delete test
POST/v1/tests/{test_id}/linksLink test to spec or propose branch link
DELETE/v1/tests/{test_id}/links/{requirement_id}Unlink test and spec
GET/v1/tests/{test_id}/linksList test links
GET/v1/branches/{branch_id}/link-proposalsList branch link proposals
POST/v1/branches/{branch_id}/link-proposals:reviewReview branch link proposals
POST/v1/products/{product_id}/tests:ingestIngest reporter draft

Branches and components​

MethodPathPurpose
POST/v1/products/{product_id}/branchesCreate branch
GET/v1/products/{product_id}/branchesList branches
GET/v1/branches/{id}Get branch
PATCH/v1/branches/{id}Update branch
POST/v1/branches/{id}:closeClose branch
DELETE/v1/branches/{id}Delete branch
GET/v1/branches/{id}/merge-previewPreview merge
POST/v1/branches/{id}/mergeMerge branch
GET/v1/branches/{id}/merged-changesList what a merged branch put into main
POST/v1/branches/{branch_id}/intent-holdHold or release the automatic merge of an intent branch
POST/v1/products/{product_id}/componentsCreate component
GET/v1/products/{product_id}/componentsList components

GET /v1/branches/{id}/merge-preview returns the changes a merge would apply to main. Its fields, item shapes, and schema version are in Merge preview response.

PATCH /v1/branches/{id} changes a branch's description on any status. POST /v1/branches/{id}:close ends a branch and keeps everything on it; it answers BRANCH_CLOSE_DENIED for main and for an automatic branch, and BRANCH_NOT_OPEN for a merged one. A closed branch answers BRANCH_NOT_OPEN to writes, code links, and holds, and the branch object carries closedAt and closedByName. See Closed branches.

POST /v1/branches/{id}/merge accepts an optional expectPreviewDigest: the previewDigest of the merge preview you reviewed. When the branch changed after that preview, the merge answers 409 Conflict with MERGE_PREVIEW_STALE and merges nothing. Run the merge preview again and use its digest. See Merge only the reviewed preview.

GET /v1/branches/{id}/merged-changes lists the changes a merged branch put into main. It answers for merged branches only. Page it with pagination.page_size (default 50, at most 200) and pagination.page_token. It does not return the actor's email.

Environments and releases​

MethodPathPurpose
POST/v1/products/{product_id}/environmentsCreate environment
GET/v1/products/{product_id}/environmentsList environments
GET/v1/environments/{id}Get environment
DELETE/v1/environments/{id}Delete environment
POST/v1/products/{product_id}/releasesCreate or update release
GET/v1/products/{product_id}/releasesList releases
GET/v1/releases/{id}Get release
POST/v1/releases/{id}/quality-gate:captureCapture the release's Quality Gate again

Creating a release accepts an optional buildSha: the full 40- or 64-character commit SHA the release was built from. A short or non-hexadecimal value is refused with INVALID_BUILD_SHA. A release's gate is then captured from that commit's test results; see Release captures. The capture call takes an optional {"buildSha": "…"} body and returns the release, its current verdict, pending and appended. Reading the verdict or traceability of a release that is still pending answers QG_CAPTURE_PENDING.

Quality gates​

MethodPathPurpose
POST/v1/products/{product_id}/quality-gate:computeCompute verdict
GET/v1/products/{product_id}/quality-gateGet latest verdict
GET/v1/products/{product_id}/quality-gate/traceabilityGet traceability matrix
POST/v1/products/{product_id}/quality-gate:accept-riskAccept risk
POST/v1/products/{product_id}/quality-gate:approve-riskApprove risk

Agents​

MethodPathPurpose
GET/v1/agent-typesList agent types
GET/v1/products/{product_id}/agent-configsList agent configs
GET/v1/agent-configs/{id}Get agent config
POST/v1/products/{product_id}/agent-configsCreate agent config
DELETE/v1/agent-configs/{id}Delete agent config
POST/v1/agent-configs/{agent_config_id}/runsStart agent run
POST/v1/agent-runs/{id}:cancelCancel agent run
GET/v1/agent-runs/{id}Get agent run
GET/v1/agent-configs/{agent_config_id}/runsList runs
GET/v1/agent-runs/{run_id}/eventsList run events
GET/v1/agent-runs/{run_id}/events:streamStream run events

Agent retrieval and intent​

MethodPathPurpose
GET/v1/products/{product_id}/coverage-gapsGet coverage gaps
GET/v1/products/{product_id}/requirements/{requirement_id}/test-contextGet test generation context
POST/v1/products/{product_id}/test-generation-context:preparePrepare test generation context
POST/v1/products/{product_id}/intent:distillDistill intent into branch

Issues​

Error tracking reads and status changes are available to API tokens, so the CLI, the MCP server, CI, and coding agents can triage issues without a browser session.

MethodPathPurpose
GET/v1/products/{product_id}/issuesList issues, newest activity first
GET/v1/issues/{id}Get an issue with its latest occurrence
GET/v1/issues/{id}/eventsList an issue's occurrences
GET/v1/issues/{id}/events/{event_id}Get one occurrence with symbolicated frames
GET/v1/issues/{id}/statsOccurrence counts over time and per environment
GET/v1/releases/{release_id}/issuesIssues first seen in a release
POST/v1/issues/{id}:setStatusSet one issue's status
POST/v1/products/{product_id}/issues:bulkSetStatusSet the same status on many issues
GET/v1/products/{product_id}/issues/{issue_id}/fix-contextEverything needed to fix one issue, in one call

Notes:

  • GET /v1/products/{product_id}/issues filters on status (unresolved, resolved, ignored, or empty for all), environment_id, release_id, component_id, repeated platforms, and a trailing period window (3m, 1h, 12h, 1d, 7d, 30d). Sort with sort (last_seen, first_seen, times_seen) and page with the opaque cursor in pagination.page_token. Issues are not filtered by level: a request that sends levels fails with 400 Bad Request.
  • An issue itself has no environment — environment lives on its occurrences. Use GET /v1/issues/{id}/stats to learn where an issue is actually happening.
  • GET /v1/issues/{id} symbolicates only the latest occurrence. When the occurrence that matters is not the latest one, fetch it directly with GET /v1/issues/{id}/events/{event_id}.
  • event_id in the occurrence path is the occurrence's Tiden id, not the event_id the SDK generated.
  • Status changes are recorded with the actor that made them and are reversible.
  • fix-context returns the issue, its symbolicated frames, the repository files those frames implicate, the per-environment split, the attributed component, and, for each spec those files implement, whether a test already covers it (verified, not_run, or no_test). It accepts branch and max_frames, clears the raw event payload, and names anything it dropped in truncation_signals. Prefer it over stitching the reads above together.

Source map upload​

MethodPathPurpose
POST/v1/products/{product_id}/sourcemapsCreate source map upload
POST/v1/sourcemaps/{id}:confirmConfirm source map upload

Web-only endpoint groups​

These are primarily for the Tiden web app and browser sessions:

  • Signup, login, refresh, logout, profile, password, avatar, MFA, and passkeys.
  • API token create/list/revoke.
  • Organization members, invites, roles, statuses, workspace scopes, and invite links.
  • Workspace create/update/delete, members, invites, and invite links.
  • Product get/update/delete and product setup read.
  • Component get/update/delete.
  • Environment update.
  • Spec/test move, history, and restore.
  • Attachment upload/download.
  • Credential create/list/delete/test.
  • Billing overview, checkout, portal, and pricing.
  • Issue DSN key management, inbound filters, the issue overview aggregates that back UI tiles (counts, stats, facets), and source map list/delete.
  • Quality gate overview history and mark-seen.
  • Agent config update, memory, triggers, and artifacts.

Error tracking ingest endpoint​

SDK event ingest is not a proto REST endpoint. It is a separate DSN-authenticated HTTP surface:

POST /api/{product_id}/envelope/?tiden_key=<publicKey>
POST /api/{product_id}/store/?tiden_key=<publicKey>

Use Custom ingest only when an official SDK is not available.