API de Oficiov1

Introducción

La API de Oficio es REST y habla JSON. Te permite hacer desde tus propios programas lo mismo que haces en el panel: dar órdenes, crear y aprobar tareas, hablar con los agentes, leer la memoria compartida y recibir eventos en tiempo real.

URL base
http://localhost:3001/api/v1
Formato
JSON en el cuerpo y en las respuestas (Content-Type: application/json).
Autenticación
Una clave de API en la cabecera Authorization.
Puerto
Por defecto 3001. Cámbialo con la variable OFICINA_PORT.

Las respuestas de escritura incluyen "ok": true junto con el recurso afectado. Los identificadores son cadenas cortas que puedes leer en las listas.

Autenticación

Genera o consulta tu clave en Ajustes, pestaña API del panel. Envíala en cada petición, de cualquiera de estas formas:

  • Authorization: Bearer <clave> (recomendada).
  • X-API-Key: <clave>
  • El parámetro ?key=<clave> (útil para el flujo de eventos desde un navegador).
curl
curl "http://localhost:3001/api/v1/health" \
  -H "Authorization: Bearer ofk_tu_clave"
Desde tu propio equipo no hace falta la clave. Las peticiones que llegan desde localhost y sin origen externo (curl, scripts locales, el propio panel) se aceptan sin ella. Desde otra máquina, siempre se exige. Si abres el servidor a tu red con OFICINA_HOST=0.0.0.0, protégelo con la clave y rótala si sospechas que se filtró (POST /settings/apikey/rotate).

Errores

Cuando algo falla, la respuesta trae un código HTTP y un cuerpo con el motivo en español:

json
{ "error": "Tarea no encontrada" }
CódigoCuándo
400Faltan datos, un valor no es válido o la operación no se puede hacer (por ejemplo, borrar un proyecto con tareas abiertas).
401Falta la clave o no es correcta.
404El recurso no existe.

Inicio rápido

En tres pasos: comprueba que el servidor responde, da una orden y mira qué tareas se crearon.

  1. Comprueba el servidor
    curl
    curl "http://localhost:3001/api/v1/health" \
      -H "Authorization: Bearer $OFICIO_KEY"
  2. Da una orden
    curl
    curl -X POST "http://localhost:3001/api/v1/command" \
      -H "Authorization: Bearer $OFICIO_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "text": "Juana, arregla el encabezado de la landing. Es urgente."
      }'
  3. Mira las tareas en revisión
    curl
    curl "http://localhost:3001/api/v1/tasks?status=review" \
      -H "Authorization: Bearer $OFICIO_KEY"

Despacho

Da una orden en lenguaje natural y el equipo la convierte en tareas.

Cuerpo de la petición

textobligatoriostringLa orden, hasta 2000 caracteres.
Si la orden es una pregunta o es ambigua, `tasks` viene vacío y `reply` contiene la respuesta.

Ejemplo

curl
curl -X POST "http://localhost:3001/api/v1/command" \
  -H "Authorization: Bearer $OFICIO_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Juana, arregla el encabezado de la landing. Es urgente."
  }'

Respuesta

json
{
  "ok": true,
  "reply": "Entendí: Juana arregla el encabezado en una rama. Creé 1 tarea.",
  "tasks": [
    {
      "id": "a1b2c3d4",
      "title": "Arreglar el encabezado de la landing",
      "description": "",
      "priority": 0,
      "status": "todo",
      "assignee": "f3a9c1d2",
      "projectId": "9b047f2f",
      "source": "api",
      "createdAt": 1791600000000
    }
  ]
}

Tareas

Crea, consulta, aprueba o devuelve trabajo.

Agentes

El equipo: contratar, ajustar permisos, pausar y conversar.

Proyectos

Las carpetas donde trabaja el equipo.

Objetivos, rutinas y clientes

Planificación y trabajo recurrente.

Automatizaciones

Scripts que corren solos y no consumen créditos de IA.

Integraciones

Accesos a servicios externos. Los valores nunca se devuelven.

Reuniones

Convoca, habla y cierra reuniones.

Oficina

La plantilla de roles y los paquetes de automatizaciones.

Memoria (Vault)

Lee y escribe las notas del equipo.

Ajustes y control

Presupuesto, pausa global, clave de API y reportes.

Eventos en tiempo real

Abre una conexión de eventos (Server-Sent Events) y recibe cada cosa que ocurre en la oficina, sin consultar una y otra vez. Cada evento llega con su tipo y un sobre { type, data, ts }.

curl
curl -N "http://localhost:3001/api/v1/stream" \
  -H "Authorization: Bearer $OFICIO_KEY"
EventoCuándo se emite
task.createdSe creó una tarea.
task.startedUn agente empezó una tarea.
task.reviewUna tarea terminó y espera tu revisión.
task.completedSe aprobó y cerró una tarea.
task.redoSe devolvió una tarea con comentarios.
task.questionUn agente te hizo una pregunta.
task.commentedHay un comentario nuevo.
task.deletedSe eliminó una tarea.
meeting.startedEmpezó una reunión.
meeting.endedTerminó una reunión y hay acta.
automation.proposedUn agente propuso una automatización.
automation.runCorrió una automatización.
integration.connectedSe conectó una integración.
objective.createdSe creó un objetivo.
objective.completedSe completó un objetivo.
agent.levelupUn agente subió de nivel.
agent.lessonUn agente registró un aprendizaje.
notificationHay una notificación nueva.

Webhooks

Si prefieres que Oficio te avise, registra una URL y recibirás un POST por cada evento que elijas. Con "*" recibes todos.

curl
curl -X POST "http://localhost:3001/api/v1/settings/webhooks" \
  -H "Authorization: Bearer $OFICIO_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://miapp.com/hooks/oficio",
    "events": [
      "task.review",
      "task.completed"
    ],
    "secret": "un-secreto-largo"
  }'

Cada llamada lleva estas cabeceras y el sobre del evento como cuerpo:

x-oficina-eventEl tipo de evento, por ejemplo task.review.
x-oficina-secretEl secreto que registraste. Compáralo para confirmar que la llamada es de tu oficina.
json
{
  "type": "task.review",
  "data": {
    "id": "a1b2c3d4",
    "title": "Arreglar el encabezado de la landing",
    "status": "review"
  },
  "ts": 1791600000000
}

Para quitar un webhook usa DELETE /settings/webhooks/:id. Los envíos no se reintentan: si tu servidor no responde, ese evento se pierde.