The @Filter Signals API provides programmatic access to real-time content filtering intelligence. All endpoints require authentication via API key.
Include your API key in the Authorization header:
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://atfilter.com/api/v1/signals/top-keywords?window=24h
API keys are issued when you subscribe. View plans or manage keys in your account.
Requests are rate-limited per subscription. Exceeding the limit returns 429 Too Many Requests with a Retry-After header.
7 RESTful JSON endpoints. OpenAPI 3.1 spec at /api/v1/openapi
| Endpoint | Method | Path | Min. Tier |
|---|---|---|---|
| Top Keywords | GET | /api/v1/signals/top-keywords | Observer+ |
| Keyword Timeseries | GET | /api/v1/signals/keyword-timeseries | Observer+ |
| Domain Timeseries | GET | /api/v1/signals/domain-timeseries | Observer+ |
| Geo Heat Map | GET | /api/v1/signals/geo-heat | Observer+ |
| Trending Detection | GET | /api/v1/signals/trending | Observer+ |
| Keyword Activity | GET | /api/v1/signals/keyword-activity | Observer+ |
| Flexible Query | POST | /api/v1/signals/query | Analyst+ |
/api/v1/signals/top-keywordsObserver+Returns the most suppressed keywords globally, ranked by total suppression count.
windowTime window. Options: 1h, 6h, 12h, 24h, 7d, 30d (default: 24h)limitMax results (1-500) (default: 50){
"window": "24h",
"keywords": [
{
"keyword_raw": "trump",
"suppressions": 14302,
"users_est": 892,
"rank": 1
}
],
"disclaimer": "Data reflects anonymous, aggregated user filtering behavior..."
}/api/v1/signals/keyword-timeseriesObserver+Returns suppression counts for a specific keyword over time, bucketed by hour, day, or week.
keywordrequiredThe keyword to querywindowTime window. Options: 24h, 7d, 30d, 90d (default: 7d)bucketAggregation bucket. Options: hour, day, week (default: hour){
"keyword": "trump",
"window": "7d",
"bucket": "hour",
"timeseries": [
{
"ts": "2026-02-15T00:00:00Z",
"suppressions": 421,
"users_est": 89,
"events": 312
}
],
"disclaimer": "Data reflects anonymous, aggregated user filtering behavior..."
}/api/v1/signals/geo-heatObserver+Returns geographic distribution of all suppression activity, aggregated by country, region, county, or city.
windowTime window. Options: 1h, 6h, 12h, 24h, 7d, 30d (default: 24h)levelGeographic resolution. Options: country, region, county, city (default: country){
"window": "24h",
"level": "country",
"regions": [
{
"geo_key": "US",
"label": "US",
"suppressions": 52100,
"unique_users": 3200,
"keyword_count": 47
}
],
"disclaimer": "Data reflects anonymous, aggregated user filtering behavior..."
}/api/v1/signals/domain-timeseriesObserver+Returns suppression activity for a specific domain over time.
domainrequiredThe domain to query (e.g. cnn.com)windowTime window. Options: 24h, 7d, 30d, 90d (default: 7d)bucketAggregation bucket. Options: hour, day, week (default: hour){
"domain": "cnn.com",
"window": "7d",
"bucket": "day",
"timeseries": [
{
"ts": "2026-02-15T00:00:00Z",
"suppressions": 1832,
"users_est": 412,
"events": 1290
}
],
"disclaimer": "Data reflects anonymous, aggregated user filtering behavior..."
}/api/v1/signals/queryAnalyst+Flexible query endpoint. Filter and group by any combination of dimensions (keyword, domain, geography, time) in a single request.
windowrequiredTime window. Options: 1h, 6h, 12h, 24h, 7d, 30d, 90dfiltersObject with dimension arrays: keywords, domains, platforms, page_contexts, countries, regions, counties, cities (max 50 values each)group_byArray of dimensions to group by (max 5). Options: keyword, domain, platform, page_context, country, region, county, city, time (default: [] (totals only))bucketAggregation bucket. Options: hour, day, week. Required when group_by includes "time"order_byMeasure to sort by. Options: suppressions, unique_users, events (default: suppressions)orderSort direction. Options: asc, desc (default: desc)limitMax results (1-1000) (default: 100)formatResponse format. Options: json, csv. CSV returns a downloadable file (default: json){
"window": "30d",
"filters": {
"keywords": ["trump", "voter fraud"],
"domains": ["twitter.com", "facebook.com"],
"countries": ["US"],
"regions": ["US-PA"]
},
"group_by": ["keyword", "county", "time"],
"bucket": "day",
"order_by": "suppressions",
"order": "desc",
"limit": 100
}{
"window": "30d",
"bucket": "day",
"group_by": ["keyword", "county", "time"],
"results": [
{
"keyword": "trump",
"county_id": "county_chester",
"county_name": "Chester County",
"ts": "2026-02-01T00:00:00Z",
"suppressions": 1234,
"unique_users": 56,
"events": 890
}
],
"disclaimer": "Data reflects anonymous, aggregated user filtering behavior..."
}/api/v1/signals/trendingObserver+Detects keywords, domains, or other dimensions with the fastest growth rate by comparing recent activity to a baseline period.
windowAnalysis window. Options: 24h, 7d, 30d. Determines the recent vs baseline comparison periods (default: 24h)dimensionDimension to trend on. Options: keyword, domain, platform, page_context (default: keyword)metricMetric to measure growth. Options: suppressions, events, unique_users (default: suppressions)limitMax results (1-500) (default: 50)min_baselineMinimum baseline value to include (filters out low-activity items) (default: 10){
"window": "24h",
"dimension": "keyword",
"metric": "suppressions",
"recent_period": "6 hours",
"baseline_period": "6 hours to 24 hours ago",
"trending": [
{
"value": "immigration",
"recent": 2451,
"baseline": 890,
"growth_pct": 175.4
}
],
"disclaimer": "Trending scores reflect relative growth in anonymous, aggregated filtering activity..."
}/api/v1/signals/keyword-activityObserver+Shows which keywords users are adding, removing, or editing in their filter lists. Reveals user intent and keyword churn.
windowTime window. Options: 1h, 6h, 12h, 24h, 7d, 30d (default: 24h)typeFilter by event type. Options: added, removed, edited, all (default: all)limitMax results (1-500) (default: 50){
"window": "24h",
"type": "all",
"keywords": [
{
"keyword": "trump",
"adds": 142,
"removes": 23,
"edits": 5,
"total_events": 170,
"unique_users": 134,
"net_adds": 119
}
],
"disclaimer": "Data reflects anonymous, aggregated keyword configuration changes..."
}You don’t need to write code to use the API. These tools let you make requests and visualize results from a browser or spreadsheet.
The easiest way to explore the API interactively.
/top-keywords?window=7d&limit=20)Pull API data directly into Google Sheets cells. Supports both GET requests (Observer endpoints) and POST requests (Analyst /query endpoint).
Authorization: Bearer YOUR_API_KEYAnalyst tip: use "format": "csv" in POST body for clean tabular import.
/query endpoint.Build a live dashboard without writing a frontend using Retool or Appsmith:
https://atfilter.com/api/v1/signalsAuthorization: Bearer YOUR_API_KEYIdeal for sharing @Filter data with a team without distributing API keys.
Professional plan subscribers can use our MCP (Model Context Protocol) server to query the @Filter API using natural language through Claude Desktop, Cursor, or VS Code.
Install the @Filter MCP server globally via npm:
npm install -g @atfilter/mcp-server
Or clone the repository and build from source — see the GitHub README for details.
Edit your Claude Desktop config file:
%APPDATA%\Claude\claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.json{
"mcpServers": {
"atfilter": {
"command": "npx",
"args": ["-y", "@atfilter/mcp-server"],
"env": {
"ATFILTER_API_KEY": "atf_your_api_key_here"
}
}
}
}Add to .cursor/mcp.json in your project:
{
"mcpServers": {
"atfilter": {
"command": "npx",
"args": ["-y", "@atfilter/mcp-server"],
"env": {
"ATFILTER_API_KEY": "atf_your_api_key_here"
}
}
}
}Add to .vscode/mcp.json:
{
"servers": {
"atfilter": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@atfilter/mcp-server"],
"env": {
"ATFILTER_API_KEY": "atf_your_api_key_here"
}
}
}
}The MCP server exposes 7 tools that your AI assistant can call:
| Tool | Description |
|---|---|
signals_top_keywords | Get the most suppressed keywords |
signals_keyword_timeseries | Track a keyword’s activity over time |
signals_geo_heat | Geographic distribution of filtering activity |
signals_domain_timeseries | Track a domain’s filtering activity over time |
signals_trending | Detect fastest-growing keywords, domains, platforms |
signals_keyword_activity | See which keywords users are adding or removing |
signals_query | Flexible multi-dimension query with any filter/group combination |
Once connected, ask your AI assistant things like:
Configure webhook alerts to get notified when keywords or domains spike above a threshold. Manage your webhooks from your account page.
When a keyword or dimension exceeds your growth threshold, we POST a JSON payload to your configured URL:
{
"source": "atfilter",
"event": "trending_alert",
"webhook_id": "clx...",
"window": "24h",
"dimension": "keyword",
"threshold_pct": 100,
"triggered_at": "2026-02-22T14:30:00.000Z",
"alerts": [
{
"value": "immigration",
"recent": 2451,
"baseline": 890,
"growth_pct": 175.4
}
]
}Dimensions: keyword, domain, platform, page_context
Windows: 24h, 7d, 30d
Cooldown: 15 min to 24 hours (prevents repeated alerts)
Limit: Up to 10 webhook alerts per subscription
400Invalid or missing parameter401Missing or invalid API key403Endpoint requires a higher plan tier429Rate limit exceeded500Internal server error@Map data represents collective user behavior patterns with statistical noise applied for privacy protection. Numbers are approximate and should not be cited as exact figures. @Filter makes no claims about the accuracy, completeness, or meaning of aggregated patterns.
Data reflects anonymous, aggregated user filtering behavior and does not represent editorial claims, endorsements, or factual assertions by @Filter or @Map.
Use of this API is subject to the API Terms of Service.
Need institutional access or custom endpoints? Contact us