Signals
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
GET | |
PATCH | |
DELETE | |
GET | |
GET | |
GET | |
DELETE | |
POST | |
POST | |
GET | |
POST | |
GET | |
POST | |
POST | |
GET | |
POST | |
POST | |
POST | |
GET | |
POST |
Retrieve signals report artefacts
Get one artefact by id, content parsed (and reviewers enriched) the same way as the list. A ranking_score keeps its full model metadata.
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_observation, check_result, check_scheduled, code_review, impact_measurement_plan, implementation_decision, implementation_dispatch, implementation_handover, implementation_replacement, pull_request, ranking_score, report_link, reviewer_corrections, 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 pr ci
Resolve the coarse CI rollup of the pull requests several reports opened, so a list of reports can show which pull requests are red without opening each report. One GitHub call covers the whole batch, and the answers are cached briefly and shared across callers. A report is left out when it has no open implementation pull request, and also when GitHub could not answer for it (no integration reaches the repository, a rate limit, an upstream failure), so a caller shows no CI state for it rather than an error. For the individual checks behind the rollup, use pr_checks.
Required API key scopes
task:readQuery parameters
- report_idsstring
Response
Example request
GET /api /projects /:project_id /signals /reports /pr_ci_statusesExample response
Status 200 The CI rollup of each requested report's implementation pull request.
Status 400 `report_ids` is missing, not a list of UUIDs, or over the cap.
Create signals reports read state
Required API key scopes
task:readRequest parameters
- report_idsarray
- readboolean
Response
Example request
POST /api /projects /:project_id /signals /reports /read_stateExample response
Status 200
Create signals reports refresh metrics
Re-run the stored metric queries of the given reports through the query cache and save the newest values as their snapshots. Call it when a person opens the inbox list or a report, with the ids on screen. Report titles and summaries are point-in-time text and never change here; only value, value_at, and series do, and legacy comparisons are cleared. A snapshot measured in the last 15 minutes is served as is. Each call runs at most 40 source series inside a 20-second budget, row metrics first; the rest keep their previous snapshot until the next open. Returns snapshot-only metrics for every requested report the caller can read whose status is ready or pending_input. A report in any other status is left out of the response, and its saved snapshots stay as they are.
Required API key scopes
task:readRequest parameters
- report_idsarray
Response
Example request
POST /api /projects /:project_id /signals /reports /refresh_metricsExample 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 reports source metadata
Read which source products contributed signals to each given report, and which scout authored it. These values come from ClickHouse, so the inbox list skips them (include_source_metadata=false) and calls this after the rows render. Returns one entry per requested id. An id with no signals in this project gets empty values.
Required API key scopes
task:readRequest parameters
- report_idsarray
Response
Example request
POST /api /projects /:project_id /signals /reports /source_metadataExample response
Status 200
Create signals scout
Create a scout skill and its runnable config atomically. Give it a display_name — the label people read, kept exactly as written — and the scout's permanent skill name is generated from it, with a numeric suffix when that name is taken, so two scouts may share a label without sharing an identity. Pass name instead to pick that identifier yourself; any valid skill name works, since the config row is what makes a skill a scout. The skill always receives the report-channel tools. The optional config controls schedule, enablement, dry-run posture, network access, and typed destinations such as Slack. Repeating the same definition is safe and applies any supplied config fields; reusing an explicit name for a different definition returns 409.
Required API key scopes
llm_skill:writesignal_scout:writeRequest parameters
- display_namestring
- namestring
- descriptionstring
- bodystring
- filesarray
- config
- suggestion_idstring
Response
Example request
POST /api /projects /:project_id /signals /scoutExample response
Status 200 The scout definition already existed; the requested config fields were applied.
Status 201 The scout skill, config, or both were created.
Status 400 The scout definition, config, or destination is invalid.
Status 409 A scout with this name already exists with a different definition.
Create signals scout chat tasks
Create and run a cloud task for one of the fixed scout chat templates (suggest a scout, fleet overview, recent signals). The prompt is server-owned; an author_scout chat can carry the user's request, which the server fences inside that prompt. The response carries the task id to navigate to.
Required API key scopes
task:writeRequest parameters
- chat_type
- suggestion_idstring
- user_promptstring
Response
Example request
POST /api /projects /:project_id /signals /scout /chat_tasksExample response
Status 201 Chat task created and run started
Status 403 Organization has not approved AI data processing
Status 429 Team is over its posthog_code usage limit
List all signals scout config
List the per-(team, skill) scout configs for this project. Each row includes its display_name (the label people read), its skill_name (the permanent identifier), its schedule (rolling run_interval_minutes, or a project-local run_cron_schedule when set), enabled, emit posture, and tags. A freshly authored scout skill appears here once its config is registered, either explicitly via create or by the coordinator's next tick. Pass tags to narrow the fleet to the scouts carrying at least one of the given labels, and search to narrow it to the scouts matching a substring of either name.
Required API key scopes
signal_scout:readQuery parameters
- searchstring
- tagsstring
Example request
GET /api /projects /:project_id /signals /scout /configsExample response
Status 200 Per-scout configs for this project, ordered by the name each scout displays under.
Create signals scout config
Register the config for a skill immediately, without waiting for the coordinator to auto-register it — and the way to make a skill without the signals-scout- prefix a scout at all. The same call can optionally set run_interval_minutes, a cron run_cron_schedule, enabled, emit, network_access, and output destinations. The skill must already exist on this project. Upsert: if a config already exists for the skill, the provided fields are applied to it. Registering puts the skill's body on the schedule as the scout's prompt, so this call needs llm_skill:write and editor access to skills on top of signal_scout:write, like creating a scout.
Required API key scopes
signal_scout:writellm_skill:writeRequest parameters
- modelstring | null
- tagsarray
- structured_output_schemaobject | null
- mcp_gateway_server_idsarray
- repositoriesarray
- write_scopesarray
- lifecycle_lockedboolean
- allowed_mcp_toolsarray | null
- tool_preset
- precheck_querystring | null
- enabledboolean
- emitboolean
- run_interval_minutesinteger
- output_destinations
- network_access
- auto_pause_exemptboolean
- run_cron_schedulestring | null
- display_namestring
- skill_namestring
Response
Example request
POST /api /projects /:project_id /signals /scout /configs










