Signals
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
POST | |
GET | |
POST | |
GET | |
GET | |
POST | |
PATCH | |
DELETE | |
POST | |
DELETE | |
POST | |
POST | |
DELETE | |
GET | |
POST | |
POST | |
GET | |
POST |
Create signals reports feedback
Record the thumbs rating at the end of a report, with an optional note. For browser-session requests the rating is persisted as a per-person report action, which counts as consumption evidence for the scout that authored the report (scouts whose output nobody consumes are eventually paused); requests authenticated any other way record no action. When a note is present and the report was authored by a scout, the note is also forwarded to that scout as a steering note it reads on its next run; for any other report there is nothing to steer. The report's state is never changed.
Required API key scopes
task:readPath parameters
- idstring
Request parameters
- sentiment
- notestringDefault:
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /feedbackExample response
Status 200
Retrieve signals reports feedback state
Required API key scopes
task:readPath parameters
- idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:id /feedback_stateExample response
Status 200
Create signals reports merge
Fold one or more duplicate reports into this report, which survives. The sources' signals, work-log artefacts, pull requests, task runs and checks move onto the survivor, the survivor's signal counters take on theirs, and each source is archived with a 'duplicate of' link back to the survivor. A source's open pull request stays open, because the survivor holds it after the move. Pick the survivor deliberately: prefer the older report, and prefer the one with an open implementation PR or an active claim. Any active claim on a source is released, so re-claim the survivor if you were working on one. Titles and summaries are not combined, so edit it afterwards if it needs a rewrite. A merged report keeps its URL but cannot be restored, because its signals now belong to the survivor.
Required API key scopes
task:writePath parameters
- idstring
Request parameters
- source_report_idsarray
- reasonstring
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /mergeExample response
Status 200 The surviving report after the merge, plus one result per merged source.
Status 404 The surviving report was not found in this project.
Status 409 Both ends of a merge must be a live report of this project. Returned when the survivor is resolved, or when a source is the survivor itself, is resolved or archived, is still being researched, carries more signals than one merge can move, or belongs to another project. Nothing is applied.
Retrieve signals report pr
Fetch the CI status (GitHub Actions check runs and legacy commit statuses) of the pull request attached to the report, via the team's GitHub integration.
Required API key scopes
task:readPath parameters
- idstring
Query parameters
- pull_request_idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:id /pr_checksExample response
Status 200 The CI checks on the report's implementation pull request.
Status 403 GitHub is connected without permission to read pull request checks.
Status 404 Report has no implementation PR, or no GitHub integration can access it.
Status 502 GitHub could not return the checks.
Status 503 The GitHub egress budget is temporarily unavailable.
Retrieve signals report pr
Fetch the pull request's conversation comments and inline review comments, merged chronologically, via the team's GitHub integration.
Required API key scopes
task:readPath parameters
- idstring
Query parameters
- pull_request_idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:id /pr_commentsExample response
Status 200 Conversation and review comments on the report's implementation pull request.
Status 404 Report has no implementation PR, or no GitHub integration can access it.
Status 502 GitHub could not return the comments.
Status 503 The GitHub egress budget is temporarily unavailable.
Create signals report pr review comments
Post an inline review comment on the report's implementation pull request, attributed to the requesting user's own GitHub identity via their personal GitHub connection. Either replies to an existing thread (in_reply_to) or starts a new thread on a diff line (path + line).
Required API key scopes
task:writePath parameters
- idstring
Query parameters
- pull_request_idstring
Request parameters
- bodystring
- in_reply_tostring | null
- pathstring | null
- lineinteger | null
- side
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /pr_review_commentsExample response
Status 201 The created review comment, in the normalized PR-comment shape.
Status 400 Invalid comment payload.
Status 403 Not a signed-in user, or the requesting user has no usable personal GitHub connection (reconnect GitHub).
Status 404 Report has no implementation PR, or no GitHub integration can access it.
Status 502 GitHub rejected the comment.
Status 503 The GitHub egress budget is temporarily unavailable.
Update signals report pr review comment
Required API key scopes
task:writePath parameters
- comment_idstring
- idstring
Query parameters
- pull_request_idstring
Request parameters
- bodystring
Response
Example request
PATCH /api /projects /:project_id /signals /reports /:id /pr_review_comments /:comment_idExample response
Status 200 The edited review comment, in the normalized PR-comment shape.
Status 403 Not a signed-in user, no usable personal GitHub connection, or not the comment's author.
Status 404 Report has no implementation PR, or the comment isn't on it.
Status 502 GitHub rejected the edit.
Status 503 The GitHub egress budget is temporarily unavailable.
Delete signals report pr review comment
Required API key scopes
task:writePath parameters
- comment_idstring
- idstring
Query parameters
- pull_request_idstring
Example request
DELETE /api /projects /:project_id /signals /reports /:id /pr_review_comments /:comment_idExample response
Status 204 Comment deleted.
Status 403 Not a signed-in user, no usable personal GitHub connection, or not the comment's author.
Status 404 Report has no implementation PR, or the comment isn't on it.
Status 502 GitHub rejected the delete.
Status 503 The GitHub egress budget is temporarily unavailable.
Create signals report pr review comment reactions
Required API key scopes
task:writePath parameters
- comment_idstring
- idstring
Query parameters
- pull_request_idstring
Request parameters
- content
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /pr_review_comments /:comment_id /reactionsExample response
Status 201 The created reaction.
Status 403 Not a signed-in user, or no usable personal GitHub connection.
Status 404 Report has no implementation PR, or the comment isn't on it.
Status 502 GitHub rejected the reaction.
Status 503 The GitHub egress budget is temporarily unavailable.
Delete signals report pr review comment reaction
Required API key scopes
task:writePath parameters
- comment_idstring
- idstring
- reaction_idstring
Query parameters
- pull_request_idstring
Example request
DELETE /api /projects /:project_id /signals /reports /:id /pr_review_comments /:comment_id /reactions /:reaction_idExample response
Status 204 Reaction removed.
Status 403 Not a signed-in user, or no usable personal GitHub connection.
Status 404 Report has no implementation PR, or the comment isn't on it.
Status 502 GitHub rejected the removal.
Status 503 The GitHub egress budget is temporarily unavailable.
Create signals reports refund
Refund the flat charge for this report's implementation PR and archive the report. Refunds auto-approve: the charge is either excluded from usage before it is ever reported to billing (refund on the same UTC day as the PR run) or returned as a Stripe customer-balance credit on the next invoice. A refunded PR does not count toward the free monthly PR allowance. One refund per report, ever — repeat calls return the existing refund with already_refunded=true. The report is archived as part of the refund (a resolved report stays resolved) and can't be restored afterwards.
Required API key scopes
task:writePath parameters
- idstring
Request parameters
- reason
- notestring
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /refundExample response
Status 200 The refund (created, or the existing one with already_refunded=true when the report was refunded before).
Status 400 Report is not refundable: no billable implementation PR, the PR run is outside the current billing period, or the report is system-marked never-billable.
Status 404 Report not found, or refunds are not enabled for this organization.
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. ranking_score content keeps only the head fields of each model's metadata; get the artefact by id for the full metadata.
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
- expected_reviewers
- reviewer_outcomeDefault:
selected - reviewer_retry_reasonstring
- claim_idstring
- artefact_typestring
- content
Response
Example request
POST /api /projects /:project_id /signals /reports /:report_id /artefacts










