API reference
Every operation, generated from the same registry that serves the API. Base URL https://sniffington.com/api/v1. The machine-readable version is /openapi.json.
- Projects 6
- Keywords 9
- Categories 4
- Mentions 8
- Authors 1
- Analytics 4
- Views 4
- Scans 3
- Webhooks 10
- Workspace 9
- API keys 5
- Alerts 6
Projects
List projects
GET /api/v1/projects
Every project (a brand or topic you monitor) in the workspace.
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/projects" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Create a project
POST /api/v1/projects
Creates a project with 'My brand' and 'Competitors' keyword groups and the default categories. Pass keywords/competitors to start searching right away.
A full-access key (ss_sk_…), or an editor or owner signed in.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name required |
string 1–80 characters |
Display name, e.g. the brand. |
mode |
string | mentions: track what people say about you. leads: find people describing a problem you solve. One of: mentions leads |
description |
string up to 1000 characters |
What the brand is, in a sentence or two. The AI uses it to tell real mentions from namesakes. |
audience |
string up to 1000 characters |
Leads mode: who counts as a lead. |
color |
string | Hex colour. |
icon |
string | An emoji or short label. |
sources |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
window_days |
number 0.5–30 |
Lookback per scan, in days. |
backfill_days |
number 1–730 |
Lookback for the first scan. |
scan_every |
string | Scan cadence, e.g. 24h, 6h, 1h. Omit for the workspace default. |
timezone |
string | IANA timezone, e.g. America/New_York. |
paused |
boolean | |
settings |
object | handles {platform: [..]}, team [..], domains [..], ambiguous {anchors, namesakes}, hashtags [..]. |
public |
boolean | Publish a read-only public dashboard. |
public_slug |
string | URL slug for the public dashboard. |
public_description |
string up to 500 characters |
Shown on the public dashboard. |
public_website |
string | Link shown on the public dashboard. |
keywords |
array of string | Create project: keywords to start with (added to the 'My brand' group). |
competitors |
array of string | Create project: competitor names to start with (added to the 'Competitors' group). |
Example
curl -X POST "https://sniffington.com/api/v1/projects" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme"}'
Get a project
GET /api/v1/projects/{project}
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Example
curl "https://sniffington.com/api/v1/projects/{project}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Update a project
PATCH /api/v1/projects/{project}
Change settings, sources, cadence, pause/resume, or publish a public dashboard (public: true).
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name |
string 1–80 characters |
Display name, e.g. the brand. |
mode |
string | mentions: track what people say about you. leads: find people describing a problem you solve. One of: mentions leads |
description |
string up to 1000 characters |
What the brand is, in a sentence or two. The AI uses it to tell real mentions from namesakes. |
audience |
string up to 1000 characters |
Leads mode: who counts as a lead. |
color |
string | Hex colour. |
icon |
string | An emoji or short label. |
sources |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
window_days |
number 0.5–30 |
Lookback per scan, in days. |
backfill_days |
number 1–730 |
Lookback for the first scan. |
scan_every |
string | Scan cadence, e.g. 24h, 6h, 1h. Omit for the workspace default. |
timezone |
string | IANA timezone, e.g. America/New_York. |
paused |
boolean | |
settings |
object | handles {platform: [..]}, team [..], domains [..], ambiguous {anchors, namesakes}, hashtags [..]. |
public |
boolean | Publish a read-only public dashboard. |
public_slug |
string | URL slug for the public dashboard. |
public_description |
string up to 500 characters |
Shown on the public dashboard. |
public_website |
string | Link shown on the public dashboard. |
keywords |
array of string | Create project: keywords to start with (added to the 'My brand' group). |
competitors |
array of string | Create project: competitor names to start with (added to the 'Competitors' group). |
Example
curl -X PATCH "https://sniffington.com/api/v1/projects/{project}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme","mode":"mentions"}'
Delete a project
DELETE /api/v1/projects/{project}
Stops scanning and hides the project. Its mentions are kept privately unless purge=true.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
purgequery |
boolean | Also delete every mention and scan record. |
Example
curl -X DELETE "https://sniffington.com/api/v1/projects/{project}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Scan a project now
POST /api/v1/projects/{project}/scan
Queues an immediate scan. Results arrive as mentions (and mention.created webhooks).
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Example
curl -X POST "https://sniffington.com/api/v1/projects/{project}/scan" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Keywords
List keyword groups
GET /api/v1/projects/{project}/groups
Every project has 'My brand' and 'Competitors'; add custom ones for products, people or topics.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Example
curl "https://sniffington.com/api/v1/projects/{project}/groups" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Create a keyword group
POST /api/v1/projects/{project}/groups
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name required |
string 1–60 characters |
Group name. |
kind |
string | One of: brand competitor custom |
color |
string | Hex colour. |
Example
curl -X POST "https://sniffington.com/api/v1/projects/{project}/groups" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme"}'
Update a keyword group
PATCH /api/v1/groups/{group}
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
group requiredpath |
string | The group's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name |
string 1–60 characters |
Group name. |
kind |
string | One of: brand competitor custom |
color |
string | Hex colour. |
position |
integer |
Example
curl -X PATCH "https://sniffington.com/api/v1/groups/{group}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme","kind":"brand"}'
Delete a keyword group
DELETE /api/v1/groups/{group}
Its keywords stay, ungrouped.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
group requiredpath |
string | The group's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/groups/{group}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
List keywords
GET /api/v1/projects/{project}/keywords
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
activequery |
boolean | Only active (or only inactive) keywords. |
Example
curl "https://sniffington.com/api/v1/projects/{project}/keywords" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Add a keyword
POST /api/v1/projects/{project}/keywords
Aliases catch other spellings, handles and domains; excluded terms skip posts that also contain them.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
term required |
string 2–200 characters |
The keyword, 2–200 characters. |
aliases |
array of string up to 10 items |
Other spellings, handles or domains that count as the same thing (max 10). |
excluded |
array of string up to 10 items |
Skip any post that also contains one of these (max 10). |
case_sensitive |
boolean | |
sources |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
group_id |
integer or null | Keyword group; omit for 'My brand'. |
active |
boolean | Inactive keywords keep their history but aren't searched. |
Example
curl -X POST "https://sniffington.com/api/v1/projects/{project}/keywords" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"term":"acme"}'
Get a keyword
GET /api/v1/keywords/{keyword}
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
keyword requiredpath |
string | The keyword's id. |
Example
curl "https://sniffington.com/api/v1/keywords/{keyword}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Update a keyword
PATCH /api/v1/keywords/{keyword}
Set active:false to stop searching it while keeping its mentions.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
keyword requiredpath |
string | The keyword's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
term |
string 2–200 characters |
The keyword, 2–200 characters. |
aliases |
array of string up to 10 items |
Other spellings, handles or domains that count as the same thing (max 10). |
excluded |
array of string up to 10 items |
Skip any post that also contains one of these (max 10). |
case_sensitive |
boolean | |
sources |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
group_id |
integer or null | Keyword group; omit for 'My brand'. |
active |
boolean | Inactive keywords keep their history but aren't searched. |
Example
curl -X PATCH "https://sniffington.com/api/v1/keywords/{keyword}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"term":"acme","aliases":["acme.com"]}'
Delete a keyword
DELETE /api/v1/keywords/{keyword}
Mentions it found are kept.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
keyword requiredpath |
string | The keyword's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/keywords/{keyword}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Categories
List categories
GET /api/v1/projects/{project}/categories
The AI files every relevant mention into one of these.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Example
curl "https://sniffington.com/api/v1/projects/{project}/categories" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Create a category
POST /api/v1/projects/{project}/categories
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
project requiredpath |
string | The project's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name required |
string 1–60 characters |
Category name. |
description |
string up to 300 characters |
What belongs here, in plain words – the AI files mentions by it. |
icon |
string | An emoji. |
color |
string | Hex colour. |
position |
integer |
Example
curl -X POST "https://sniffington.com/api/v1/projects/{project}/categories" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme"}'
Update a category
PATCH /api/v1/categories/{category}
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
category requiredpath |
string | The category's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name |
string 1–60 characters |
Category name. |
description |
string up to 300 characters |
What belongs here, in plain words – the AI files mentions by it. |
icon |
string | An emoji. |
color |
string | Hex colour. |
position |
integer |
Example
curl -X PATCH "https://sniffington.com/api/v1/categories/{category}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme","description":"Invoicing software for plumbers."}'
Delete a category
DELETE /api/v1/categories/{category}
Mentions in it become uncategorised.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
category requiredpath |
string | The category's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/categories/{category}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Mentions
List mentions
GET /api/v1/mentions
Filter, search and page through mentions. Cursor-paginated: pass next_cursor back as cursor.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
statusquery |
array of string | Workflow status. One of: open done follow_up |
relevancequery |
array of string | Urgency band (high ≥70, medium ≥40). One of: high medium low |
categoriesquery |
array of integer | Category ids. |
keywordsquery |
array of integer | Keyword ids. |
groupsquery |
array of integer | Keyword group ids. |
authorsquery |
array of string | Exact author handles, e.g. @someone or u/someone. |
urgency_minquery |
integer 0–100 |
|
urgency_maxquery |
integer 0–100 |
|
min_engagementquery |
integer at least 0 |
|
engagementquery |
string | Per-source minimum engagement, e.g. x:10,reddit:5. |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
found_sincequery |
string | Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is. |
qquery |
string | Full-text search over text, author, place and the AI's summary. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
rangequery |
string | A relative date window; since/until win when both are given. One of: today 7d 30d 90d 12m all |
viewquery |
integer | Apply a saved view's filters. |
orderquery |
string | found = most recently collected first. One of: newest oldest urgency engagement found |
limitquery |
integer 1–100 |
Page size (default 25, max 100). |
cursorquery |
string | Opaque cursor from a previous page's next_cursor. |
Returns
{ data: Mention[], next_cursor, total }
Example
curl "https://sniffington.com/api/v1/mentions" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Today's brief
GET /api/v1/brief
What needs a person today: open mentions ranked by urgency, each with the AI's one-line reason, how many are open per project and how many arrived in the last 24 hours. Start here when asked what people are saying about a brand.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Only this project. |
limitquery |
integer 1–50 |
How many mentions to return (default 10). |
Returns
{ data: { open, new_24h, projects: [{ id, name, open }], mentions: Mention[] } }
Example
curl "https://sniffington.com/api/v1/brief" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Change the status of many mentions
POST /api/v1/mentions/bulk
Sets the status of every mention matching the filters (the list_mentions query parameters), or of the given ids. Useful for clearing an old backlog, e.g. status=done with status filter open and until=90 days ago.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
statusquery |
array of string | Workflow status. One of: open done follow_up |
relevancequery |
array of string | Urgency band (high ≥70, medium ≥40). One of: high medium low |
categoriesquery |
array of integer | Category ids. |
keywordsquery |
array of integer | Keyword ids. |
groupsquery |
array of integer | Keyword group ids. |
authorsquery |
array of string | Exact author handles, e.g. @someone or u/someone. |
urgency_minquery |
integer 0–100 |
|
urgency_maxquery |
integer 0–100 |
|
min_engagementquery |
integer at least 0 |
|
engagementquery |
string | Per-source minimum engagement, e.g. x:10,reddit:5. |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
found_sincequery |
string | Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is. |
qquery |
string | Full-text search over text, author, place and the AI's summary. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
rangequery |
string | A relative date window; since/until win when both are given. One of: today 7d 30d 90d 12m all |
viewquery |
integer | Apply a saved view's filters. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
status required |
string | The new status. One of: open done follow_up |
ids |
array of string up to 5000 items |
Only these mention ids (max 5000). |
Example
curl -X POST "https://sniffington.com/api/v1/mentions/bulk" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"done"}'
Get a mention
GET /api/v1/mentions/{mention}
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
mention requiredpath |
string | The mention's id. |
Example
curl "https://sniffington.com/api/v1/mentions/{mention}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Update a mention
PATCH /api/v1/mentions/{mention}
Set status (open, done, follow_up), or correct the AI's category, sentiment, urgency or relevance.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
mention requiredpath |
string | The mention's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
status |
string | One of: open done follow_up |
category_id |
integer or null | |
sentiment |
string | One of: positive negative neutral |
urgency |
integer 0–100 |
|
relevant |
boolean | true restores a mention the AI filtered out. |
draft |
string | Save a reply draft. |
Example
curl -X PATCH "https://sniffington.com/api/v1/mentions/{mention}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"done","category_id":1}'
Mark a mention irrelevant
POST /api/v1/mentions/{mention}/irrelevant
Moves it out of the feed for good (it will never be re-collected). The reason teaches the AI what to skip next time.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
mention requiredpath |
string | The mention's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
reason |
string up to 500 characters |
Why it isn't relevant, e.g. 'about the diarist, not the app'. |
Example
curl -X POST "https://sniffington.com/api/v1/mentions/{mention}/irrelevant" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"About a different Acme"}'
Delete a mention
DELETE /api/v1/mentions/{mention}
Removes it from every view. It stays remembered so it's never collected again.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
mention requiredpath |
string | The mention's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/mentions/{mention}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Draft a reply
POST /api/v1/mentions/{mention}/draft
Writes a short, help-first reply in the post's own register. Nothing is posted; you copy it.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
mention requiredpath |
string | The mention's id. |
Example
curl -X POST "https://sniffington.com/api/v1/mentions/{mention}/draft" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Authors
List authors
GET /api/v1/authors
mode=all for autocomplete (with q), supporters for the most positive, critics for the most negative.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
statusquery |
array of string | Workflow status. One of: open done follow_up |
relevancequery |
array of string | Urgency band (high ≥70, medium ≥40). One of: high medium low |
categoriesquery |
array of integer | Category ids. |
keywordsquery |
array of integer | Keyword ids. |
groupsquery |
array of integer | Keyword group ids. |
authorsquery |
array of string | Exact author handles, e.g. @someone or u/someone. |
urgency_minquery |
integer 0–100 |
|
urgency_maxquery |
integer 0–100 |
|
min_engagementquery |
integer at least 0 |
|
engagementquery |
string | Per-source minimum engagement, e.g. x:10,reddit:5. |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
found_sincequery |
string | Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is. |
qquery |
string | Full-text search over text, author, place and the AI's summary. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
rangequery |
string | A relative date window; since/until win when both are given. One of: today 7d 30d 90d 12m all |
viewquery |
integer | Apply a saved view's filters. |
modequery |
string | One of: all supporters critics |
limitquery |
integer 1–100 |
Page size (default 25, max 100). |
Example
curl "https://sniffington.com/api/v1/authors" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Analytics
Mention analytics
GET /api/v1/analytics
Totals, mentions over time with the sentiment split, and the mix by source, category, keyword and group, plus the weekday × hour heatmap and top supporters and critics – one call.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
groupsquery |
array of integer | Keyword group ids. |
keywordsquery |
array of integer | Keyword ids. |
categoriesquery |
array of integer | Category ids. |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
Example
curl "https://sniffington.com/api/v1/analytics" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Break mentions down by one dimension
GET /api/v1/analytics/breakdown
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
groupsquery |
array of integer | Keyword group ids. |
keywordsquery |
array of integer | Keyword ids. |
categoriesquery |
array of integer | Category ids. |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
byquery |
string | One of: source sentiment status category keyword group place author project |
Example
curl "https://sniffington.com/api/v1/analytics/breakdown" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Mentions per day by source, project, sentiment, category or group
GET /api/v1/analytics/volume
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
sourcesquery |
array of string | Sources to search. Omit for every source available. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
groupsquery |
array of integer | Keyword group ids. |
keywordsquery |
array of integer | Keyword ids. |
categoriesquery |
array of integer | Category ids. |
sentimentquery |
array of string | Sentiment. One of: positive negative neutral |
sincequery |
string | ISO date/time or epoch ms. |
untilquery |
string | ISO date/time or epoch ms. |
includequery |
string | relevant (default): real mentions. irrelevant: filtered out as namesakes or noise. One of: relevant irrelevant all |
byquery |
string | One of: source watcher sentiment category group |
Example
curl "https://sniffington.com/api/v1/analytics/volume" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Run a read-only SQL query
POST /api/v1/analytics/sql
SELECT/WITH over the workspace's tables (mentions, projects, keywords, categories, keyword_groups, runs). Capped at 1,000 rows.
Any API key or OAuth token, or a signed-in member.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
sql required |
string | A single SELECT or WITH statement. |
limit |
integer 1–1000 |
Example
curl -X POST "https://sniffington.com/api/v1/analytics/sql" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sql":"SELECT source, COUNT(*) AS n FROM mentions GROUP BY source"}'
Views
List saved views
GET /api/v1/views
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
Example
curl "https://sniffington.com/api/v1/views" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Save a view
POST /api/v1/views
A full-access key (ss_sk_…), or an editor or owner signed in.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name required |
string 1–60 characters |
View name. |
project_id |
string or null | |
filters |
object | Any list_mentions query parameters. |
Example
curl -X POST "https://sniffington.com/api/v1/views" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme"}'
Update a saved view
PATCH /api/v1/views/{view}
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
view requiredpath |
string | The view's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name |
string 1–60 characters |
View name. |
project_id |
string or null | |
filters |
object | Any list_mentions query parameters. |
Example
curl -X PATCH "https://sniffington.com/api/v1/views/{view}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Acme","project_id":"…"}'
Delete a saved view
DELETE /api/v1/views/{view}
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
view requiredpath |
string | The view's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/views/{view}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Scans
Recent scans
GET /api/v1/runs
Per project: what each source returned, how much was new, and any source errors.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
limitquery |
integer 1–100 |
Page size (default 25, max 100). |
Example
curl "https://sniffington.com/api/v1/runs" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Scan status
GET /api/v1/scans/status
What's scanning now, what's queued, and when each project is next due.
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/scans/status" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Scan every project now
POST /api/v1/scans
A full-access key (ss_sk_…), or an editor or owner signed in.
Example
curl -X POST "https://sniffington.com/api/v1/scans" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Webhooks
List webhooks
GET /api/v1/webhooks
Every webhook endpoint in the workspace. Secrets are never returned here; secret_hint is the last 4 characters.
Any API key or OAuth token, or a signed-in member.
Returns
Webhook[]
Example
curl "https://sniffington.com/api/v1/webhooks" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Create a webhook
POST /api/v1/webhooks
Events are POSTed as JSON and signed per Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature headers). The signing secret is in this response only, so store it now.
A full-access key (ss_sk_…), or an editor or owner signed in.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
url required |
string 8–2048 characters |
Where to POST events. Must be a public https:// URL. |
events |
array of string up to 50 items |
Event types to send, or ["*"] for all (the default). GET /v1/webhook-events lists them. |
project_id |
string or null | Only events from this project; null for the whole workspace. |
description |
string or null up to 500 characters |
A note for yourself, e.g. what receives it. |
Returns
Webhook & { secret }
Example
curl -X POST "https://sniffington.com/api/v1/webhooks" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/social-scout"}'
Get a webhook
GET /api/v1/webhooks/{webhook}
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
Returns
Webhook
Example
curl "https://sniffington.com/api/v1/webhooks/{webhook}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Update a webhook
PATCH /api/v1/webhooks/{webhook}
Turning a webhook back on (enabled: true) clears its failure count and the reason it was turned off.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
url |
string 8–2048 characters |
Where to POST events. Must be a public https:// URL. |
events |
array of string up to 50 items |
Event types to send, or ["*"] for all (the default). GET /v1/webhook-events lists them. |
project_id |
string or null | Only events from this project; null for the whole workspace. |
description |
string or null up to 500 characters |
A note for yourself, e.g. what receives it. |
enabled |
boolean | false stops deliveries; true resumes them. |
Returns
Webhook
Example
curl -X PATCH "https://sniffington.com/api/v1/webhooks/{webhook}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/social-scout","events":["…"]}'
Delete a webhook
DELETE /api/v1/webhooks/{webhook}
Stops deliveries and deletes its delivery log.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/webhooks/{webhook}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Rotate a webhook's signing secret
POST /api/v1/webhooks/{webhook}/rotate-secret
The old secret stops working immediately. The new one is in this response only.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
Returns
{ id, secret }
Example
curl -X POST "https://sniffington.com/api/v1/webhooks/{webhook}/rotate-secret" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Send a test event
POST /api/v1/webhooks/{webhook}/test
Queues a signed "test.ping" event to this endpoint right away, even if the webhook is turned off. Check list_webhook_deliveries for the result.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
Returns
{ delivery_id }
Example
curl -X POST "https://sniffington.com/api/v1/webhooks/{webhook}/test" \
-H "Authorization: Bearer $SCOUT_API_KEY"
List a webhook's deliveries
GET /api/v1/webhooks/{webhook}/deliveries
Newest first. Deliveries are kept for 30 days.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
webhook requiredpath |
string | The webhook's id. |
limitquery |
integer 1–100 |
Page size (default 25, max 100). |
offsetquery |
integer at least 0 |
Rows to skip. |
statusquery |
string | Only deliveries in this state. One of: pending delivered failed |
Returns
{ data: Delivery[], total }
Example
curl "https://sniffington.com/api/v1/webhooks/{webhook}/deliveries" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Replay a delivery
POST /api/v1/webhook-deliveries/{delivery}/replay
Queues the same event again (same payload and webhook-id, so receivers can dedupe) as a new delivery.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
delivery requiredpath |
string | The delivery's id. |
Returns
{ delivery_id }
Example
curl -X POST "https://sniffington.com/api/v1/webhook-deliveries/{delivery}/replay" \
-H "Authorization: Bearer $SCOUT_API_KEY"
List webhook event types
GET /api/v1/webhook-events
Every event type a webhook can subscribe to. test_webhook also sends a "test.ping" to any endpoint.
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/webhook-events" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Workspace
The current workspace
GET /api/v1/workspace
Name, plan and timezone of the workspace this credential belongs to.
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/workspace" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Rename the workspace or change its timezone / default scan cadence
PATCH /api/v1/workspace
A workspace owner signed in to the app. API keys can't call it.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name |
string 1–80 characters |
Name. |
timezone |
string | IANA timezone. |
scan_every |
string | Default scan cadence for projects that don't set one, e.g. 24h. |
List members
GET /api/v1/members
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/members" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Change a member's role
PATCH /api/v1/members/{user}
A workspace owner signed in to the app. API keys can't call it.
Parameters
| Name | Type | Description |
|---|---|---|
user requiredpath |
string | The user's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
role required |
string | One of: owner editor viewer |
Remove a member
DELETE /api/v1/members/{user}
A workspace owner signed in to the app. API keys can't call it.
Parameters
| Name | Type | Description |
|---|---|---|
user requiredpath |
string | The user's id. |
List invites
GET /api/v1/invites
A workspace owner signed in to the app. API keys can't call it.
Invite someone
POST /api/v1/invites
Returns an invite link, valid for 7 days. It's emailed too.
A workspace owner signed in to the app. API keys can't call it.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
email required |
string | Their email. |
role required |
string | One of: owner editor viewer |
Revoke an invite
DELETE /api/v1/invites/{invite}
A workspace owner signed in to the app. API keys can't call it.
Parameters
| Name | Type | Description |
|---|---|---|
invite requiredpath |
string | The invite's id. |
Usage this month
GET /api/v1/usage
Mentions collected and judged, metered source calls and LLM tokens, against the plan's limits.
Any API key or OAuth token, or a signed-in member.
Example
curl "https://sniffington.com/api/v1/usage" \
-H "Authorization: Bearer $SCOUT_API_KEY"
API keys
List API keys
GET /api/v1/api-keys
A workspace owner signed in to the app. API keys can't call it.
Create an API key
POST /api/v1/api-keys
The key is shown once. Read-only keys can't change anything.
A workspace owner signed in to the app. API keys can't call it.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
name required |
string 1–60 characters |
What it's for. |
scope |
string | One of: full read |
expires_in_days |
integer 1–3650 |
Revoke an API key
DELETE /api/v1/api-keys/{key}
A workspace owner signed in to the app. API keys can't call it.
Parameters
| Name | Type | Description |
|---|---|---|
key requiredpath |
string | The key's id. |
List connected apps
GET /api/v1/oauth/connections
Apps (Claude, ChatGPT, Codex and other MCP clients) that members connected over OAuth, with their access and when their sign-in lapses.
A workspace owner signed in to the app. API keys can't call it.
Disconnect an app
DELETE /api/v1/oauth/connections/{client}
Revokes every token the app holds for this workspace. It has to be approved again to reconnect.
A workspace owner signed in to the app. API keys can't call it.
Parameters
| Name | Type | Description |
|---|---|---|
client requiredpath |
string | The client's id. |
Alerts
List alerts
GET /api/v1/alerts
Digests and rule alerts. With project, that project's alerts plus the ones that cover every project.
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
projectquery |
string | Project id. |
Returns
Alert[]
Example
curl "https://sniffington.com/api/v1/alerts" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Create an alert
POST /api/v1/alerts
Email, Slack or Discord. Each workspace can send 30 alert emails and 200 Slack or Discord messages a day (self-hosted installs set the email cap with SCOUT_ALERT_EMAILS_PER_DAY).
A full-access key (ss_sk_…), or an editor or owner signed in.
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
kind required |
string | digest: one message a day at `hour`. rule: a message the moment a matching mention arrives. One of: digest rule |
name required |
string 1–80 characters |
Shown in the app and in each message. |
enabled |
boolean | |
project_id |
string or null | The project to watch; null for every project. |
channel required |
string | One of: email slack discord |
target required |
string up to 500 characters |
email: an address. slack: a channel ID or #name. discord: a webhook URL (https://discord.com/api/webhooks/…). |
hour |
integer or null 0–23 |
Digest: the local hour to send, 0–23. |
timezone |
string or null | IANA timezone for `hour`, e.g. America/New_York. Defaults to the workspace's. |
filters |
object | Only mentions matching every filter set here. Leave a filter out to match everything. |
filters.sources |
array of string | Only these sources. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
filters.sentiment |
array of string | Only these sentiments. One of: positive negative neutral |
filters.categories |
array of integer | Only these category ids. |
filters.groups |
array of integer | Only these keyword group ids. |
filters.keywords |
array of integer | Only these keyword ids. |
filters.authors |
array of string up to 50 items |
Only these authors: exact handles, any case, e.g. @someone or u/someone. |
filters.min_engagement |
integer at least 0 |
Only posts with at least this much engagement. |
min_urgency |
integer or null 0–100 |
Only mentions at or above this urgency (0–100). |
Returns
Alert
Example
curl -X POST "https://sniffington.com/api/v1/alerts" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"digest","name":"Acme","channel":"email","target":"…"}'
Get an alert
GET /api/v1/alerts/{alert}
Any API key or OAuth token, or a signed-in member.
Parameters
| Name | Type | Description |
|---|---|---|
alert requiredpath |
string | The alert's id. |
Returns
Alert
Example
curl "https://sniffington.com/api/v1/alerts/{alert}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Update an alert
PATCH /api/v1/alerts/{alert}
Send only what changes. filters replaces the whole filter set.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
alert requiredpath |
string | The alert's id. |
Request body
JSON, sent with Content-Type: application/json.
| Name | Type | Description |
|---|---|---|
kind |
string | digest: one message a day at `hour`. rule: a message the moment a matching mention arrives. One of: digest rule |
name |
string 1–80 characters |
Shown in the app and in each message. |
enabled |
boolean | |
project_id |
string or null | The project to watch; null for every project. |
channel |
string | One of: email slack discord |
target |
string up to 500 characters |
email: an address. slack: a channel ID or #name. discord: a webhook URL (https://discord.com/api/webhooks/…). |
hour |
integer or null 0–23 |
Digest: the local hour to send, 0–23. |
timezone |
string or null | IANA timezone for `hour`, e.g. America/New_York. Defaults to the workspace's. |
filters |
object | Only mentions matching every filter set here. Leave a filter out to match everything. |
filters.sources |
array of string | Only these sources. One of: reddit linkedin x hn instagram github stackoverflow devto bluesky news youtube tiktok threads |
filters.sentiment |
array of string | Only these sentiments. One of: positive negative neutral |
filters.categories |
array of integer | Only these category ids. |
filters.groups |
array of integer | Only these keyword group ids. |
filters.keywords |
array of integer | Only these keyword ids. |
filters.authors |
array of string up to 50 items |
Only these authors: exact handles, any case, e.g. @someone or u/someone. |
filters.min_engagement |
integer at least 0 |
Only posts with at least this much engagement. |
min_urgency |
integer or null 0–100 |
Only mentions at or above this urgency (0–100). |
Returns
Alert
Example
curl -X PATCH "https://sniffington.com/api/v1/alerts/{alert}" \
-H "Authorization: Bearer $SCOUT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"digest","name":"Acme"}'
Delete an alert
DELETE /api/v1/alerts/{alert}
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
alert requiredpath |
string | The alert's id. |
Example
curl -X DELETE "https://sniffington.com/api/v1/alerts/{alert}" \
-H "Authorization: Bearer $SCOUT_API_KEY"
Send a test now
POST /api/v1/alerts/{alert}/test
Sends a real message: a digest of the last 24 hours, or for a rule the latest matching mention. With nothing to show, it sends a clearly marked sample. Counts toward the daily cap.
A full-access key (ss_sk_…), or an editor or owner signed in.
Parameters
| Name | Type | Description |
|---|---|---|
alert requiredpath |
string | The alert's id. |
Returns
{ sent, channel, detail }
Example
curl -X POST "https://sniffington.com/api/v1/alerts/{alert}/test" \
-H "Authorization: Bearer $SCOUT_API_KEY"