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"
}Agregar una tarea (borrador o plan gestionado)
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"
}Autorizaciones
Clave de API de la empresa. Obtenla desde tu panel de Woku en Configuracion > API Keys. La misma clave usada para los endpoints v0.
Parámetros de ruta
ObjectId de MongoDB del plan de accion.
^[0-9a-fA-F]{24}$Cuerpo
160Respuesta
Tarea agregada; devuelve el plan completo actualizado
"507f1f77bcf86cd799439041"
200Lo que dijeron los clientes (sintesis narrativa, sin numeros inventados).
Tema detectado que aborda el plan (por ejemplo "Demoras en despacho").
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Fuentes de VoC con evidencia en el alcance congelado.
woku, nps, csat, ces in_progress/completed son el ciclo de vida gestionado (in-house); el resto aplica a planes enviados a una herramienta externa o en espera de aprobacion.
draft, approved, sent, canceled, delivery_error, in_progress, completed Prioridad determinista (calculada por el motor); nunca la define el LLM.
high, medium, low Snapshot de evidencia congelado: el alcance analitico exacto al momento de la generacion mas conteos deterministas. Nunca se recalcula despues de la generacion.
Show child attributes
Show child attributes
Trazabilidad de la ejecucion del LLM que redacto el plan.
Show child attributes
Show child attributes
Estado de entrega, completado cuando un plan se gestiona dentro de woku. provider es internal.
Show child attributes
Show child attributes
Se sella cuando un plan gestionado se cierra (estado completed).