Batch-plans items into a cycle. All-or-nothing: if any item fails validation, none are saved.
curl --request POST \
--url https://{install}/api/plan/{boardId}/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cycleId": "<string>",
"items": [
{
"itemId": "<string>",
"resourceId": "<string>"
}
]
}
'import requests
url = "https://{install}/api/plan/{boardId}/batch"
payload = {
"cycleId": "<string>",
"items": [
{
"itemId": "<string>",
"resourceId": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({cycleId: '<string>', items: [{itemId: '<string>', resourceId: '<string>'}]})
};
fetch('https://{install}/api/plan/{boardId}/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://{install}/api/plan/{boardId}/batch");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{install}/api/plan/{boardId}/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cycleId' => '<string>',
'items' => [
[
'itemId' => '<string>',
'resourceId' => '<string>'
]
]
]),
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://{install}/api/plan/{boardId}/batch"
payload := strings.NewReader("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://{install}/api/plan/{boardId}/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{install}/api/plan/{boardId}/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"planned": 123,
"cycleId": "<string>",
"errors": [
{
"itemId": "<string>",
"reason": "<string>"
}
]
}Planning
Batch-plans items into a cycle. All-or-nothing: if any item fails validation, none are saved.
POST
/
api
/
plan
/
{boardId}
/
batch
Batch-plans items into a cycle. All-or-nothing: if any item fails validation, none are saved.
curl --request POST \
--url https://{install}/api/plan/{boardId}/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cycleId": "<string>",
"items": [
{
"itemId": "<string>",
"resourceId": "<string>"
}
]
}
'import requests
url = "https://{install}/api/plan/{boardId}/batch"
payload = {
"cycleId": "<string>",
"items": [
{
"itemId": "<string>",
"resourceId": "<string>"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({cycleId: '<string>', items: [{itemId: '<string>', resourceId: '<string>'}]})
};
fetch('https://{install}/api/plan/{boardId}/batch', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://{install}/api/plan/{boardId}/batch");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{install}/api/plan/{boardId}/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'cycleId' => '<string>',
'items' => [
[
'itemId' => '<string>',
'resourceId' => '<string>'
]
]
]),
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://{install}/api/plan/{boardId}/batch"
payload := strings.NewReader("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", 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.post("https://{install}/api/plan/{boardId}/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{install}/api/plan/{boardId}/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cycleId\": \"<string>\",\n \"items\": [\n {\n \"itemId\": \"<string>\",\n \"resourceId\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"planned": 123,
"cycleId": "<string>",
"errors": [
{
"itemId": "<string>",
"reason": "<string>"
}
]
}Authorizations
JWT Bearer token. Obtain via the OAuth 2.0 token endpoint.
Path Parameters
The board ID.
Body
application/jsonapplication/*+json
Cycle ID and list of items to plan.
NOT USED: Auto-schedule frontend has been removed as part of the Board Revamp.
This endpoint is retained for potential future use.
Suggests optimal resource assignments for backlog items using greedy capacity balancing.
Read-only — does not mutate data.
Previous
Moves an item from one cycle to another within the same board.
Updates ordering in both source and target cycles.
Next
⌘I