sensorhubDevelopers
Open SensorhubGet an API key
Browse documentation
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

FieldTypeDescriptionFilterSort
id
stringUnique project ID and post ID pair.––
project_id
indexed
stringProject ID from projects.✓✓
post_id
indexed
integerSource post ID.✓✓
score
nullable indexed
numberRelevance score from 0 to 1; null when unknown.✓✓
reason
stringReason the post matched.✓✓
score_category
stringCanonical 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
datetimeMatch ingestion time; use posted_at for source publication windows.✓✓
starred
indexed
booleanWhether starred.✓✓
seen_at
nullable indexed
datetimeWhen last marked seen.✓✓
archived_at
nullable indexed
datetimeWhen archived.✓✓
reply_status
nullable
stringLatest reply workflow status for the authenticated member; null when absent.
PENDING WILL_REPLY SKIPPED SAVED_FOR_LATER REPLIED
✓✓
replied_at
nullable
datetimeWhen the authenticated member marked the signal replied.✓✓
source
indexed
stringSource platform.
REDDIT XCOM LINKEDIN
✓✓
subreddit
stringSource community.✓✓
title
stringPost title. Full-text filtering requires a search index; use search_signals.–✓
body
nullable
stringPost body excerpt, at most 2000 characters over MCP. Use get_signal for full detail and continuation.–✓
url
stringPost URL.✓✓
post_score
integerPlatform score.✓✓
num_comments
integerComment count.✓✓
posted_at
indexed
datetimeSource 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 25

Calling 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>"
  ]
}
JSON
Row 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
}