curl --request GET \
--url https://api.nephia.cc/v1/queries/{id}/results \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/queries/{id}/results"
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/queries/{id}/results', 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/queries/{id}/results",
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/queries/{id}/results"
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/queries/{id}/results")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/queries/{id}/results")
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>",
"query": {
"id": "<string>",
"name": "<string>",
"kind": "catalog",
"aiEnabled": true,
"isActive": true
},
"enabledSources": [
"x"
],
"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,
"bucket": {
"bucketId": "<string>",
"rationale": "<string>",
"confidence": 123,
"movedByUser": true
}
}
],
"until": "<string>",
"nextCursor": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "Rate limit exceeded",
"code": "TOO_MANY_REQUESTS"
}List a query's mentions
The same mentions as GET /v1/mentions, scoped to one Query and carrying its bucket verdict. Filter to a bucket with bucket=, using an id from GET /v1/queries/{id}/buckets or the literal uncategorised. 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. 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/queries/{id}/results \
--header 'x-api-key: <api-key>'import requests
url = "https://api.nephia.cc/v1/queries/{id}/results"
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/queries/{id}/results', 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/queries/{id}/results",
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/queries/{id}/results"
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/queries/{id}/results")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nephia.cc/v1/queries/{id}/results")
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>",
"query": {
"id": "<string>",
"name": "<string>",
"kind": "catalog",
"aiEnabled": true,
"isActive": true
},
"enabledSources": [
"x"
],
"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,
"bucket": {
"bucketId": "<string>",
"rationale": "<string>",
"confidence": 123,
"movedByUser": true
}
}
],
"until": "<string>",
"nextCursor": "<string>"
}{
"error": "<string>",
"code": "<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.
Path Parameters
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 1 - 120text, semantic "uncategorised"purchase_intent, comparison, question, complaint, praise, other, unread positive, neutral, negative, question, mixed, unread x >= 01 - 120Response
Mentions
Show child attributes
Show child attributes
x, reddit, youtube, tiktok, bluesky, hackernews, mastodon, lemmy, github, producthunt, stackoverflow, rss, ai_answers, vinted Show child attributes
Show child attributes
Was this page helpful?