REST API / Views
signals
View
Lead signals are matched community posts. For brand/competitor sentiment use mentions (subject_label, sentiment_label, sentiment_theme). AI answers are in ai_answers; grouped claims and objections are in perception_items. Text search awaits database full-text indexes; use the legacy search_signals tool for bounded text search.
- Max rows per query
- 100
- Default order
- post_id desc
- Required filter
- one of project_id, post_id
- Max offset
- 2000
- Cursor paging
- by project_id, post_id
Full-text search requires a database search index. Use legacy search_signals while it is unavailable.
Use read report_* for dashboard headline metrics.
Fields
| Field | Type | Description | Filter | Sort |
|---|---|---|---|---|
id | string | Unique project ID and post ID pair. | – | – |
project_id indexed | string | Project ID from projects. | ✓ | ✓ |
post_id indexed | integer | Source post ID. | ✓ | ✓ |
scorenullable indexed | number | Relevance score from 0 to 1; null when unknown. | ✓ | ✓ |
reason | string | Reason the post matched. | ✓ | ✓ |
score_category | string | Canonical score category.Keyword match 85%+ 75–85% 65–75% 50–65% <50% | ✓ | ✓ |
tags | string[] | Visible intent and custom tags; internal tokens are removed in SQL before filtering. | ✓ | – |
matched_keywords | string[] | Matched tracked keywords. | ✓ | – |
created_at indexed | datetime | Match ingestion time; use posted_at for source publication windows. | ✓ | ✓ |
starred indexed | boolean | Whether starred. | ✓ | ✓ |
seen_atnullable indexed | datetime | When last marked seen. | ✓ | ✓ |
archived_atnullable indexed | datetime | When archived. | ✓ | ✓ |
reply_statusnullable | string | Latest reply workflow status for the authenticated member; null when absent.PENDING WILL_REPLY SKIPPED SAVED_FOR_LATER REPLIED | ✓ | ✓ |
replied_atnullable | datetime | When the authenticated member marked the signal replied. | ✓ | ✓ |
source indexed | string | Source platform.REDDIT XCOM LINKEDIN | ✓ | ✓ |
subreddit | string | Source community. | ✓ | ✓ |
title | string | Post title. Full-text filtering requires a search index; use search_signals. | – | ✓ |
bodynullable | string | Post body excerpt, at most 2000 characters over MCP. Use get_signal for full detail and continuation. | – | ✓ |
url | string | Post URL. | ✓ | ✓ |
permalinknullable | string | Source permalink. | ✓ | ✓ |
post_score | integer | Platform score. | ✓ | ✓ |
num_comments | integer | Comment count. | ✓ | ✓ |
posted_at indexed | datetime | Source publication time, distinct from match ingestion created_at. Filter and sort for recent posts. | ✓ | ✓ |
Examples
Example
SELECT id, project_id, post_id, score, reason
FROM signals
WHERE project_id = $1
ORDER BY post_id DESC
LIMIT 25Calling it
MCP
Tool call
query({"sql":"SELECT id, project_id, post_id, score, reason FROM signals WHERE project_id = $1 ORDER BY post_id DESC LIMIT 25","params":["<value 1>"]})REST
curl
curl -X POST "https://app.sensorhub.ai/api/v1/query" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"sql": "SELECT id, project_id, post_id, score, reason FROM signals WHERE project_id = $1 ORDER BY post_id DESC LIMIT 25",
"params": [
"<value 1>"
]
}
JSONRow JSON Schema
json
{
"type": "object",
"description": "Lead signals are matched community posts. For brand/competitor sentiment use mentions (subject_label, sentiment_label, sentiment_theme). AI answers are in ai_answers; grouped claims and objections are in perception_items. Text search awaits database full-text indexes; use the legacy search_signals tool for bounded text search.",
"properties": {
"id": {
"type": "string",
"description": "Unique project ID and post ID pair.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": false,
"x-sensorhub-sortable": false
},
"project_id": {
"type": "string",
"description": "Project ID from projects.",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"post_id": {
"type": "integer",
"description": "Source post ID.",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"score": {
"type": [
"number",
"null"
],
"description": "Relevance score from 0 to 1; null when unknown.",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"reason": {
"type": "string",
"description": "Reason the post matched.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"score_category": {
"type": "string",
"description": "Canonical score category.",
"enum": [
"Keyword match",
"85%+",
"75–85%",
"65–75%",
"50–65%",
"<50%"
],
"x-sensorhub-filter-operators": [
"=",
"!=",
"<>",
"IN",
"NOT IN",
"IS NULL",
"IS NOT NULL"
],
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"tags": {
"type": "array",
"description": "Visible intent and custom tags; internal tokens are removed in SQL before filtering.",
"items": {
"type": "string"
},
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": false,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": false
},
"matched_keywords": {
"type": "array",
"description": "Matched tracked keywords.",
"items": {
"type": "string"
},
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": false,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": false
},
"created_at": {
"type": "string",
"description": "Match ingestion time; use posted_at for source publication windows.",
"format": "date-time",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"starred": {
"type": "boolean",
"description": "Whether starred.",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"seen_at": {
"type": [
"string",
"null"
],
"description": "When last marked seen.",
"format": "date-time",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"archived_at": {
"type": [
"string",
"null"
],
"description": "When archived.",
"format": "date-time",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"reply_status": {
"type": [
"string",
"null"
],
"description": "Latest reply workflow status for the authenticated member; null when absent.",
"enum": [
"PENDING",
"WILL_REPLY",
"SKIPPED",
"SAVED_FOR_LATER",
"REPLIED",
null
],
"x-sensorhub-filter-operators": [
"=",
"!=",
"<>",
"IN",
"NOT IN",
"IS NULL",
"IS NOT NULL"
],
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"replied_at": {
"type": [
"string",
"null"
],
"description": "When the authenticated member marked the signal replied.",
"format": "date-time",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"source": {
"type": "string",
"description": "Source platform.",
"enum": [
"REDDIT",
"XCOM",
"LINKEDIN"
],
"x-sensorhub-filter-operators": [
"=",
"!=",
"<>",
"IN",
"NOT IN",
"IS NULL",
"IS NOT NULL"
],
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"subreddit": {
"type": "string",
"description": "Source community.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"title": {
"type": "string",
"description": "Post title. Full-text filtering requires a search index; use search_signals.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": false,
"x-sensorhub-sortable": true
},
"body": {
"type": [
"string",
"null"
],
"description": "Post body excerpt, at most 2000 characters over MCP. Use get_signal for full detail and continuation.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": false,
"x-sensorhub-sortable": true
},
"url": {
"type": "string",
"description": "Post URL.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"permalink": {
"type": [
"string",
"null"
],
"description": "Source permalink.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"post_score": {
"type": "integer",
"description": "Platform score.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"num_comments": {
"type": "integer",
"description": "Comment count.",
"x-sensorhub-indexed": false,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
},
"posted_at": {
"type": "string",
"description": "Source publication time, distinct from match ingestion created_at. Filter and sort for recent posts.",
"format": "date-time",
"x-sensorhub-indexed": true,
"x-sensorhub-searchable": false,
"x-sensorhub-aggregatable": true,
"x-sensorhub-filterable": true,
"x-sensorhub-sortable": true
}
},
"additionalProperties": false
}