curl --request GET \
--url https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend', 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/{brand_id}/dashboards/competitor-seo/trend",
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.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend"
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.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend")
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{
"series": [
{
"competitor_domain": "<string>",
"points": [
{
"captured_at": "2023-11-07T05:31:56Z",
"est_organic_traffic": 123,
"source": "live"
}
]
}
],
"market": {
"location_code": 123,
"language_code": "<string>",
"label": "<string>",
"country_code": "<string>",
"country_name": "<string>"
},
"ai_share_of_voice_state": "measured",
"ai_share_of_voice": {
"measured": true,
"expected_answers": 1,
"measured_answers": 1,
"missing_answers": 1,
"platform": "<string>",
"captured_at": "2023-11-07T05:31:56Z",
"brands": [
{
"brand": "<string>",
"domain": "",
"answers_naming": 1,
"share_of_voice": 0.5,
"mention_share": 0.5,
"answers_citing": 1,
"citation_share": 0.5,
"is_target": false
}
],
"samples": [
{
"prompt": "<string>",
"platform": "<string>",
"brands_named": [
"<string>"
],
"cohort_brands_named": [
"<string>"
],
"provider": "dataforseo",
"model": "",
"mention_observed": true,
"sources_observed": true,
"brand_urls": [
"<string>"
],
"cited_domains": [
"<string>"
],
"cohort_domains_cited": [
"<string>"
],
"citations": [
{
"url": "<string>",
"title": ""
}
],
"check_url": ""
}
],
"mention_denominator": 1,
"citation_denominator": 1,
"citation_denominator_basis": "source_list_observed",
"provider": "dataforseo",
"location_code": 2,
"language_code": "<string>",
"matching_note": "<string>",
"stale": false
},
"estimate_notice": ""
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Competitor Seo Trend
Per-competitor modelled organic-traffic trend series.
curl --request GET \
--url https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend', 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/{brand_id}/dashboards/competitor-seo/trend",
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.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend"
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.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/brands/{brand_id}/dashboards/competitor-seo/trend")
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{
"series": [
{
"competitor_domain": "<string>",
"points": [
{
"captured_at": "2023-11-07T05:31:56Z",
"est_organic_traffic": 123,
"source": "live"
}
]
}
],
"market": {
"location_code": 123,
"language_code": "<string>",
"label": "<string>",
"country_code": "<string>",
"country_name": "<string>"
},
"ai_share_of_voice_state": "measured",
"ai_share_of_voice": {
"measured": true,
"expected_answers": 1,
"measured_answers": 1,
"missing_answers": 1,
"platform": "<string>",
"captured_at": "2023-11-07T05:31:56Z",
"brands": [
{
"brand": "<string>",
"domain": "",
"answers_naming": 1,
"share_of_voice": 0.5,
"mention_share": 0.5,
"answers_citing": 1,
"citation_share": 0.5,
"is_target": false
}
],
"samples": [
{
"prompt": "<string>",
"platform": "<string>",
"brands_named": [
"<string>"
],
"cohort_brands_named": [
"<string>"
],
"provider": "dataforseo",
"model": "",
"mention_observed": true,
"sources_observed": true,
"brand_urls": [
"<string>"
],
"cited_domains": [
"<string>"
],
"cohort_domains_cited": [
"<string>"
],
"citations": [
{
"url": "<string>",
"title": ""
}
],
"check_url": ""
}
],
"mention_denominator": 1,
"citation_denominator": 1,
"citation_denominator_basis": "source_list_observed",
"provider": "dataforseo",
"location_code": 2,
"language_code": "<string>",
"matching_note": "<string>",
"stale": false
},
"estimate_notice": ""
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
Successful Response
Show child attributes
Show child attributes
WHICH market an organic-search series describes.
Organic rank, traffic and keyword counts are measured per
(location_code, language_code): the same domain measured in the US and
in the UK produces two unrelated numbers. Every SEO reader here is scoped
to exactly one market (see get_traffic_series /
get_historical_traffic_series / get_domain_seo_measurement), and a
brand can change its market at any time from the market modal — so a
series that does not NAME its market silently changes basis under the
reader, who has no way to tell that the axis moved.
Carried alongside basis and for the same reason: state what was
measured rather than render a plausible number. basis names WHOSE
acquisition paid; this names WHAT MARKET it bought.
country_code / country_name are null for a location_code
outside brand_market_service.MARKET_COUNTRIES — a market can be
persisted (or configured as the fallback default) without appearing in the
picker's catalogue. label is always populated and always renderable:
it degrades to the bare code rather than to an empty string, because the
whole point of this object is that the reader is never left guessing.
Show child attributes
Show child attributes
measured, pending_first_capture, not_eligible_unregistered, not_eligible_no_industry, not_eligible_no_competitors, capture_disabled, capture_unavailable Show child attributes
Show child attributes
Was this page helpful?