curl --request GET \
--url https://astreus.ai/api/v1/intelligence/narratives \
--header 'X-API-KEY: <api-key>'import requests
url = "https://astreus.ai/api/v1/intelligence/narratives"
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://astreus.ai/api/v1/intelligence/narratives', 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://astreus.ai/api/v1/intelligence/narratives",
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://astreus.ai/api/v1/intelligence/narratives"
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://astreus.ai/api/v1/intelligence/narratives")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://astreus.ai/api/v1/intelligence/narratives")
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{
"asOf": "2026-10-06",
"universeTotal": 7158,
"policyOnlyTotal": 0,
"items": [
{
"narrativeId": 10021258,
"name": "Regional geopolitical and supply chain disruption affecting project execution",
"description": "Operating environment complexity in 2026 driven by regional geopolitical developments combined with ongoing supply chain disruption, creating execution challenges and uncertainty for project-based bus…",
"lifecycleState": "accelerating",
"breadth": 15,
"breadthPrevQuarter": 10,
"momentum": 14,
"mentions28d": 23,
"netDirection": 0.3157894736842105,
"forwardShare": 0.08695652173913043,
"sectorCount": 5,
"matchedTickers": [
"1214",
"2010"
],
"matchedIssuers": [
{
"cik": "XSAU000073",
"ticker": "1214"
},
{
"cik": "XSAU000088",
"ticker": "2010"
}
],
"matchedCountries": [
"SA",
"OM"
],
"lastActive": "2026-09-22",
"lastRaised": "2026-09-22",
"companyMentions": 23,
"policyMentions": 0,
"policyVoices": 0,
"policyVoiceNames": [],
"themeScope": "market",
"soleCompany": null
},
{
"narrativeId": 10021237,
"name": "Strategic revenue diversification toward non-funded income",
"description": "Conscious bank-level strategy to build fee-based revenue streams across multiple business lines, reducing reliance on interest income through global markets, investment banking, and transaction servic…",
"lifecycleState": "steady",
"breadth": 17,
"breadthPrevQuarter": 17,
"momentum": -11,
"mentions28d": 53,
"netDirection": 0.8775510204081632,
"forwardShare": 0.2830188679245283,
"sectorCount": 2,
"matchedTickers": [
"1010",
"1050"
],
"matchedIssuers": [
{
"cik": "XSAU000055",
"ticker": "1010"
},
{
"cik": "XSAU000058",
"ticker": "1050"
}
],
"matchedCountries": [
"AE",
"SA"
],
"lastActive": "2026-08-06",
"lastRaised": "2026-08-06",
"companyMentions": 53,
"policyMentions": 0,
"policyVoices": 0,
"policyVoiceNames": [],
"themeScope": "market",
"soleCompany": null
}
],
"total": 2257,
"hiddenByFloor": 0,
"limit": 2,
"offset": 0,
"hasMore": true,
"nextOffset": 2
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}List narratives
Search, filter and sort the narrative registry (company and policy themes; dormant ones with includeDormant=1). Paged: the body carries total, limit, offset, hasMore and nextOffset; an empty list carries emptyReason (which catalog serves and whom it covers). An unknown sort, source, themeScope or lifecycle, or a number out of range, is a 400 naming the parameter.
curl --request GET \
--url https://astreus.ai/api/v1/intelligence/narratives \
--header 'X-API-KEY: <api-key>'import requests
url = "https://astreus.ai/api/v1/intelligence/narratives"
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://astreus.ai/api/v1/intelligence/narratives', 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://astreus.ai/api/v1/intelligence/narratives",
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://astreus.ai/api/v1/intelligence/narratives"
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://astreus.ai/api/v1/intelligence/narratives")
.header("X-API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://astreus.ai/api/v1/intelligence/narratives")
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{
"asOf": "2026-10-06",
"universeTotal": 7158,
"policyOnlyTotal": 0,
"items": [
{
"narrativeId": 10021258,
"name": "Regional geopolitical and supply chain disruption affecting project execution",
"description": "Operating environment complexity in 2026 driven by regional geopolitical developments combined with ongoing supply chain disruption, creating execution challenges and uncertainty for project-based bus…",
"lifecycleState": "accelerating",
"breadth": 15,
"breadthPrevQuarter": 10,
"momentum": 14,
"mentions28d": 23,
"netDirection": 0.3157894736842105,
"forwardShare": 0.08695652173913043,
"sectorCount": 5,
"matchedTickers": [
"1214",
"2010"
],
"matchedIssuers": [
{
"cik": "XSAU000073",
"ticker": "1214"
},
{
"cik": "XSAU000088",
"ticker": "2010"
}
],
"matchedCountries": [
"SA",
"OM"
],
"lastActive": "2026-09-22",
"lastRaised": "2026-09-22",
"companyMentions": 23,
"policyMentions": 0,
"policyVoices": 0,
"policyVoiceNames": [],
"themeScope": "market",
"soleCompany": null
},
{
"narrativeId": 10021237,
"name": "Strategic revenue diversification toward non-funded income",
"description": "Conscious bank-level strategy to build fee-based revenue streams across multiple business lines, reducing reliance on interest income through global markets, investment banking, and transaction servic…",
"lifecycleState": "steady",
"breadth": 17,
"breadthPrevQuarter": 17,
"momentum": -11,
"mentions28d": 53,
"netDirection": 0.8775510204081632,
"forwardShare": 0.2830188679245283,
"sectorCount": 2,
"matchedTickers": [
"1010",
"1050"
],
"matchedIssuers": [
{
"cik": "XSAU000055",
"ticker": "1010"
},
{
"cik": "XSAU000058",
"ticker": "1050"
}
],
"matchedCountries": [
"AE",
"SA"
],
"lastActive": "2026-08-06",
"lastRaised": "2026-08-06",
"companyMentions": 53,
"policyMentions": 0,
"policyVoices": 0,
"policyVoiceNames": [],
"themeScope": "market",
"soleCompany": null
}
],
"total": 2257,
"hiddenByFloor": 0,
"limit": 2,
"offset": 0,
"hasMore": true,
"nextOffset": 2
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}{
"error": "<string>",
"code": "unknown_parameter",
"param": "<string>",
"allowed": [
"<string>"
]
}Authorizations
Astreus API key (pk_live_...), created on the Developers page in the terminal. Also accepted as Authorization: Bearer pk_live_....
Query Parameters
Free text over name and description.
GICS sector name.
Comma-separated tickers to scope by.
Comma-separated ISO alpha-2 issuer domiciles to scope by (e.g. AE,SA,QA,KW).
Comma-separated issuer platform keys to scope by.
1 to include themes with no activity in the trailing window (returned as lifecycleState=dormant); 0 (default) leaves them out.
0, 1 Minimum companies discussing the theme, 0–50 (default 0 = long tail). Not applied to company or regional themes.
0 <= x <= 50all (default), companies or policy.
all, companies, policy relevance (default), breadth, momentum or recent.
relevance, breadth, momentum, recent Page size, 1–200, default 40.
1 <= x <= 200Rows to skip (the previous nextOffset), default 0. 0–1000000, default 0.
0 <= x <= 10000001 lists only narratives mentioned in the last 28 days.
1, 0 Only narratives in this lifecycle state.
emerging, accelerating, broadening, steady, mature, fading, dormant Theme breadth: market-wide, regional or single-company themes; default all.
all, market, regional, company Response
OK
Inferred from captured responses: every field shown was returned by a real call; a field may be absent or null on other calls.