Topic Evolution
curl --request GET \
--url https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution \
--header 'Authorization: <authorization>'import requests
url = "https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution', 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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"success": true,
"keyword": {
"id": "<string>",
"text": "<string>"
},
"evolution": [
{
"date": "<string>",
"answers": 123,
"mentionRate": 123,
"shareOfVoice": 123,
"avgSentiment": {},
"sourceRate": 123
}
]
}Topics
Topic Evolution
Daily time-series metrics for a specific topic
GET
/
api
/
v1
/
brands
/
{brandId}
/
keywords
/
{keywordId}
/
evolution
Topic Evolution
curl --request GET \
--url https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution \
--header 'Authorization: <authorization>'import requests
url = "https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution', 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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
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.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brandId}/keywords/{keywordId}/evolution")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"success": true,
"keyword": {
"id": "<string>",
"text": "<string>"
},
"evolution": [
{
"date": "<string>",
"answers": 123,
"mentionRate": 123,
"shareOfVoice": 123,
"avgSentiment": {},
"sourceRate": 123
}
]
}Returns daily time-series metrics for a specific topic (keyword), including mention rate, share of voice, sentiment, and source citation rate.
string
required
Bearer token. Example:
Bearer qw-api-xxxPath Parameters
string
required
The unique identifier of the brand
string
required
The unique identifier of the topic
Query Parameters
number
Number of days to include. If not specified, returns all data.
string
Start date (ISO 8601 format)
string
End date (ISO 8601 format)
string
Filter by AI provider. Supports comma-separated multi-select (e.g.,
chatgpt,claude).string
Filter by tag ID. Supports comma-separated multi-select (e.g.,
id1,id2).string
Filter by prompt type:
TOFU, MOFU, BOFUResponse
boolean
Indicates if the request was successful
array
Example Request
curl -X GET "https://www.qwairy.co/api/v1/brands/cm1234567890abcdef/keywords/kw1/evolution?period=30" \
-H "Authorization: Bearer qw-api-your-token-here"
Example Response
{
"success": true,
"keyword": {
"id": "kw1",
"text": "best CRM software"
},
"evolution": [
{
"date": "2026-02-15",
"answers": 42,
"mentionRate": 65.2,
"shareOfVoice": 48.3,
"avgSentiment": 72.1,
"sourceRate": 55.0
},
{
"date": "2026-02-16",
"answers": 38,
"mentionRate": 60.5,
"shareOfVoice": 45.1,
"avgSentiment": 74.2,
"sourceRate": 52.6
}
]
}
Error Responses
| Status | Code | Description |
|---|---|---|
| 401 | INVALID_TOKEN | Authentication failed |
| 404 | BRAND_NOT_FOUND | Brand doesn’t exist or not accessible |
| 404 | KEYWORD_NOT_FOUND | Topic doesn’t exist or not accessible |
⌘I

