Signals
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
POST | |
DELETE | |
GET | |
POST | |
POST | |
GET | |
POST | |
GET | |
PATCH | |
DELETE | |
GET | |
GET | |
GET | |
DELETE | |
POST | |
POST | |
GET | |
POST | |
GET |
Create signals reports reingest
Re-ingest a report's signals (same team access as other report actions).
Required API key scopes
task:writePath parameters
- idstring
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /reingestExample response
Status 200 A re-ingestion is already running.
Status 202 Re-ingestion started.
Delete signals reports reviewers me
Take the calling user off this report's suggested reviewers, leaving the other reviewers as they are. The report itself is untouched: it stays open for whoever is left, and for the project. Succeeds whether or not the caller was on the list.
Required API key scopes
task:writePath parameters
- idstring
Example request
DELETE /api /projects /:project_id /signals /reports /:id /reviewers /meExample response
Status 204 The caller is no longer a suggested reviewer.
Status 400 A reviewer who stays no longer resolves to a member of this team.
Retrieve signals reports signals
Fetch all signals for a report from ClickHouse, including full metadata.
Required API key scopes
task:readPath parameters
- idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:id /signalsExample response
Status 200
Create signals reports state
Transition a report to a new state. The model validates allowed transitions, except that a verdict the report already holds (dismissing a suppressed report, resolving a resolved one) is a 200 that records the dismissal feedback without touching the status.
The request body is validated by SignalReportStateRequestSerializer — only the fields it declares (state, dismissal_reason, dismissal_note, corrected_repository, snooze_for) are read, and only snooze_for is ever forwarded to transition_to. Any other key is ignored, so internal transition_to kwargs (reset_weight, error, ...) can't be injected.
Body: { "state": "suppressed" | "potential" | "resolved", # Optional dismissal feedback (honored when state == "suppressed", "potential", or "resolved"): "dismissal_reason": "<canonical reason code, see SIGNAL_REPORT_DISMISSAL_REASON_CHOICES>", "dismissal_note": "free-form text", # Optional, only allowed with dismissal_reason == "wrong_repo": "corrected_repository": "owner/repo the report should have targeted", # Optional, only honored for state == "potential": "snooze_for": <number of additional signals before re-promotion>, }
Required API key scopes
task:writePath parameters
- idstring
Request parameters
- state
- dismissal_reason
- dismissal_notestring
- corrected_repositorystring
- snooze_forinteger
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /stateExample response
Status 200
Create signals reports viewed
Record that the caller opened this report's detail view. One row per person per report is kept (repeat views bump a counter), and the record counts as consumption evidence for the scout that authored the report — scouts whose reports nobody consumes are eventually paused. Intended as fire-and-forget from the inbox UI when a person opens a report. Only browser-session requests leave a record; a call with any other credential (personal API key, OAuth token) returns 204 but records nothing.
Required API key scopes
task:readPath parameters
- idstring
Example request
POST /api /projects /:project_id /signals /reports /:id /viewedExample response
Status 204 No response body
List all signals report artefacts
List every artefact on a report — the full work log: signal findings (the evidence behind the report), status judgments (safety / actionability / priority, repo selection, suggested reviewers — the newest row of each status type is canonical), and log entries (code references, commits, task runs, notes). suggested_reviewers content is enriched with PostHog user info at read time.
Required API key scopes
task:readPath parameters
- report_idstring
Query parameters
- limitinteger
- offsetinteger
Response
Example request
GET /api /projects /:project_id /signals /reports /:report_id /artefactsExample response
Status 200
Create signals report artefacts
Append an artefact to a report (see artefact_type for the writable types). Everything is append-only: log entries (code reference, commit, task run, note) accumulate, while status types (safety / actionability / priority judgments, repo selection, suggested reviewers, channel assignments) are latest-wins — appending a new version supersedes the previous one as the report's canonical status. Content is validated against the type's schema.
Required API key scopes
task:writePath parameters
- report_idstring
Request parameters
- claim_idstring
- artefact_typestring
- content
Response
Example request
POST /api /projects /:project_id /signals /reports /:report_id /artefactsExample response
Status 201 Artefact created.
Status 400 Unknown artefact type, content not matching the type's schema, or an invalid X-PostHog-Task-Id header.
Status 404 Report not found for this project.
Retrieve signals report artefacts
Get one artefact by id, content parsed (and reviewers enriched) the same way as the list.
Required API key scopes
task:readPath parameters
- idstring
- report_idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:report_id /artefacts /:idExample response
Status 200
Update signals report artefacts
Replace the content of an existing artefact, addressed by id. The new content is validated against the artefact's type schema. Editing the latest row of a status type changes the report's canonical status (latest-wins); to re-assess while keeping history, append a new artefact instead. Attribution is creation-time only — edits don't reassign it.
Required API key scopes
task:writePath parameters
- idstring
- report_idstring
Request parameters
- content
Response
Example request
PATCH /api /projects /:project_id /signals /reports /:report_id /artefacts /:idExample response
Status 200 Artefact updated.
Status 400 Content does not match the artefact type's schema.
Status 404 Artefact not found for this report / project.
Delete signals report artefacts
Delete an artefact, addressed by id. Deleting the latest row of a status type reverts the report's canonical status to the previous version (latest-wins over what remains). task_run artefacts are an append-only work log and cannot be deleted. Neither can the types this API cannot write, which the pipeline owns: autostart_skip, check_cancelled, check_expired, check_result, check_scheduled, code_review, impact_measurement_plan, implementation_decision, implementation_dispatch, implementation_handover, implementation_replacement, pull_request, ranking_score, report_link, summary_change, task_run, title_change, video_segment, work_claim, work_release.
Required API key scopes
task:writePath parameters
- idstring
- report_idstring
Example request
DELETE /api /projects /:project_id /signals /reports /:report_id /artefacts /:idExample response
Status 204 Artefact deleted.
Status 400 Artefact type cannot be deleted through the API.
Status 404 Artefact not found for this report / project.
Retrieve signals report artefacts
Fetch the unified diff for a commit artefact via the team's GitHub integration. A commit linked to a report pull request uses GitHub's durable pull request diff. A commit without that link compares the branch's current tip with the default branch.
Required API key scopes
task:readPath parameters
- idstring
- report_idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:report_id /artefacts /:id /diffExample response
Status 200 The pull request diff, or the branch diff when no pull request is linked.
Status 400 Artefact is not a commit, or is missing repository/branch.
Status 404 Artefact not found, or no GitHub integration can access the repository.
Status 502 GitHub could not produce the diff (branch not found, fetch failed).
List all signals report checks
List the forward-looking checks on a report. A check says what must stay true after the report was acted on, and the coordinator records each verdict as a check_result artefact on the report.
Required API key scopes
task:readPath parameters
- report_idstring
Query parameters
- limitinteger
- offsetinteger
Response
Example request
GET /api /projects /:project_id /signals /reports /:report_id /checksExample response
Status 200
Retrieve signals report checks
Checks attached to a signal report: read, approve, replace metrics, and cancel.
There is no create here. A check is authored by a scout run or by the research pipeline, both
through report_check_authoring.create_check. An agent check puts its author's prose in front
of a privileged scout run, and task:write does not authorize that, so no caller-facing
endpoint accepts one. Anyone who can read the report can read its checks, and a person can
still stop one.
There is no in-place update: a check is a claim about the future, and editing its threshold after a result would make the recorded verdict unreadable. Replacing an open metric check cancels the old row and creates a new one in one transaction.
Required API key scopes
task:readPath parameters
- idstring
- report_idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:report_id /checks /:idExample response
Status 200
Delete signals report checks
Stop a check that is still open — active, or pending its report resolving. Its recorded results stay on the report.
Required API key scopes
task:writePath parameters
- idstring
- report_idstring
Response
Example request
DELETE /api /projects /:project_id /signals /reports /:report_id /checks /:idExample response
Status 200
Create signals report checks approve
Record a person's quality signal. Approval does not affect scheduling or execution.
Required API key scopes
task:writePath parameters
- idstring
- report_idstring
Response
Example request
POST /api /projects /:project_id /signals /reports /:report_id /checks /:id /approveExample response
Status 200
Create signals report checks replace
Atomically replace an open metric check. The old check stays live if the new one is invalid.
Required API key scopes
task:writequery:readPath parameters
- idstring
- report_idstring
Request parameters
- titlestring
- rationalestring
- config
Response
Example request
POST /api /projects /:project_id /signals /reports /:report_id /checks /:id /replaceExample response
Status 200
Retrieve signals reports available reviewers
Required API key scopes
task:readQuery parameters
- querystring
Example request
GET /api /projects /:project_id /signals /reports /available_reviewersExample response
Status 200 Candidate reviewers keyed by user UUID.
Create signals reports bulk state
Transition many reports to a new state in one call.
Each id is processed independently: a report whose transition isn't allowed from its
current status is reported as skipped (a 409 on the single-report endpoint) and the
rest still go through. Returns one result per requested id (in request order, after
de-duplication) plus per-outcome counts. The whole call is 200 even on partial failure —
inspect results / the counts to see what happened.
Required API key scopes
task:writeRequest parameters
- state
- dismissal_reason
- dismissal_notestring
- corrected_repositorystring
- snooze_forinteger
- idsarray
Response
Example request
POST /api /projects /:project_id /signals /reports /bulk-stateExample response
Status 200
Retrieve signals reports for you
The open, actionable reports for the current user, best first, and how many there are in total. Uses the same ranking and count as the Today briefing, so this is the short list to show someone who asks what needs them. Pass include_unowned=false to leave out the P0 reports nobody owns, which belong to the project rather than to this person.
Required API key scopes
task:readQuery parameters
- include_unownedbooleanDefault:
true - limitintegerDefault:
5
Response
Example request
GET /api /projects /:project_id /signals /reports /for_you