curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift"
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}/traffic/direct-lift', 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}/traffic/direct-lift",
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}/traffic/direct-lift"
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}/traffic/direct-lift")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift")
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": {
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25",
"evaluationWindowDays": 7
},
"series": [
{
"date": "2023-12-25",
"fullDirectSessions": 1,
"measuredActualDaily": 1,
"measuredBaselineDaily": 1,
"pagesMeasured": 1
}
],
"totals": {
"classificationCounts": {
"ai_correlated_lift": 1,
"unexplained_lift": 1,
"explained": 1,
"baseline": 1,
"unmeasured": 1
},
"classificationAvailability": "available",
"pagePopulationSize": 1,
"pageWindows": 1,
"pagesMeasured": 1
},
"pages": [
{
"domainCanonical": "<string>",
"pagePath": "<string>",
"windows": [
{
"evaluationDay": "2023-12-25",
"result": {
"classification": "ai_correlated_lift",
"aiEvidence": "citations",
"channelExplanation": "gsc_organic",
"materialLift": true,
"unmeasuredReasons": [
"ga4_connection"
]
},
"aiEvidenceAssessment": {
"citations": "qualifying",
"answerFetches": "qualifying"
},
"facts": {
"evaluationWindow": {
"actualDirectSessions": 1,
"baselineDirectSessions": 1,
"signedDirectLift": 123,
"priorDirectSessions": 1,
"currentWindowCoveredDays": 3,
"priorWindowCoveredDays": 3,
"evaluableBaselineBucketCount": 2,
"currentWindowEvaluable": true,
"priorWindowEvaluable": true,
"hasMeasurableBaseline": true
},
"aiEvidence": {
"citations": {
"currentWindowCount": 1,
"priorWindowCount": 1,
"currentWindowCovered": true,
"priorWindowCovered": true
},
"answerFetches": {
"currentWindowCount": 1,
"priorWindowCount": 1,
"currentWindowCovered": true,
"priorWindowCovered": true
}
},
"channels": {
"gscOrganic": {
"currentWindowCount": 1,
"priorWindowCount": 1
},
"paid": {
"currentWindowCount": 1,
"priorWindowCount": 1
},
"nonAiReferral": {
"currentWindowCount": 1,
"priorWindowCount": 1
}
},
"ga4Connection": {
"status": "<string>",
"lastSyncedAt": "2023-11-07T05:31:56Z"
},
"gscCoverage": {
"status": "<string>",
"lastSyncedAt": "2023-11-07T05:31:56Z",
"currentWindowCovered": true,
"priorWindowCovered": true
}
}
}
]
}
]
},
"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": "lift_population_too_large",
"message": "Direct-lift evaluation supports a maximum measured-page population of 5,000 pages",
"status": 422
}{
"error": "<string>",
"message": "<string>",
"status": 123
}Get AI-correlated Direct lift
Returns GA4-true project Direct totals, measured-page actual and baseline daily equivalents, and resolver-owned page-window classifications for a fixed 7, 30, or 90 day request. AI-correlated lift is correlated evidence, never attributed traffic, and is never summed with measured referrals. Property totals and population sizes remain complete. Up to 250,000 page-windows are classified per request; larger requests return classificationAvailability=population_limit, zero evaluated windows, empty page details, and unavailable lift comparisons.
curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift"
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}/traffic/direct-lift', 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}/traffic/direct-lift",
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}/traffic/direct-lift"
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}/traffic/direct-lift")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/traffic/direct-lift")
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": {
"window": {
"days": 7,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25",
"evaluationWindowDays": 7
},
"series": [
{
"date": "2023-12-25",
"fullDirectSessions": 1,
"measuredActualDaily": 1,
"measuredBaselineDaily": 1,
"pagesMeasured": 1
}
],
"totals": {
"classificationCounts": {
"ai_correlated_lift": 1,
"unexplained_lift": 1,
"explained": 1,
"baseline": 1,
"unmeasured": 1
},
"classificationAvailability": "available",
"pagePopulationSize": 1,
"pageWindows": 1,
"pagesMeasured": 1
},
"pages": [
{
"domainCanonical": "<string>",
"pagePath": "<string>",
"windows": [
{
"evaluationDay": "2023-12-25",
"result": {
"classification": "ai_correlated_lift",
"aiEvidence": "citations",
"channelExplanation": "gsc_organic",
"materialLift": true,
"unmeasuredReasons": [
"ga4_connection"
]
},
"aiEvidenceAssessment": {
"citations": "qualifying",
"answerFetches": "qualifying"
},
"facts": {
"evaluationWindow": {
"actualDirectSessions": 1,
"baselineDirectSessions": 1,
"signedDirectLift": 123,
"priorDirectSessions": 1,
"currentWindowCoveredDays": 3,
"priorWindowCoveredDays": 3,
"evaluableBaselineBucketCount": 2,
"currentWindowEvaluable": true,
"priorWindowEvaluable": true,
"hasMeasurableBaseline": true
},
"aiEvidence": {
"citations": {
"currentWindowCount": 1,
"priorWindowCount": 1,
"currentWindowCovered": true,
"priorWindowCovered": true
},
"answerFetches": {
"currentWindowCount": 1,
"priorWindowCount": 1,
"currentWindowCovered": true,
"priorWindowCovered": true
}
},
"channels": {
"gscOrganic": {
"currentWindowCount": 1,
"priorWindowCount": 1
},
"paid": {
"currentWindowCount": 1,
"priorWindowCount": 1
},
"nonAiReferral": {
"currentWindowCount": 1,
"priorWindowCount": 1
}
},
"ga4Connection": {
"status": "<string>",
"lastSyncedAt": "2023-11-07T05:31:56Z"
},
"gscCoverage": {
"status": "<string>",
"lastSyncedAt": "2023-11-07T05:31:56Z",
"currentWindowCovered": true,
"priorWindowCovered": true
}
}
}
]
}
]
},
"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": "lift_population_too_large",
"message": "Direct-lift evaluation supports a maximum measured-page population of 5,000 pages",
"status": 422
}{
"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 Maximum pages returned with their classification windows. Property totals remain complete; page details are empty when classificationAvailability is population_limit.
1 <= x <= 25