curl --request PATCH \
--url https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"orderedTaskIds": [
"507f1f77bcf86cd799439052",
"507f1f77bcf86cd799439051"
]
}
'import requests
url = "https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder"
payload = { "orderedTaskIds": ["507f1f77bcf86cd799439052", "507f1f77bcf86cd799439051"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({orderedTaskIds: ['507f1f77bcf86cd799439052', '507f1f77bcf86cd799439051']})
};
fetch('https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder', 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://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'orderedTaskIds' => [
'507f1f77bcf86cd799439052',
'507f1f77bcf86cd799439051'
]
]),
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://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder"
payload := strings.NewReader("{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"_id": "507f1f77bcf86cd799439041",
"companyId": "<string>",
"groupId": "<string>",
"title": "<string>",
"summary": "<string>",
"objective": "<string>",
"expectedImpact": "<string>",
"theme": "<string>",
"tasks": [
{
"_id": "507f1f77bcf86cd799439051",
"text": "<string>",
"order": 123,
"status": "todo",
"assigneeId": "<string>",
"completedAt": "2023-11-07T05:31:56Z"
}
],
"patterns": [
{
"key": "<string>",
"label": "<string>",
"mentions": 123
}
],
"sources": [
"woku"
],
"status": "draft",
"priority": "high",
"evidence": {
"windowFrom": "2023-11-07T05:31:56Z",
"windowTo": "2023-11-07T05:31:56Z",
"conditionsSnapshot": [
{
"trackerId": "507f1f77bcf86cd799439011",
"relationToPrevious": "AND",
"operator": "equals",
"value": "<string>"
}
],
"negatives": 123,
"positives": 123,
"total": 123,
"quotes": [
{
"text": "<string>",
"source": "woku",
"contextLabel": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"score": 123
}
]
},
"generation": {
"model": "<string>",
"promptVersion": "<string>",
"generatedAt": "2023-11-07T05:31:56Z"
},
"delivery": {
"provider": "internal",
"resourceLabel": "<string>",
"externalUrl": "<string>",
"externalId": "<string>",
"tasksCreated": 123,
"lastError": "<string>",
"sentAt": "2023-11-07T05:31:56Z",
"sentBy": "<string>"
},
"approvedBy": "<string>",
"approvedAt": "2023-11-07T05:31:56Z",
"canceledBy": "<string>",
"canceledAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"aiGenerated": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"statusCode": 400,
"message": "<string>",
"error": "Bad Request"
}{
"statusCode": 403,
"message": "Authentication required",
"error": "Forbidden"
}{
"statusCode": 404,
"message": "External tracker not found",
"error": "Not Found"
}{
"statusCode": 409,
"message": "Cannot approve a plan in status \"approved\"",
"error": "Conflict"
}Reorder tasks (draft or managed plan)
curl --request PATCH \
--url https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"orderedTaskIds": [
"507f1f77bcf86cd799439052",
"507f1f77bcf86cd799439051"
]
}
'import requests
url = "https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder"
payload = { "orderedTaskIds": ["507f1f77bcf86cd799439052", "507f1f77bcf86cd799439051"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({orderedTaskIds: ['507f1f77bcf86cd799439052', '507f1f77bcf86cd799439051']})
};
fetch('https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder', 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://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'orderedTaskIds' => [
'507f1f77bcf86cd799439052',
'507f1f77bcf86cd799439051'
]
]),
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://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder"
payload := strings.NewReader("{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/action-plans/{id}/tasks/reorder")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"orderedTaskIds\": [\n \"507f1f77bcf86cd799439052\",\n \"507f1f77bcf86cd799439051\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"_id": "507f1f77bcf86cd799439041",
"companyId": "<string>",
"groupId": "<string>",
"title": "<string>",
"summary": "<string>",
"objective": "<string>",
"expectedImpact": "<string>",
"theme": "<string>",
"tasks": [
{
"_id": "507f1f77bcf86cd799439051",
"text": "<string>",
"order": 123,
"status": "todo",
"assigneeId": "<string>",
"completedAt": "2023-11-07T05:31:56Z"
}
],
"patterns": [
{
"key": "<string>",
"label": "<string>",
"mentions": 123
}
],
"sources": [
"woku"
],
"status": "draft",
"priority": "high",
"evidence": {
"windowFrom": "2023-11-07T05:31:56Z",
"windowTo": "2023-11-07T05:31:56Z",
"conditionsSnapshot": [
{
"trackerId": "507f1f77bcf86cd799439011",
"relationToPrevious": "AND",
"operator": "equals",
"value": "<string>"
}
],
"negatives": 123,
"positives": 123,
"total": 123,
"quotes": [
{
"text": "<string>",
"source": "woku",
"contextLabel": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"score": 123
}
]
},
"generation": {
"model": "<string>",
"promptVersion": "<string>",
"generatedAt": "2023-11-07T05:31:56Z"
},
"delivery": {
"provider": "internal",
"resourceLabel": "<string>",
"externalUrl": "<string>",
"externalId": "<string>",
"tasksCreated": 123,
"lastError": "<string>",
"sentAt": "2023-11-07T05:31:56Z",
"sentBy": "<string>"
},
"approvedBy": "<string>",
"approvedAt": "2023-11-07T05:31:56Z",
"canceledBy": "<string>",
"canceledAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"aiGenerated": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"statusCode": 400,
"message": "<string>",
"error": "Bad Request"
}{
"statusCode": 403,
"message": "Authentication required",
"error": "Forbidden"
}{
"statusCode": 404,
"message": "External tracker not found",
"error": "Not Found"
}{
"statusCode": 409,
"message": "Cannot approve a plan in status \"approved\"",
"error": "Conflict"
}Authorizations
Company API key. Obtain this from your Woku dashboard under Settings > API Keys. The same key used for the v0 endpoints.
Path Parameters
MongoDB ObjectId of the action plan.
^[0-9a-fA-F]{24}$Body
ALL task ids of the plan in the desired order (a permutation of the current ids).
1 - 100 elementsResponse
Tasks reordered; returns the full updated plan
"507f1f77bcf86cd799439041"
200What the customers said (narrative synthesis, no invented numbers).
Detected theme the plan addresses (e.g. "Demoras en despacho").
Show child attributes
Show child attributes
Show child attributes
Show child attributes
VoC sources with evidence in the frozen scope.
woku, nps, csat, ces in_progress/completed are the managed (in-house) lifecycle; the rest apply to plans sent to an external tool or awaiting approval.
draft, approved, sent, canceled, delivery_error, in_progress, completed Deterministic (engine-computed) priority; never set by the LLM.
high, medium, low Frozen evidence snapshot: the exact analytical scope at generation time plus deterministic counts. Never recomputed after generation.
Show child attributes
Show child attributes
Traceability of the LLM run that drafted the plan.
Show child attributes
Show child attributes
Delivery state, filled when a plan is managed inside woku. provider is internal.
Show child attributes
Show child attributes
Stamped when a managed plan is closed (status completed).