curl --request POST \
--url https://clientapi.woku.app/v1/action-plans/{id}/tasks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Llamar al cliente para coordinar el retiro."
}
'import requests
url = "https://clientapi.woku.app/v1/action-plans/{id}/tasks"
payload = { "text": "Llamar al cliente para coordinar el retiro." }
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({text: 'Llamar al cliente para coordinar el retiro.'})
};
fetch('https://clientapi.woku.app/v1/action-plans/{id}/tasks', 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",
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([
'text' => 'Llamar al cliente para coordinar el retiro.'
]),
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"
payload := strings.NewReader("{\n \"text\": \"Llamar al cliente para coordinar el retiro.\"\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://clientapi.woku.app/v1/action-plans/{id}/tasks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Llamar al cliente para coordinar el retiro.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/action-plans/{id}/tasks")
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 \"text\": \"Llamar al cliente para coordinar el retiro.\"\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"
}Add a task (draft or managed plan)
curl --request POST \
--url https://clientapi.woku.app/v1/action-plans/{id}/tasks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"text": "Llamar al cliente para coordinar el retiro."
}
'import requests
url = "https://clientapi.woku.app/v1/action-plans/{id}/tasks"
payload = { "text": "Llamar al cliente para coordinar el retiro." }
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({text: 'Llamar al cliente para coordinar el retiro.'})
};
fetch('https://clientapi.woku.app/v1/action-plans/{id}/tasks', 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",
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([
'text' => 'Llamar al cliente para coordinar el retiro.'
]),
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"
payload := strings.NewReader("{\n \"text\": \"Llamar al cliente para coordinar el retiro.\"\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://clientapi.woku.app/v1/action-plans/{id}/tasks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"text\": \"Llamar al cliente para coordinar el retiro.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/action-plans/{id}/tasks")
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 \"text\": \"Llamar al cliente para coordinar el retiro.\"\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
160Response
Task added; 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).