Contents

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

List projects

GET /api/v1/projects

list_projects Read MCP tool

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

create_project Write MCP tool

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.

NameTypeDescription
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}

get_project Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project required
path
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}

update_project Write MCP tool

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

NameTypeDescription
project required
path
string The project's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_project Write MCP tool

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

NameTypeDescription
project required
path
string The project's id.
purge
query
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

scan_project Write MCP tool

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

NameTypeDescription
project required
path
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

list_keyword_groups Read MCP tool

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

NameTypeDescription
project required
path
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

create_keyword_group Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
project required
path
string The project's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

update_keyword_group Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
group required
path
string The group's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_keyword_group Write MCP tool

Its keywords stay, ungrouped.

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
group required
path
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

list_keywords Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project required
path
string The project's id.
active
query
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

create_keyword Write MCP tool

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

NameTypeDescription
project required
path
string The project's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

get_keyword Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
keyword required
path
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}

update_keyword Write MCP tool

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

NameTypeDescription
keyword required
path
string The keyword's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_keyword Write MCP tool

Mentions it found are kept.

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
keyword required
path
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

list_categories Read MCP tool

The AI files every relevant mention into one of these.

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project required
path
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

create_category Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
project required
path
string The project's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

update_category Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
category required
path
string The category's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_category Write MCP tool

Mentions in it become uncategorised.

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
category required
path
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

list_mentions Read MCP tool

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

NameTypeDescription
project
query
string Project id.
sources
query
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
sentiment
query
array of string Sentiment.
One of: positive negative neutral
status
query
array of string Workflow status.
One of: open done follow_up
relevance
query
array of string Urgency band (high ≥70, medium ≥40).
One of: high medium low
categories
query
array of integer Category ids.
keywords
query
array of integer Keyword ids.
groups
query
array of integer Keyword group ids.
authors
query
array of string Exact author handles, e.g. @someone or u/someone.
urgency_min
query
integer
0–100
urgency_max
query
integer
0–100
min_engagement
query
integer
at least 0
engagement
query
string Per-source minimum engagement, e.g. x:10,reddit:5.
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
found_since
query
string Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is.
q
query
string Full-text search over text, author, place and the AI's summary.
include
query
string relevant (default): real mentions. irrelevant: filtered out as namesakes or noise.
One of: relevant irrelevant all
range
query
string A relative date window; since/until win when both are given.
One of: today 7d 30d 90d 12m all
view
query
integer Apply a saved view's filters.
order
query
string found = most recently collected first.
One of: newest oldest urgency engagement found
limit
query
integer
1–100
Page size (default 25, max 100).
cursor
query
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

get_brief Read MCP tool

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

NameTypeDescription
project
query
string Only this project.
limit
query
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

bulk_update_mentions Write MCP tool

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

NameTypeDescription
project
query
string Project id.
sources
query
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
sentiment
query
array of string Sentiment.
One of: positive negative neutral
status
query
array of string Workflow status.
One of: open done follow_up
relevance
query
array of string Urgency band (high ≥70, medium ≥40).
One of: high medium low
categories
query
array of integer Category ids.
keywords
query
array of integer Keyword ids.
groups
query
array of integer Keyword group ids.
authors
query
array of string Exact author handles, e.g. @someone or u/someone.
urgency_min
query
integer
0–100
urgency_max
query
integer
0–100
min_engagement
query
integer
at least 0
engagement
query
string Per-source minimum engagement, e.g. x:10,reddit:5.
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
found_since
query
string Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is.
q
query
string Full-text search over text, author, place and the AI's summary.
include
query
string relevant (default): real mentions. irrelevant: filtered out as namesakes or noise.
One of: relevant irrelevant all
range
query
string A relative date window; since/until win when both are given.
One of: today 7d 30d 90d 12m all
view
query
integer Apply a saved view's filters.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

get_mention Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
mention required
path
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}

update_mention Write MCP tool

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

NameTypeDescription
mention required
path
string The mention's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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

mark_mention_irrelevant Write MCP tool

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

NameTypeDescription
mention required
path
string The mention's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_mention Write MCP tool

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

NameTypeDescription
mention required
path
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

draft_reply Write

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

NameTypeDescription
mention required
path
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

list_authors Read MCP tool

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

NameTypeDescription
project
query
string Project id.
sources
query
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
sentiment
query
array of string Sentiment.
One of: positive negative neutral
status
query
array of string Workflow status.
One of: open done follow_up
relevance
query
array of string Urgency band (high ≥70, medium ≥40).
One of: high medium low
categories
query
array of integer Category ids.
keywords
query
array of integer Keyword ids.
groups
query
array of integer Keyword group ids.
authors
query
array of string Exact author handles, e.g. @someone or u/someone.
urgency_min
query
integer
0–100
urgency_max
query
integer
0–100
min_engagement
query
integer
at least 0
engagement
query
string Per-source minimum engagement, e.g. x:10,reddit:5.
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
found_since
query
string Only mentions first collected at or after this ISO date/time or epoch ms, however old the post itself is.
q
query
string Full-text search over text, author, place and the AI's summary.
include
query
string relevant (default): real mentions. irrelevant: filtered out as namesakes or noise.
One of: relevant irrelevant all
range
query
string A relative date window; since/until win when both are given.
One of: today 7d 30d 90d 12m all
view
query
integer Apply a saved view's filters.
mode
query
string
One of: all supporters critics
limit
query
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

get_analytics Read MCP tool

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

NameTypeDescription
project
query
string Project id.
sources
query
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
groups
query
array of integer Keyword group ids.
keywords
query
array of integer Keyword ids.
categories
query
array of integer Category ids.
sentiment
query
array of string Sentiment.
One of: positive negative neutral
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
include
query
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

get_breakdown Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project
query
string Project id.
sources
query
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
groups
query
array of integer Keyword group ids.
keywords
query
array of integer Keyword ids.
categories
query
array of integer Category ids.
sentiment
query
array of string Sentiment.
One of: positive negative neutral
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
include
query
string relevant (default): real mentions. irrelevant: filtered out as namesakes or noise.
One of: relevant irrelevant all
by
query
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

get_volume Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project
query
string Project id.
sources
query
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
groups
query
array of integer Keyword group ids.
keywords
query
array of integer Keyword ids.
categories
query
array of integer Category ids.
sentiment
query
array of string Sentiment.
One of: positive negative neutral
since
query
string ISO date/time or epoch ms.
until
query
string ISO date/time or epoch ms.
include
query
string relevant (default): real mentions. irrelevant: filtered out as namesakes or noise.
One of: relevant irrelevant all
by
query
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

query_sql Read MCP tool

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.

NameTypeDescription
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

list_views Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
project
query
string Project id.

Example

curl "https://sniffington.com/api/v1/views" \
  -H "Authorization: Bearer $SCOUT_API_KEY"

Save a view

POST /api/v1/views

create_view Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

update_view Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
view required
path
string The view's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_view Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
view required
path
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

list_runs Read MCP tool

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

NameTypeDescription
project
query
string Project id.
limit
query
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

get_scan_status Read MCP tool

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

scan_now Write MCP tool

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

list_webhooks Read MCP tool

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

create_webhook Write MCP tool

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.

NameTypeDescription
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}

get_webhook Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
webhook required
path
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}

update_webhook Write MCP tool

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

NameTypeDescription
webhook required
path
string The webhook's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_webhook Write MCP tool

Stops deliveries and deletes its delivery log.

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
webhook required
path
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

rotate_webhook_secret Write MCP tool

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

NameTypeDescription
webhook required
path
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

test_webhook Write MCP tool

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

NameTypeDescription
webhook required
path
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

list_webhook_deliveries Read MCP tool

Newest first. Deliveries are kept for 30 days.

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
webhook required
path
string The webhook's id.
limit
query
integer
1–100
Page size (default 25, max 100).
offset
query
integer
at least 0
Rows to skip.
status
query
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

replay_webhook_delivery Write MCP tool

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

NameTypeDescription
delivery required
path
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

list_webhook_events Read MCP tool

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

get_workspace Read MCP tool

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

update_workspace Owner

A workspace owner signed in to the app. API keys can't call it.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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

list_members Read MCP tool

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}

update_member Owner

A workspace owner signed in to the app. API keys can't call it.

Parameters

NameTypeDescription
user required
path
string The user's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
role required string
One of: owner editor viewer

Remove a member

DELETE /api/v1/members/{user}

remove_member Owner

A workspace owner signed in to the app. API keys can't call it.

Parameters

NameTypeDescription
user required
path
string The user's id.

List invites

GET /api/v1/invites

list_invites Owner

A workspace owner signed in to the app. API keys can't call it.

Invite someone

POST /api/v1/invites

create_invite Owner

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.

NameTypeDescription
email required string Their email.
role required string
One of: owner editor viewer

Revoke an invite

DELETE /api/v1/invites/{invite}

revoke_invite Owner

A workspace owner signed in to the app. API keys can't call it.

Parameters

NameTypeDescription
invite required
path
string The invite's id.

Usage this month

GET /api/v1/usage

get_usage Read MCP tool

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

list_api_keys Owner

A workspace owner signed in to the app. API keys can't call it.

Create an API key

POST /api/v1/api-keys

create_api_key Owner

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.

NameTypeDescription
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}

revoke_api_key Owner

A workspace owner signed in to the app. API keys can't call it.

Parameters

NameTypeDescription
key required
path
string The key's id.

List connected apps

GET /api/v1/oauth/connections

list_oauth_connections Owner

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}

revoke_oauth_connection Owner

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

NameTypeDescription
client required
path
string The client's id.

Alerts

List alerts

GET /api/v1/alerts

list_alerts Read MCP tool

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

NameTypeDescription
project
query
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

create_alert Write MCP tool

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.

NameTypeDescription
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}

get_alert Read MCP tool

Any API key or OAuth token, or a signed-in member.

Parameters

NameTypeDescription
alert required
path
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}

update_alert Write MCP tool

Send only what changes. filters replaces the whole filter set.

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
alert required
path
string The alert's id.

Request body

JSON, sent with Content-Type: application/json.

NameTypeDescription
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}

delete_alert Write MCP tool

A full-access key (ss_sk_…), or an editor or owner signed in.

Parameters

NameTypeDescription
alert required
path
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

test_alert Write MCP tool

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

NameTypeDescription
alert required
path
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"