Signals

For instructions on how to authenticate to use this endpoint, see API overview.

Endpoints

GET
DELETE
GET
GET
GET
GET
GET
POST
GET
POST
POST
GET
POST
GET
PATCH
DELETE

List all signals processing

Return current processing state including pause status.

Required API key scopes

task:read

Query parameters

  • limit
    integer
  • offset
    integer

Response


Example request

GET /api/projects/:project_id/signals/processing
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/processing/

Example response

Status 200
RESPONSE
{
"count": 123,
"next": "http://api.example.org/accounts/?offset=400&limit=100",
"previous": "http://api.example.org/accounts/?offset=200&limit=100",
"results": [
{
"paused_until": "2019-08-24T14:15:22Z"
}
]
}

Delete signals processing pause

View and control signal processing pipeline state for a team.

Required API key scopes

task:write

Response


Example request

DELETE /api/projects/:project_id/signals/processing/pause
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X DELETE \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/processing/pause/

Example response

Status 200
RESPONSE
{
"status": "string",
"paused_until": "2019-08-24T14:15:22Z"
}

List all signals reports

Required API key scopes

task:read

Query parameters

  • limit
    integer
  • offset
    integer
  • ordering
    string
  • search
    string
  • source_product
    string
  • status
    string
  • suggested_reviewers
    string

Response


Example request

GET /api/projects/:project_id/signals/reports
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/reports/

Example response

Status 200
RESPONSE
{
"count": 123,
"next": "http://api.example.org/accounts/?offset=400&limit=100",
"previous": "http://api.example.org/accounts/?offset=200&limit=100",
"results": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"title": "string",
"summary": "string",
"status": "potential",
"total_weight": 0.1,
"signal_count": 0,
"signals_at_run": 0,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"artefact_count": 0,
"priority": "string",
"actionability": "string",
"already_addressed": true,
"is_suggested_reviewer": false,
"source_products": [
"string"
],
"implementation_pr_url": "string"
}
]
}

Retrieve signals reports

Required API key scopes

task:read

Path parameters

  • id
    string

Response


Example request

GET /api/projects/:project_id/signals/reports/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/reports/:id/

Example response

Status 200
RESPONSE
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"title": "string",
"summary": "string",
"status": "potential",
"total_weight": 0.1,
"signal_count": 0,
"signals_at_run": 0,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"artefact_count": 0,
"priority": "string",
"actionability": "string",
"already_addressed": true,
"is_suggested_reviewer": false,
"source_products": [
"string"
],
"implementation_pr_url": "string"
}

Retrieve signals scout project profile

Return the team's deterministic project profile. For the internal scout token the response reflects the newest non-expired cached row or a freshly-built one (lazy compute on cache miss); force_refresh=true skips the cache and rebuilds from authoritative sources. Public read callers (session auth or a signal_scout:read PAK) get the newest cached profile, or 404 if none has been built yet — they never trigger a rebuild. Read this at the start of a run to orient on the team's product mix, integrations, warehouse sources, signal coverage, and existing inbox surface.

Required API key scopes

signal_scout:read

Query parameters

  • force_refresh
    boolean
    Default: false

Response


Example request

GET /api/projects/:project_id/signals/scout/project_profile/current
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/project_profile/current/

Example response

Status 200 The team's current project profile (cached, or freshly built for the internal scout token).
RESPONSE
{
"profile_id": "string",
"computed_at": "string",
"expires_at": "string",
"source_version": "string",
"payload": {
"inventory": {
"project_context": {
"product_description": "string",
"app_urls": [
"string"
]
},
"products_in_use": [
"string"
],
"product_intents": [
{
"product_type": "string",
"activated_at": "string",
"created_at": "string"
}
],
"integrations": [
{
"kind": "string",
"created_at": "string"
}
],
"external_data_sources": [
{
"source_type": "string",
"status": "string",
"prefix": "string",
"created_at": "string"
}
],
"signal_source_configs": {
"enabled": [
{
"source_product": "string",
"source_type": "string"
}
],
"disabled": [
{
"source_product": "string",
"source_type": "string"
}
]
},
"existing_inbox_reports": {
"total": 0,
"by_status": [
{
"status": "string",
"count": 0
}
]
},
"recent_activity": {
"window_days": 0,
"by_scope": [
{
"scope": "string",
"edits": 0,
"users": 0,
"last_edit": "string"
}
]
},
"recent_dashboards": [
{
"id": 0,
"name": "string",
"last_accessed_at": "string",
"last_refresh": "string",
"created_at": "string"
}
],
"recent_surveys": {
"total_count": 0,
"active_count": 0,
"recent": [
{
"id": "string",
"name": "string",
"type": "string",
"status": "string",
"updated_at": "string"
}
]
},
"recent_feature_flags": {
"total_count": 0,
"active_count": 0,
"recent": [
{
"id": 0,
"key": "string",
"name": "string",
"active": true,
"updated_at": "string"
}
]
},
"recent_experiments": {
"total_count": 0,
"running_count": 0,
"recent": [
{
"id": 0,
"name": "string",
"status": "string",
"feature_flag_key": "string",
"updated_at": "string"
}
]
},
"recent_alerts": {
"total_count": 0,
"enabled_count": 0,
"recent": [
{
"id": "string",
"name": "string",
"enabled": true,
"state": "string",
"calculation_interval": "string",
"insight_id": 0,
"created_at": "string"
}
]
},
"recent_hog_functions": {
"total_count": 0,
"enabled_count": 0,
"recent": [
{
"id": "string",
"name": "string",
"type": "string",
"kind": "string",
"enabled": true,
"updated_at": "string"
}
]
},
"recent_hog_flows": {
"total_count": 0,
"active_count": 0,
"recent": [
{
"id": "string",
"name": "string",
"status": "string",
"updated_at": "string"
}
]
},
"recent_notebooks": {
"total_count": 0,
"recent": [
{
"short_id": "string",
"title": "string",
"last_modified_at": "string"
}
]
},
"recent_cohorts": {
"total_count": 0,
"recent": [
{
"id": 0,
"name": "string",
"is_static": true,
"count": 0,
"created_at": "string"
}
]
},
"recent_actions": {
"total_count": 0,
"recent": [
{
"id": 0,
"name": "string",
"updated_at": "string"
}
]
},
"top_events": [
{
"event": "string",
"count": 0,
"distinct_users": 0,
"recent_24h_count": 0,
"recent_24h_users": 0,
"first_seen": "string",
"last_seen": "string"
}
]
}
}
}
Status 404 No profile has been built for this team yet, and the caller is not the internal scout token (which builds on cache miss). Public read callers never trigger a build.

List all signals scout runs

Return the most recent SignalScoutRun summaries for this project, newest first. Used by the headless scout to dedupe against work other runs already covered. ILIKE matches on summary. date_from / date_to are a half-open window on created_at (>= date_from, < date_to); pass date_to on subsequent calls to walk past the 100-row cap. Results capped at 100.

Required API key scopes

signal_scout:read

Query parameters

  • date_from
    string
  • date_to
    string
  • limit
    integer
  • text
    string

Example request

GET /api/projects/:project_id/signals/scout/runs
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/runs/

Example response

Status 200 Recent run summaries newest-first.
RESPONSE
{
"run_id": "string",
"skill_name": "string",
"skill_version": 0,
"status": "string",
"started_at": "string",
"completed_at": "string",
"task_id": "string",
"task_run_id": "string",
"task_url": "string",
"summary": "string"
}

Retrieve signals scout runs

Return the full SignalScoutRun row. Status, timing, and error flow from the linked tasks.TaskRun. Strictly team-scoped — a UUID belonging to another team returns 404.

Required API key scopes

signal_scout:read

Path parameters

  • id
    string

Response


Example request

GET /api/projects/:project_id/signals/scout/runs/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/runs/:id/

Example response

Status 200 Full run detail.
RESPONSE
{
"run_id": "string",
"skill_name": "string",
"skill_version": 0,
"status": "string",
"started_at": "string",
"completed_at": "string",
"task_id": "string",
"task_run_id": "string",
"task_url": "string",
"summary": "string"
}
Status 404 Run not found or not visible to this project.

Create signals scout emit

Fire emit_signal with source_product = signals_scout. The finding_id is baked into the deterministic Signal.source_id = run:<id>:finding:<id> for traceability, but this is NOT idempotent — a second call with the same finding_id emits a second signal, so do not retry an emit that may have already succeeded.

Required API key scopes

signal_scout_internal:write

Path parameters

  • id
    string

Request parameters

  • description
    string
  • weight
    number
  • confidence
    number
  • evidence
    Click to open
    array
  • hypothesis
    stringnull
  • severity
  • dedupe_keys
    array
  • time_range
  • mcp_trace_id
    stringnull
  • finding_id
    stringnull

Response


Example request

POST /api/projects/:project_id/signals/scout/runs/:id/emit-signal
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/runs/:id/emit-signal/\
-d description="string",\
-d weight="number",\
-d confidence="number",\
-d evidence="array"

Example response

Status 200 Finding emitted, or skipped by a preflight gate.
RESPONSE
{
"finding_id": "string",
"emitted": true,
"skipped_reason": "string"
}
Status 400 Invalid emit shape (description, weight, confidence, evidence cap).
Status 404 Run not found for this project.

Retrieve signals scout scratchpad

Return SignalScratchpad entries for this project. ILIKE matches on content and key.

Required API key scopes

signal_scout:read

Query parameters

  • limit
    integer
  • text
    string

Example request

GET /api/projects/:project_id/signals/scout/scratchpad
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/scratchpad/

Example response

Status 200 Matching memory entries newest-first.
RESPONSE
{
"key": "string",
"content": "string",
"created_at": "string",
"updated_at": "string",
"created_by_run_id": "string"
}

Create signals scout scratchpad

Upsert a memory keyed on (team, key). Re-using a key updates the existing entry in place.

Required API key scopes

signal_scout_internal:write

Request parameters

  • key
    string
  • content
    string
  • run_id
    stringnull

Response


Example request

POST /api/projects/:project_id/signals/scout/scratchpad
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/scratchpad/\
-d key="string",\
-d content="string"

Example response

Status 200 Memory entry written or refreshed.
RESPONSE
{
"key": "string",
"content": "string",
"created_at": "string",
"updated_at": "string",
"created_by_run_id": "string"
}
Status 400 Invalid memory shape (empty key/content, key too long).

Create signals scout scratchpad

Delete an entry by key. Returns deleted=false if no row matched.

Required API key scopes

signal_scout_internal:write

Request parameters

  • key
    string

Response


Example request

POST /api/projects/:project_id/signals/scout/scratchpad/forget
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/scout/scratchpad/forget/\
-d key="string"

Example response

Status 200 Whether a row was removed.
RESPONSE
{
"deleted": true
}

List all signals source configs

Required API key scopes

task:read

Query parameters

  • limit
    integer
  • offset
    integer

Response


Example request

GET /api/projects/:project_id/signals/source_configs
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/source_configs/

Example response

Status 200
RESPONSE
{
"count": 123,
"next": "http://api.example.org/accounts/?offset=400&limit=100",
"previous": "http://api.example.org/accounts/?offset=200&limit=100",
"results": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"source_product": "session_replay",
"source_type": "session_analysis_cluster",
"enabled": true,
"config": null,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"status": "string"
}
]
}

Create signals source configs

Required API key scopes

task:write

Request parameters

  • source_product
  • source_type
  • enabled
    boolean
  • config

Response


Example request

POST /api/projects/:project_id/signals/source_configs
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl
-H 'Content-Type: application/json'\
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/source_configs/\
-d source_product=undefined,\
-d source_type=undefined

Example response

Status 201
RESPONSE
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"source_product": "session_replay",
"source_type": "session_analysis_cluster",
"enabled": true,
"config": null,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"status": "string"
}

Retrieve signals source configs

Required API key scopes

task:read

Path parameters

  • id
    string

Response


Example request

GET /api/projects/:project_id/signals/source_configs/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/source_configs/:id/

Example response

Status 200
RESPONSE
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"source_product": "session_replay",
"source_type": "session_analysis_cluster",
"enabled": true,
"config": null,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"status": "string"
}

Update signals source configs

Required API key scopes

task:write

Path parameters

  • id
    string

Request parameters

  • source_product
  • source_type
  • enabled
    boolean
  • config

Response


Example request

PATCH /api/projects/:project_id/signals/source_configs/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X PATCH \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/source_configs/:id/\
-d source_product=undefined

Example response

Status 200
RESPONSE
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"source_product": "session_replay",
"source_type": "session_analysis_cluster",
"enabled": true,
"config": null,
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z",
"status": "string"
}

Delete signals source configs

Required API key scopes

task:write

Path parameters

  • id
    string

Example request

DELETE /api/projects/:project_id/signals/source_configs/:id
export POSTHOG_PERSONAL_API_KEY=[your personal api key]
curl -X DELETE \
-H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY" \
<ph_app_host>/api/projects/:project_id/signals/source_configs/:id/

Example response

Status 204 No response body

Community questions

Questions about this page? or post a community question.