Signals
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
GET | |
DELETE | |
GET | |
GET | |
PATCH | |
GET | |
GET | |
POST | |
GET | |
POST | |
GET | |
POST | |
GET | |
PATCH | |
DELETE | |
GET | |
POST | |
GET | |
POST |
List all signals processing
Return current processing state including pause status.
Required API key scopes
task:readQuery parameters
- limitinteger
- offsetinteger
Response
Example request
GET /api /projects /:project_id /signals /processingExample response
Status 200
Delete signals processing pause
View and control signal processing pipeline state for a team.
Required API key scopes
task:writeResponse
Example request
DELETE /api /projects /:project_id /signals /processing /pauseExample response
Status 200
List all signals reports
Required API key scopes
task:readQuery parameters
- has_implementation_prboolean
- include_all_statusesboolean
- limitinteger
- offsetinteger
- orderingstring
- prioritystring
- scoutstring
- searchstring
- source_idstring
- source_productstring
- statusstring
- suggested_reviewersstring
- task_idstring
Response
Example request
GET /api /projects /:project_id /signals /reportsExample response
Status 200
Retrieve signals reports
Required API key scopes
task:readPath parameters
- idstring
Response
Example request
GET /api /projects /:project_id /signals /reports /:idExample response
Status 200
Update signals reports
Edit the human-facing title and/or summary (description) of a signal report, addressed by id. Both fields are optional — supply only the ones you want to change; at least one is required. Every other report field (status, weights, judgments) is managed by the signals pipeline and cannot be set here. Returns the full updated report.
Required API key scopes
task:writePath parameters
- idstring
Request parameters
- titlestring
- summarystring
Response
Example request
PATCH /api /projects /:project_id /signals /reports /:idExample response
Status 200 Report updated.
Status 400 Neither title nor summary supplied, or a value failed validation.
Status 404 Report not found for this project.
Retrieve signals report pr
Fetch the CI status (GitHub Actions check runs and legacy commit statuses) of the pull request the report's implementation task opened, via the team's GitHub integration.
Required API key scopes
task:readPath parameters
- 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 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
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 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.
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.
The request body is validated by SignalReportStateRequestSerializer — only the fields it declares (state, dismissal_reason, dismissal_note, 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 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
- snooze_forinteger
Response
Example request
POST /api /projects /:project_id /signals /reports /:id /stateExample response
Status 200
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) 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
- 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).
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 404 Artefact not found for this report / project.
Retrieve signals report artefacts
Fetch the unified diff of a commit artefact's branch against the repository default branch via the team's GitHub integration — using the branch's current tip so the diff reflects the latest state of the work, not just the single recorded commit.
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 branch's unified diff against the repository default branch.
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).
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
- snooze_forinteger
- idsarray
Response
Example request
POST /api /projects /:project_id /signals /reports /bulk-stateExample response
Status 200
Retrieve signals reports refund summary
Aggregate credited-path refunds across the whole organization for the current billing period — counts only, no per-team detail. The billing usage widget needs this because billing usage is org-wide while reports (and their refunds) are team-scoped: subtract the refunded credits from billing usage to show the net PR count. Excluded-path refunds never reach billing usage, so no adjustment is needed for them. Also carries the org's live billable credits for the period (billing's recorded usage lags by up to a day), so the widget can count just-created PRs and react to same-day refunds.
Required API key scopes
task:readResponse
Example request
GET /api /projects /:project_id /signals /reports /refund-summaryExample response
Status 200 Org-wide credited-refund totals for the current billing period.
Status 404 Refunds are not enabled for this organization.
Create signals scout
Create a signals-scout-* skill and its runnable config atomically. The skill always receives the report-channel tools. The optional config controls schedule, enablement, dry-run posture, and typed destinations such as Slack. Repeating the same definition is safe and applies any supplied config fields; reusing its name for a different definition returns 409.
Required API key scopes
llm_skill:writesignal_scout:writeRequest parameters
- namestring
- descriptionstring
- bodystring
- filesarray
- config
Response
Example request
POST /api /projects /:project_id /signals /scout