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": {
"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
},
"pagePopulationSize": 1,
"pageWindows": 1,
"pagesMeasured": 1
},
"pages": [
{
"domainCanonical": "<string>",
"pagePath": "<string>",
"windows": [
{
"evaluationDay": "2023-12-25",
"result": {
"materialLift": true,
"unmeasuredReasons": []
},
"aiEvidenceAssessment": {},
"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, 28, or 90 day request. AI-correlated lift is correlated evidence, never attributed traffic, and is never summed with measured referrals. Page details are capped while totals are uncapped. Direct-lift evaluation supports measured-page populations up to 5,000 pages; larger populations return 422 lift_population_too_large rather than partial aggregates.
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": {
"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
},
"pagePopulationSize": 1,
"pageWindows": 1,
"pagesMeasured": 1
},
"pages": [
{
"domainCanonical": "<string>",
"pagePath": "<string>",
"windows": [
{
"evaluationDay": "2023-12-25",
"result": {
"materialLift": true,
"unmeasuredReasons": []
},
"aiEvidenceAssessment": {},
"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, 28, and 90. Defaults to 28.
7, 28, 90 Maximum pages returned with their classification windows. Aggregate totals are not capped within the 5,000-page direct-lift evaluation population limit.
1 <= x <= 25