curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works"
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}/intelligence/what-works', 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}/intelligence/what-works",
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}/intelligence/what-works"
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}/intelligence/what-works")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works")
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": {
"recommendations": [
{
"recommendation": "<string>",
"channel": "<string>",
"sampleSize": 123,
"avgImpactScore": 123,
"avgMeasuredEffect": 123,
"lastCorrelatedAt": "2023-11-07T05:31:56Z"
}
],
"hasCorrelatedData": true,
"emptyState": {
"reason": "no_marked_interventions",
"message": "<string>",
"requirements": [
"<string>"
],
"counts": {
"markedInterventions": 123,
"correlatedInterventions": 123,
"recentEligibleCorrelations": 123
}
},
"window": {
"days": 123,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"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
}Get what-works recommendations
Returns channel evidence from canonical closed 14-day wins, using usable citation rollups or closed answer-fetch comparisons. The reporting window selects when results became available. Open, non-winning and unmeasured results are excluded. sampleSize counts winning interventions per channel, not all attempts. hasCorrelatedData indicates eligible closed wins; lastCorrelatedAt is the latest result availability time. Legacy averages discount directional confidence and blend citation and answer-fetch dimensions; avgMeasuredEffect has mixed units and is not citation lift. This before/after evidence does not establish causation. Empty evidence returns an empty recommendations array and an explanatory emptyState backed by the canonical scoreboard. Empty-state counts are scoped to actions completed in the reporting window: markedInterventions counts that cohort and correlatedInterventions counts its conclusive outcomes, including losses. These counts do not describe all project history or use the recommendation result-availability date. recentEligibleCorrelations is zero when no eligible wins fall in the window.
curl --request GET \
--url https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works \
--header 'Authorization: Bearer <token>'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works"
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}/intelligence/what-works', 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}/intelligence/what-works",
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}/intelligence/what-works"
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}/intelligence/what-works")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/intelligence/what-works")
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": {
"recommendations": [
{
"recommendation": "<string>",
"channel": "<string>",
"sampleSize": 123,
"avgImpactScore": 123,
"avgMeasuredEffect": 123,
"lastCorrelatedAt": "2023-11-07T05:31:56Z"
}
],
"hasCorrelatedData": true,
"emptyState": {
"reason": "no_marked_interventions",
"message": "<string>",
"requirements": [
"<string>"
],
"counts": {
"markedInterventions": 123,
"correlatedInterventions": 123,
"recentEligibleCorrelations": 123
}
},
"window": {
"days": 123,
"dateFrom": "2023-12-25",
"dateTo": "2023-12-25"
}
},
"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
}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 30 and 90. Defaults to 30.
30, 90 1 <= x <= 20