Tracked competitors over time
curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/competitors/trends \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/competitors/trends"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.geoptie.com/v1/brands/{id}/competitors/trends', 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.geoptie.com/v1/brands/{id}/competitors/trends",
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: Bearer <token>"
],
]);
$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.geoptie.com/v1/brands/{id}/competitors/trends"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.geoptie.com/v1/brands/{id}/competitors/trends")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/competitors/trends")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"granularity": "day",
"from": "2023-12-25",
"to": "2023-12-25",
"engine": "<string>",
"brand": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"brand_name": "<string>",
"is_your_brand": true,
"domains": [
"<string>"
],
"history_from": "2023-12-25",
"totals": {
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123
},
"series": [
{
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123,
"date": "2023-12-25"
}
]
},
"competitors": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"brand_name": "<string>",
"is_your_brand": true,
"domains": [
"<string>"
],
"history_from": "2023-12-25",
"totals": {
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123
},
"series": [
{
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123,
"date": "2023-12-25"
}
]
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Competitors
Tracked competitors over time
Daily or weekly series for the brand and each tracked competitor: visibility, share of voice, mentions, position, sentiment, win rate and citations of their own website, over the brand’s tracked prompts. Read from precomputed daily rows, so it is cheap at any window length. A competitor tracked recently may have history_from null until its backfill completes.
GET
/
v1
/
brands
/
{id}
/
competitors
/
trends
Tracked competitors over time
curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/competitors/trends \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/competitors/trends"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.geoptie.com/v1/brands/{id}/competitors/trends', 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.geoptie.com/v1/brands/{id}/competitors/trends",
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: Bearer <token>"
],
]);
$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.geoptie.com/v1/brands/{id}/competitors/trends"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.geoptie.com/v1/brands/{id}/competitors/trends")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/competitors/trends")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"granularity": "day",
"from": "2023-12-25",
"to": "2023-12-25",
"engine": "<string>",
"brand": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"brand_name": "<string>",
"is_your_brand": true,
"domains": [
"<string>"
],
"history_from": "2023-12-25",
"totals": {
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123
},
"series": [
{
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123,
"date": "2023-12-25"
}
]
},
"competitors": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"brand_name": "<string>",
"is_your_brand": true,
"domains": [
"<string>"
],
"history_from": "2023-12-25",
"totals": {
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123
},
"series": [
{
"responses_answered": 123,
"responses_with_brand": 123,
"mention_count": 123,
"citation_count": 123,
"detection_rate": 123,
"visibility_score": 123,
"avg_position": 123,
"avg_sentiment": 123,
"top3_visibility": 123,
"win_rate": 123,
"share_of_voice": 123,
"date": "2023-12-25"
}
]
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Your API key, e.g. Authorization: Bearer gp_live_....
Path Parameters
Brand id.
Query Parameters
Restrict to one engine. Omit for the all-engine rollup. Stable public engine identifier. Internal model names are never exposed.
Available options:
chatgpt, claude, perplexity, gemini, google_ai_overviews, google_ai_mode, copilot Inclusive start date. Defaults to 30 days before to.
Exclusive end date. Defaults to tomorrow.
Bucket size.
Available options:
day, week Response
Success
Show child attributes
Show child attributes