Tableros Kanban
Explorá espacios de trabajo, listá tableros, inspeccioná la configuración de un tablero y recuperá las tareas asociadas a un tablero.
Todos los endpoints de esta página requieren un token JWT válido, una clave de API y el encabezado tenant. Consultá Autenticación para más detalles.
Listar espacios de trabajo
Recuperá una lista paginada de espacios de trabajo Kanban disponibles para el usuario autenticado.
/apidev/v1/kanban/workspacesEncabezados de la solicitud
Every request to a protected endpoint requires these headers:
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer token obtained from the Login endpoint. Format: Bearer <token> |
X-API-Key | Yes | Company integration key provided during onboarding. Format: gtk_xxx... |
tenant | Yes | Your assigned tenant domain (default: geotareas.com) — always send your assigned tenant |
Content-Type | Conditional | application/json — required for POST and PUT requests |
Parámetros de consulta
| Parámetro | Tipo | Obligatorio | Por defecto | Restricciones | Descripción |
|---|---|---|---|---|---|
limit | integer | No | 25 | Mín 1, Máx 100 | Registros por página |
offset | integer | No | 0 | ≥ 0 | Registros a omitir |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único del espacio de trabajo (BigInt) |
name | string | Nombre visible del espacio de trabajo |
description | string | null | Descripción opcional |
boards_count | integer | Cantidad de tableros en este espacio de trabajo |
role | string | Rol del usuario autenticado en el espacio de trabajo |
created_at | string | Marca de tiempo ISO 8601 |
Ejemplos de código
- cURL
- JavaScript
- Python
curl -s -X GET "$TENANT_URL/apidev/v1/kanban/workspaces?limit=10" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/workspaces?limit=10`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
},
}
);
const { data, meta } = await response.json();
console.log(`Fetched ${data.length} of ${meta.total} workspaces`);
import requests
response = requests.get(
f"{TENANT_URL}/apidev/v1/kanban/workspaces",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
params={"limit": 10},
)
result = response.json()
for ws in result["data"]:
print(f"{ws['id']}: {ws['name']} ({ws['boards_count']} boards)")
Ejemplo de respuesta
{
"success": true,
"data": [
{
"id": "7284917284917284",
"name": "Operations",
"description": "Main operations workspace for field teams.",
"boards_count": 4,
"role": "admin",
"created_at": "2025-09-01T10:00:00"
}
],
"meta": {
"total": 3,
"limit": 10,
"offset": 0
}
}
Encabezados del límite de solicitudes
Every response includes rate limit information in the headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum number of requests allowed in the current window |
X-RateLimit-Remaining | Number of requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the current window resets |
Retry-After | Seconds to wait before retrying (only present on 429 responses) |
X-Request-Id | Unique request identifier for debugging and support tickets |
Listar tableros
Recuperá una lista paginada de tableros Kanban. Opcionalmente, filtrá por espacio de trabajo o por tipo.
/apidev/v1/kanban/boardsParámetros de consulta
| Parámetro | Tipo | Obligatorio | Por defecto | Restricciones | Descripción |
|---|---|---|---|---|---|
limit | integer | No | 25 | Mín 1, Máx 100 | Registros por página |
offset | integer | No | 0 | ≥ 0 | Registros a omitir |
workspace_id | string | No | — | Longitud máxima 30 | Filtrar por ID de espacio de trabajo |
type | string | No | — | tasks o custom | Filtrar por tipo de tablero |
El valor de type no distingue mayúsculas de minúsculas — el servidor lo convierte a minúsculas antes de comparar, por lo que Tasks y TASKS funcionan igual que tasks.
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único del tablero (BigInt) |
name | string | Nombre visible del tablero |
description | string | null | Descripción opcional |
type | string | Tipo de tablero: tasks o custom |
workspace_id | string | ID del espacio de trabajo padre (BigInt) |
workspace_name | string | Nombre del espacio de trabajo padre |
is_default | boolean | Si este es el tablero por defecto |
column_count | integer | Cantidad de columnas configuradas |
status | string | Estado del tablero |
created_at | string | Marca de tiempo ISO 8601 |
Ejemplos de código
- cURL
- JavaScript
- Python
curl -s -X GET "$TENANT_URL/apidev/v1/kanban/boards?workspace_id=7284917284917284&type=tasks&limit=10" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/boards?workspace_id=7284917284917284&type=tasks&limit=10`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
},
}
);
const { data, meta } = await response.json();
console.log(`Fetched ${data.length} of ${meta.total} boards`);
import requests
response = requests.get(
f"{TENANT_URL}/apidev/v1/kanban/boards",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
params={"workspace_id": "7284917284917284", "type": "tasks", "limit": 10},
)
result = response.json()
for board in result["data"]:
print(f"{board['id']}: {board['name']} ({board['column_count']} columns)")
Ejemplo de respuesta
{
"success": true,
"data": [
{
"id": "8391728491728491",
"name": "Field Installations",
"description": "Track field installation tasks from scheduling to completion.",
"type": "tasks",
"workspace_id": "7284917284917284",
"workspace_name": "Operations",
"is_default": false,
"column_count": 5,
"status": "active",
"created_at": "2025-09-05T11:00:00"
}
],
"meta": {
"total": 4,
"limit": 10,
"offset": 0
}
}
Detalle del tablero
Recuperá la configuración completa de un único tablero, incluyendo sus columnas y campos personalizados.
/apidev/v1/kanban/boards/{id}Parámetros de ruta
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id | string | Sí | Identificador único del tablero (BigInt) |
Respuesta
Devuelve los mismos campos de nivel superior que Listar tableros, más:
| Campo | Tipo | Descripción |
|---|---|---|
columns | array | Lista ordenada de columnas (ver abajo) |
custom_fields | array | Definiciones de campos personalizados (ver abajo) |
columns[]:
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único de la columna (BigInt) |
name | string | Nombre visible de la columna |
color | string | null | Código de color hexadecimal |
order | integer | Posición en el tablero |
status_codes | string[] | Códigos de estado de tarea mapeados a esta columna |
wip_limit | integer | null | Límite de trabajo en curso (null = ilimitado) |
custom_fields[]:
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único del campo (BigInt) |
name | string | Nombre visible del campo |
type | string | Tipo de campo (text, number, date, select) |
options | string[] | null | Opciones disponibles para el tipo select |
Ejemplos de código
- cURL
- JavaScript
- Python
curl -s -X GET "$TENANT_URL/apidev/v1/kanban/boards/8391728491728491" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/boards/8391728491728491`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
},
}
);
const { data } = await response.json();
console.log(`Board "${data.name}" has ${data.columns.length} columns`);
import requests
response = requests.get(
f"{TENANT_URL}/apidev/v1/kanban/boards/8391728491728491",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
)
board = response.json()["data"]
for col in board["columns"]:
print(f" [{col['order']}] {col['name']} — status_codes: {col['status_codes']}")
Ejemplo de respuesta
{
"success": true,
"data": {
"id": "8391728491728491",
"name": "Field Installations",
"description": "Track field installation tasks from scheduling to completion.",
"type": "tasks",
"workspace_id": "7284917284917284",
"workspace_name": "Operations",
"is_default": false,
"columns": [
{
"id": "9100000000000001",
"name": "Backlog",
"color": "#6B7280",
"order": 1,
"status_codes": ["SA"],
"wip_limit": null
},
{
"id": "9100000000000002",
"name": "In Progress",
"color": "#3B82F6",
"order": 2,
"status_codes": ["ASI", "ACE", "INI"],
"wip_limit": 10
},
{
"id": "9100000000000003",
"name": "Done",
"color": "#10B981",
"order": 3,
"status_codes": ["FIN"],
"wip_limit": null
}
],
"custom_fields": [
{
"id": "6200000000000001",
"name": "Region",
"type": "select",
"options": ["North", "South", "East", "West"]
}
]
},
"meta": {}
}
Tareas del tablero
Recuperá las tareas agrupadas por columna para un tablero específico.
/apidev/v1/kanban/boards/{id}/tasksParámetros de ruta
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id | string | Sí | Identificador único del tablero (BigInt) |
Parámetros de consulta
| Parámetro | Tipo | Obligatorio | Por defecto | Restricciones | Descripción |
|---|---|---|---|---|---|
status | string | No | — | Longitud máxima 50 | Filtrar por código de estado de tarea |
search | string | No | — | Longitud máxima 120 | Buscar por título o número de tarea |
driver_id | string | No | — | Longitud máxima 30 | Filtrar por ID de conductor (BigInt) |
client_id | string | No | — | Longitud máxima 30 | Filtrar por ID de cliente (BigInt) |
priority | string | No | — | Longitud máxima 20 | Filtrar por nivel de prioridad |
Respuesta
| Campo | Tipo | Descripción |
|---|---|---|
board_id | string | ID del tablero (BigInt) |
columns | array | Columnas con sus tareas (ver abajo) |
total_tasks | integer | Total de tareas en todas las columnas |
timestamp | string | Marca de tiempo ISO 8601 de la instantánea |
columns[]:
| Campo | Tipo | Descripción |
|---|---|---|
id | string | ID de la columna (BigInt) |
name | string | Nombre visible de la columna |
tasks | array | Tareas en esta columna (ver abajo) |
task_count | integer | Cantidad de tareas en esta columna |
columns[].tasks[]:
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único de la tarea (BigInt) |
number | string | Número visible de la tarea |
status | string | Código de estado actual de la tarea |
title | string | Título de la tarea |
client_name | string | null | Nombre del cliente |
account_name | string | null | Nombre de la cuenta |
driver_name | string | null | Nombre del conductor asignado |
priority | string | Nivel de prioridad |
scheduled_at | string | null | Fecha programada (ISO 8601) |
created_at | string | Marca de tiempo de creación (ISO 8601) |
delay_minutes | integer | null | Minutos de retraso (null si está a tiempo) |
Ejemplos de código
- cURL
- JavaScript
- Python
curl -s -X GET "$TENANT_URL/apidev/v1/kanban/boards/8391728491728491/tasks?status=INI" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
const response = await fetch(
`${TENANT_URL}/apidev/v1/kanban/boards/8391728491728491/tasks?status=INI`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`,
"X-API-Key": APIKEY,
"tenant": TENANT,
},
}
);
const { data } = await response.json();
console.log(`Board has ${data.total_tasks} tasks across ${data.columns.length} columns`);
import requests
response = requests.get(
f"{TENANT_URL}/apidev/v1/kanban/boards/8391728491728491/tasks",
headers={
"Authorization": f"Bearer {TOKEN}",
"X-API-Key": APIKEY,
"tenant": TENANT,
},
params={"status": "INI"},
)
result = response.json()["data"]
for col in result["columns"]:
print(f"{col['name']}: {col['task_count']} tasks")
for task in col["tasks"]:
print(f" - {task['number']} {task['title']} [{task['status']}]")
Ejemplo de respuesta
{
"success": true,
"data": {
"board_id": "8391728491728491",
"columns": [
{
"id": "9100000000000002",
"name": "In Progress",
"tasks": [
{
"id": "5001847291847291",
"number": "T-2026-00142",
"status": "INI",
"title": "Install GPS device at warehouse #7",
"client_name": "Acme Corp",
"account_name": "Warehouse District 7",
"driver_name": "Carlos Mendoza",
"priority": "high",
"scheduled_at": "2026-03-25T18:00:00",
"created_at": "2026-03-10T09:00:00",
"delay_minutes": 45
}
],
"task_count": 1
}
],
"total_tasks": 47,
"timestamp": "2026-03-19T16:45:00"
},
"meta": {}
}
Errores
| Código | HTTP | Descripción |
|---|---|---|
VALIDATION_ERROR | 400 | Parámetros de consulta inválidos |
UNAUTHORIZED | 401 | tenant / Authorization / X-API-Key ausente, inválido o expirado |
FORBIDDEN | 403 | El usuario no tiene el permiso requerido |
NOT_FOUND | 404 | Recurso no encontrado |
RATE_LIMITED | 429 | Se superó el límite de solicitudes |
INTERNAL_ERROR | 500 | Error inesperado del servidor |