curl --request GET \
--url https://api.highseat.com/v1/sites/{site}/sources \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.highseat.com/v1/sites/{site}/sources"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.highseat.com/v1/sites/{site}/sources', 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.highseat.com/v1/sites/{site}/sources",
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.highseat.com/v1/sites/{site}/sources"
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.highseat.com/v1/sites/{site}/sources")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.highseat.com/v1/sites/{site}/sources")
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": [
{
"name": "<string>",
"visitors": 4503599627370495,
"conversionRate": 123,
"bounceRate": 123,
"avgDuration": 123,
"revenue": 123,
"orders": 123,
"domain": "<string>",
"pageviews": 4503599627370495
}
],
"nextCursor": "<string>",
"meta": {
"timezone": "<string>",
"currency": "<string>",
"range": {
"from": "<string>",
"to": "<string>"
},
"compare": {
"from": "<string>",
"to": "<string>"
}
},
"importedExcluded": true
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}Traffic sources
Traffic sources in the range, largest first. A list: { data, nextCursor, meta }. Walk it by passing nextCursor as cursor; the last page answers nextCursor: null. limit is the page size (1–500, default 20), not a cap on the whole list. Reuse a cursor only with the same site, range, filters and view. Row revenue is attributed by the site’s attribution model and lookback, with its thank-you pages excluded, the same as the dashboard’s.
curl --request GET \
--url https://api.highseat.com/v1/sites/{site}/sources \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.highseat.com/v1/sites/{site}/sources"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.highseat.com/v1/sites/{site}/sources', 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.highseat.com/v1/sites/{site}/sources",
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.highseat.com/v1/sites/{site}/sources"
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.highseat.com/v1/sites/{site}/sources")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.highseat.com/v1/sites/{site}/sources")
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": [
{
"name": "<string>",
"visitors": 4503599627370495,
"conversionRate": 123,
"bounceRate": 123,
"avgDuration": 123,
"revenue": 123,
"orders": 123,
"domain": "<string>",
"pageviews": 4503599627370495
}
],
"nextCursor": "<string>",
"meta": {
"timezone": "<string>",
"currency": "<string>",
"range": {
"from": "<string>",
"to": "<string>"
},
"compare": {
"from": "<string>",
"to": "<string>"
}
},
"importedExcluded": true
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"issues": [
{
"path": [
"<string>"
],
"message": "<string>"
}
]
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The site: its domain as registered (example.com), or its site id.
Query Parameters
The range: a calendar unit (day, week, month, year) positioned by date; a window ending now as a count and unit, m h d w mo (30m, 24h, 7d, 2w, 3mo); all; or custom, which reads from and to. Defaults to 7d.
day, week, month, year, all, custom Which day/week/month/year a unit preset refers to, YYYY-MM-DD in the site's timezone. Omitted means the current one.
^\d{4}-\d{2}-\d{2}$First day of a custom range, YYYY-MM-DD, inclusive.
^\d{4}-\d{2}-\d{2}$Last day of a custom range, YYYY-MM-DD, inclusive.
^\d{4}-\d{2}-\d{2}$Repeatable filter, written dimension[.key]:operator:value. Only the first two colons separate, so values may contain them. Dimensions: page_path, entry_page, exit_page, hostname, country, region, city, browser, os, device_type, referrer_source, referrer_domain, referrer_channel, utm_source, utm_medium, utm_campaign, utm_content, utm_term, event_name, goal, property (property and goal take a key). Operators: is, is_not, contains; country, region, goal take is and is_not only. A region takes the name the locations report gives it, an ISO 3166-2 code (region:is:DE-BY). Examples: filter=country:is:DE, filter=property.plan:is:pro. Repeat the parameter to combine filters; they all have to match.
1200Page size, largest first. 1–500, default 20. Not a cap on the whole list.
1 <= x <= 500Opaque cursor from the previous page's nextCursor. Omit for the first page (largest rows). Reuse it only with the same site, range, filters and tab/dimension. The last page answers nextCursor: null.
1 - 8192Which grouping: referrers (the source itself) or channels (search, social, AI, …).
referrers, channels Response
OK
Show child attributes
Show child attributes
Null on the last page.
Show child attributes
Show child attributes
True when the range holds days imported from another tool that these figures leave out: a filter or a breakdown the imported daily totals cannot answer.