curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/ads/advertisers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/ads/advertisers"
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}/ads/advertisers', 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}/ads/advertisers",
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}/ads/advertisers"
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}/ads/advertisers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/ads/advertisers")
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": [
{
"advertiser_key": "globex.com",
"name": "Globex",
"domain": "globex.com",
"rank": 1,
"ads": 52,
"share_pct": 18.4,
"prompts": 19,
"creatives": 6,
"first_seen": "2026-10-15",
"last_seen": "2026-11-13",
"is_competitor": true,
"is_own": false
},
{
"advertiser_key": "initech.com",
"name": "Initech",
"domain": "initech.com",
"rank": 2,
"ads": 37,
"share_pct": 13.1,
"prompts": 14,
"creatives": 4,
"first_seen": "2026-10-17",
"last_seen": "2026-11-13",
"is_competitor": false,
"is_own": false
}
],
"has_more": true,
"next_cursor": "WyJvIiwyXQ",
"total_count": 41
}{
"error": {
"code": "invalid_date",
"message": "Dates must be ISO 8601, e.g. 2026-08-01."
}
}{
"error": {
"code": "invalid_api_key",
"message": "This API key is not valid or has been revoked."
}
}{
"error": {
"code": "subscription_required",
"message": "This workspace does not have an active subscription. API access requires an active or trialing plan."
}
}{
"error": {
"code": "forbidden",
"message": "This workspace cannot perform that action."
}
}{
"error": {
"code": "not_found",
"message": "No such brand in this workspace."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit of 120 requests per minute exceeded."
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side."
}
}Advertisers
Who advertises on this brand’s prompts, most ads first, with each one’s share of all ads and whether it is a tracked competitor. Pass tracked=true to see only your competitors.
curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/ads/advertisers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/ads/advertisers"
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}/ads/advertisers', 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}/ads/advertisers",
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}/ads/advertisers"
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}/ads/advertisers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/ads/advertisers")
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": [
{
"advertiser_key": "globex.com",
"name": "Globex",
"domain": "globex.com",
"rank": 1,
"ads": 52,
"share_pct": 18.4,
"prompts": 19,
"creatives": 6,
"first_seen": "2026-10-15",
"last_seen": "2026-11-13",
"is_competitor": true,
"is_own": false
},
{
"advertiser_key": "initech.com",
"name": "Initech",
"domain": "initech.com",
"rank": 2,
"ads": 37,
"share_pct": 13.1,
"prompts": 14,
"creatives": 4,
"first_seen": "2026-10-17",
"last_seen": "2026-11-13",
"is_competitor": false,
"is_own": false
}
],
"has_more": true,
"next_cursor": "WyJvIiwyXQ",
"total_count": 41
}{
"error": {
"code": "invalid_date",
"message": "Dates must be ISO 8601, e.g. 2026-08-01."
}
}{
"error": {
"code": "invalid_api_key",
"message": "This API key is not valid or has been revoked."
}
}{
"error": {
"code": "subscription_required",
"message": "This workspace does not have an active subscription. API access requires an active or trialing plan."
}
}{
"error": {
"code": "forbidden",
"message": "This workspace cannot perform that action."
}
}{
"error": {
"code": "not_found",
"message": "No such brand in this workspace."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit of 120 requests per minute exceeded."
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side."
}
}Authorizations
Your API key, e.g. Authorization: Bearer gp_live_....
Path Parameters
Brand id.
Query Parameters
Ads are tracked on ChatGPT only, so this is chatgpt or omitted.
chatgpt Inclusive start date. Defaults to 30 days before to.
Exclusive end date. Defaults to tomorrow.
Restrict to one market: a two-letter code, or global for checks run without a market. The summary's markets lists the values this brand has.
Repeatable. Restrict to prompts in these topics.
Restrict to prompts that name this brand (branded) or to those that do not (non_branded). Omit, or all, for every prompt.
all, branded, non_branded true = only tracked competitors. rank and share_pct stay overall.
Match advertiser name, key or domain.
200Rows per page. Max 500.
x <= 500Opaque cursor from the previous page's next_cursor. Use it with the same other parameters.