curl --request GET \
--url https://api.nephia.cc/v1/mentions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/mentions"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/mentions")
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>",
"mentions": [
{
"id": "<string>",
"source": "x",
"type": "listing.created",
"occurredAt": "<string>",
"publishedAt": "<string>",
"query": {
"id": "<string>",
"name": "<string>"
},
"run": {
"id": "<string>",
"name": "<string>"
},
"title": "<string>",
"body": "<string>",
"url": "<string>",
"metaLabel": "<string>",
"sentiment": "positive",
"intent": "purchase_intent",
"authorHandle": "<string>",
"marks": [
"to_reply"
],
"agent": {},
"media": {
"thumbnailUrl": "<string>",
"imageUrls": [
"<string>"
],
"avatarUrl": "<string>",
"durationLabel": "<string>"
},
"fields": [
{
"label": "<string>",
"value": "<string>"
}
],
"duplicateOf": "<string>",
"duplicateCount": 123,
"seeded": true
}
],
"until": "<string>",
"nextCursor": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "Rate limit exceeded",
"code": "TOO_MANY_REQUESTS"
}List mentions
Everything your Queries caught, newest first, across every Source and every Query on the Account — annotated with the sentiment, intent and agent readings you have switched on, and filterable on both. Cursor-paged: pass the response nextCursor back unchanged. Its absence means the last page. Free in the default text mode. Set mode=semantic to search by meaning instead of by substring. That path asks the embedding index and charges — at the same rate, through the same ten-minute cache, as the dashboard. Leave it out and the read is free. 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. Bound the window at both ends with since and until — ?since=2026-08-03T00:00:00Z&until=2026-08-05T23:59:59Z is those three days and nothing else. until is inclusive; absent, the window stays open at the top.
curl --request GET \
--url https://api.nephia.cc/v1/mentions \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/mentions"
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', 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",
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"
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")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/mentions")
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>",
"mentions": [
{
"id": "<string>",
"source": "x",
"type": "listing.created",
"occurredAt": "<string>",
"publishedAt": "<string>",
"query": {
"id": "<string>",
"name": "<string>"
},
"run": {
"id": "<string>",
"name": "<string>"
},
"title": "<string>",
"body": "<string>",
"url": "<string>",
"metaLabel": "<string>",
"sentiment": "positive",
"intent": "purchase_intent",
"authorHandle": "<string>",
"marks": [
"to_reply"
],
"agent": {},
"media": {
"thumbnailUrl": "<string>",
"imageUrls": [
"<string>"
],
"avatarUrl": "<string>",
"durationLabel": "<string>"
},
"fields": [
{
"label": "<string>",
"value": "<string>"
}
],
"duplicateOf": "<string>",
"duplicateCount": 123,
"seeded": true
}
],
"until": "<string>",
"nextCursor": "<string>"
}{
"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 upper bound on occurredAt — the date Nephia collected the mention, not the date it was published. Inclusive. Absent means the window is open at the top. With since, this is a closed interval — ?since=2026-08-03T00:00:00Z&until=2026-08-05T23:59:59Z is those three days and nothing else.
1 <= x <= 1001x, reddit, youtube, tiktok, bluesky, hackernews, mastodon, lemmy, github, producthunt, stackoverflow, rss, ai_answers, vinted listing.created, listing.delisted, listing.price_changed, tweet.created, post.created, reddit_comment.created, video.created, bluesky_post.created, hn_item.created, article.created, answer.created, answer.changed, term.cited, term.uncited, status.created, lemmy_post.created, github_item.created, launch.created, stack_item.created, tiktok_video.created polling, runs 1 - 120text, semantic purchase_intent, comparison, question, complaint, praise, other, unread positive, neutral, negative, question, mixed, unread 1 - 200x >= 01 - 120Was this page helpful?