curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/pages/metrics \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/pages/metrics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devtune.ai/api/v2/projects/{projectId}/pages/metrics', 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://devtune.ai/api/v2/projects/{projectId}/pages/metrics",
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://devtune.ai/api/v2/projects/{projectId}/pages/metrics"
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://devtune.ai/api/v2/projects/{projectId}/pages/metrics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/pages/metrics")
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": {
"searchConsole": {
"current": {
"aggregates": {
"clicks": 123,
"impressions": 123,
"ctr": 123,
"avgPosition": 123,
"measurement": {
"availability": "unavailable",
"status": "unmeasured",
"isCurrent": true,
"asOfDate": "2023-11-07T05:31:56Z",
"explanation": "<string>",
"sourceDateFrom": "2023-12-25",
"sourceDateTo": "2023-12-25",
"finalityBoundary": "2023-12-25",
"contributors": [
{}
],
"coveredRanges": [
{
"connectionId": "<string>",
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
],
"storedEvidence": [
{}
],
"coverageFrom": "2023-12-25",
"coverageThrough": "2023-12-25"
}
},
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"prior": {
"aggregates": {
"clicks": 123,
"impressions": 123,
"ctr": 123,
"avgPosition": 123,
"measurement": {
"availability": "unavailable",
"status": "unmeasured",
"isCurrent": true,
"asOfDate": "2023-11-07T05:31:56Z",
"explanation": "<string>",
"sourceDateFrom": "2023-12-25",
"sourceDateTo": "2023-12-25",
"finalityBoundary": "2023-12-25",
"contributors": [
{}
],
"coveredRanges": [
{
"connectionId": "<string>",
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
],
"storedEvidence": [
{}
],
"coverageFrom": "2023-12-25",
"coverageThrough": "2023-12-25"
}
},
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"delta": {
"clicks": 123,
"impressions": 123
}
},
"items": [
{}
],
"pagination": {
"hasMore": true,
"nextCursor": "<string>",
"pageSize": 50,
"totalCount": 1
},
"summary": {},
"windowDays": 7
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}List unified page metrics
Returns the unified Audit page rollup. Page rows and summary are content-page subsets; searchConsole contains authoritative all-page project totals, current/prior coverage and source dates. GSC windows end at Pacific D-3. GSC columns are ranking evidence only when availability is measured or verified_zero. Partial coverage names the covered ranges; a delta requires both periods to be verified. Only 7, 30 and 90 day windows are accepted.
curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/pages/metrics \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/pages/metrics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devtune.ai/api/v2/projects/{projectId}/pages/metrics', 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://devtune.ai/api/v2/projects/{projectId}/pages/metrics",
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://devtune.ai/api/v2/projects/{projectId}/pages/metrics"
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://devtune.ai/api/v2/projects/{projectId}/pages/metrics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/pages/metrics")
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": {
"searchConsole": {
"current": {
"aggregates": {
"clicks": 123,
"impressions": 123,
"ctr": 123,
"avgPosition": 123,
"measurement": {
"availability": "unavailable",
"status": "unmeasured",
"isCurrent": true,
"asOfDate": "2023-11-07T05:31:56Z",
"explanation": "<string>",
"sourceDateFrom": "2023-12-25",
"sourceDateTo": "2023-12-25",
"finalityBoundary": "2023-12-25",
"contributors": [
{}
],
"coveredRanges": [
{
"connectionId": "<string>",
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
],
"storedEvidence": [
{}
],
"coverageFrom": "2023-12-25",
"coverageThrough": "2023-12-25"
}
},
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"prior": {
"aggregates": {
"clicks": 123,
"impressions": 123,
"ctr": 123,
"avgPosition": 123,
"measurement": {
"availability": "unavailable",
"status": "unmeasured",
"isCurrent": true,
"asOfDate": "2023-11-07T05:31:56Z",
"explanation": "<string>",
"sourceDateFrom": "2023-12-25",
"sourceDateTo": "2023-12-25",
"finalityBoundary": "2023-12-25",
"contributors": [
{}
],
"coveredRanges": [
{
"connectionId": "<string>",
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
],
"storedEvidence": [
{}
],
"coverageFrom": "2023-12-25",
"coverageThrough": "2023-12-25"
}
},
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"delta": {
"clicks": 123,
"impressions": 123
}
},
"items": [
{}
],
"pagination": {
"hasMore": true,
"nextCursor": "<string>",
"pageSize": 50,
"totalCount": 1
},
"summary": {},
"windowDays": 7
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}{
"error": "<string>",
"message": "<string>",
"status": 123
}Authorizations
API key with dtk_live_ prefix. Obtain it from API Keys in the account sidebar. New keys start with all supported scopes selected for the chosen project, and you can narrow them to specific read/write scopes as needed.
Path Parameters
Query Parameters
Fixed rolling window in days. Supported values are 7, 30, and 90. Defaults to 30.
7, 30, 90 Opaque cursor from the previous response.
Results per page. Capped at 100.
1 <= x <= 100asc, desc