curl --request PUT \
--url https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quote_token": "<string>",
"max_credits": 2
}
'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule"
payload = {
"quote_token": "<string>",
"max_credits": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({quote_token: '<string>', max_credits: 2})
};
fetch('https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule', 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}/agent-picks/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'quote_token' => '<string>',
'max_credits' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule"
payload := strings.NewReader("{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"cadence": "off",
"next_run_at": "2023-11-07T05:31:56Z"
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}Enable Agent Picks schedule
Enable or change the cadence: daily at midnight UTC, weekly on Monday, or monthly on the first. Quote with schedule set to the same cadence first, then pass cadence, its quote_token and max_credits, the most one scheduled run may reserve. Saving uses the token in the same transaction, so it works once: reusing it is refused as 409 quote_token_used, also after the schedule is turned off or the setup is cleared and recreated. Refusals carry a reason: 400 quote_token_invalid (another credential, project, purpose or cadence), quote_token_expired, unpriced_model (a saved model has lost its price since the quote; choose models again), setup_required and the quote refusals; 403 forbidden or paused; 409 estimate_changed, over_max_credits or quote_token_used. The confirmed high estimate is saved. Each run reserves its fresh quote at or below it, or skips as estimate_changed until re-confirmed. Insufficient credits skip that period and email the owner. Never auto-charges. When enabled, periods more than one cadence interval overdue advance without a catch-up test. The OAuth member, or the member who created the API key, needs devtune.manage on the account and edit rights on the project. Requires Agent Picks. Not available in MCP code mode. A body that is not valid JSON, or an empty body, is refused with 400 bad_request and no reason.
curl --request PUT \
--url https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"quote_token": "<string>",
"max_credits": 2
}
'import requests
url = "https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule"
payload = {
"quote_token": "<string>",
"max_credits": 2
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({quote_token: '<string>', max_credits: 2})
};
fetch('https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule', 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}/agent-picks/schedule",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'quote_token' => '<string>',
'max_credits' => 2
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule"
payload := strings.NewReader("{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://devtune.ai/api/v2/projects/{projectId}/agent-picks/schedule")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"quote_token\": \"<string>\",\n \"max_credits\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"cadence": "off",
"next_run_at": "2023-11-07T05:31:56Z"
},
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}{
"error": "<string>",
"message": "<string>",
"status": 123,
"reason": "<string>",
"details": {}
}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.