curl --request GET \
--url https://api.nephia.cc/v1/mentions/stats \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/mentions/stats"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.nephia.cc/v1/mentions/stats', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nephia.cc/v1/mentions/stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nephia.cc/v1/mentions/stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.nephia.cc/v1/mentions/stats")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/mentions/stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"since": "<string>",
"until": "<string>",
"total": 123,
"groupBy": [
"day"
],
"rows": [
{
"count": 123,
"day": "<string>",
"hour": "<string>",
"source": "x",
"sentiment": "positive",
"intent": "purchase_intent",
"author": "<string>",
"term": "<string>",
"query": {
"id": "<string>",
"name": "<string>"
}
}
],
"unread": 123,
"truncated": true
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "Rate limit exceeded",
"code": "TOO_MANY_REQUESTS"
}Count mentions
Counts your mentions instead of paging them: how many, when, where, by whom and on which terms, in one call. group_by takes one or two axes among day, hour, source, sentiment, intent, author, term and query, and rows holds one count per combination. A combination with nothing in it is absent: a quiet day is a missing row, not a zero. total counts every mention in the window, whatever top kept. The open axes (author, term, query) keep their top busiest values and set truncated when they cut. A mention caught by two terms counts under each, so term rows can add up to more than total, and one with no recorded term counts under null. With sentiment or intent as an axis, unread is how many mentions nothing has read yet. The window is on the publication date, as Insights counts, not on the collection date GET /v1/mentions filters on, and covers 90 days at most. These are the numbers Insights shows: every mention caught, including the ones a mute rule or a hide keeps off the page, so a count can be higher than the rows the same filter pages. Only polled mentions are counted, and kind=runs is refused. Free: does not charge credits. query takes a Query id from GET /v1/queries and reads that Query’s mentions only, including what its searches caught before they last changed. source, sentiment and intent are repeatable filters — ?sentiment=negative&sentiment=question returns both, and repeated values of one key are OR’d while different keys are AND’d. unread selects mentions nothing has classified yet. Filtering on sentiment or intent reads the polled stream only: kept Explore-run items carry no reading. author is repeatable too, and exact — the handle as the Source writes it, with no leading @ and no u/. Use q to search text. A handle you have never seen returns an empty page rather than an error, and a mention with no author never matches: not every Source carries a byline, and none carried one before author extraction shipped for it. engagement_min keeps mentions with at least that many interactions — likes, replies, reposts, comments or score, per Source. It never counts views. Mentions with no counters at all are left out rather than read as zero: RSS items and AI answers report no audience, and mentions recorded before 2026-09-04 predate the field. Counters are captured when we collect an item and never refreshed, so the threshold reads against recent mentions. Like sentiment and intent, it reads the polled stream only. engagement is a per-Source rule: <source|*>:<metric><operator><number>, repeatable — ?engagement=x:likes>=100&engagement=reddit:score>50. Metrics are likes, replies, reposts, comments, score, views, plus total for the interaction sum engagement_min reads (engagement_min=10 is exactly engagement=*:total>=10). Operators are >=, >, =, <, <=; the number is a whole number and may be negative, since Reddit and Lemmy net downvotes out. A Source no rule names passes — ?engagement=x:likes>=100 narrows X and leaves Hacker News alone — a named rule overrides * for its own Source, and several rules on one Source are ANDed; use source= to ask for one Source. A metric that was never counted satisfies nothing, < included: RSS items and AI answers report no audience, YouTube reports no likes, and mentions recorded before 2026-09-04 predate the field, so engagement=youtube:likes<10 returns none of them rather than all of them. Send engagement or engagement_min, never both.
curl --request GET \
--url https://api.nephia.cc/v1/mentions/stats \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/mentions/stats"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.nephia.cc/v1/mentions/stats', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nephia.cc/v1/mentions/stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.nephia.cc/v1/mentions/stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.nephia.cc/v1/mentions/stats")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/mentions/stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"since": "<string>",
"until": "<string>",
"total": 123,
"groupBy": [
"day"
],
"rows": [
{
"count": 123,
"day": "<string>",
"hour": "<string>",
"source": "x",
"sentiment": "positive",
"intent": "purchase_intent",
"author": "<string>",
"term": "<string>",
"query": {
"id": "<string>",
"name": "<string>"
}
}
],
"unread": 123,
"truncated": true
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "Rate limit exceeded",
"code": "TOO_MANY_REQUESTS"
}Authorizations
API key created from the Nephia dashboard for your Account.
Query Parameters
ISO-8601 lower bound, inclusive, on the date the mention was published (the collection date where the Source gives none), which is how Insights counts. Defaults to 7 days before until.
ISO-8601 upper bound, inclusive, on the same date. Defaults to now. The window covers 90 days at most.
One or two axes, comma-separated: day, hour, source, sentiment, intent, author, term, query. day and hour cannot be combined.
"day,sentiment"
How many values of an open axis (author, term, query) to keep, busiest first. Default 10, at most 50.
1 <= x <= 50polling, runs x, reddit, youtube, tiktok, bluesky, hackernews, mastodon, lemmy, github, producthunt, stackoverflow, rss, ai_answers, vinted Only this Query's mentions, by id from GET /v1/queries, including what its searches caught before they last changed. An id that is not one of your Queries is a 404.
purchase_intent, comparison, question, complaint, praise, other, unread positive, neutral, negative, question, mixed, unread 1 - 200x >= 01 - 120Was this page helpful?