curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/ads/answers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/ads/answers"
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/answers', 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/answers",
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/answers"
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/answers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/ads/answers")
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": [
{
"response_id": "e4a7c2d1-5b8f-4a36-9c0e-2d7f1b6a8e53",
"prompt_id": "3f9a2c14-8b7e-4d61-a052-c7e4b9138265",
"prompt_text": "best project management software for small teams",
"checked_on": "2026-11-13",
"country": "US",
"brand_mentioned": false,
"snippet": "For small teams, the most popular options balance simple task boards with enough structure for planning. Here are the tools teams pick most often..."
}
],
"has_more": true,
"next_cursor": "WyJvIiwxXQ",
"total_count": 283
}{
"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."
}
}Answers with an ad
The answers that showed an ad, newest first, with a short excerpt and whether your brand was named. Narrow to one advertiser, ad or prompt to see where it ran.
curl --request GET \
--url https://api.geoptie.com/v1/brands/{id}/ads/answers \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.geoptie.com/v1/brands/{id}/ads/answers"
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/answers', 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/answers",
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/answers"
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/answers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.geoptie.com/v1/brands/{id}/ads/answers")
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": [
{
"response_id": "e4a7c2d1-5b8f-4a36-9c0e-2d7f1b6a8e53",
"prompt_id": "3f9a2c14-8b7e-4d61-a052-c7e4b9138265",
"prompt_text": "best project management software for small teams",
"checked_on": "2026-11-13",
"country": "US",
"brand_mentioned": false,
"snippet": "For small teams, the most popular options balance simple task boards with enough structure for planning. Here are the tools teams pick most often..."
}
],
"has_more": true,
"next_cursor": "WyJvIiwxXQ",
"total_count": 283
}{
"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 Restrict to one advertiser, by the advertiser_key other ads endpoints return.
Restrict to one ad creative, by creative_id.
Restrict to one prompt this brand tracks. Cannot be combined with topic_id.
Rows per page. Max 500.
x <= 500Opaque cursor from the previous page's next_cursor. Use it with the same other parameters.