Autenticación y scopes para Plan
Qué credenciales llegan a la API de Dailybot Plan (Beta): sesiones, API keys personales que actúan como su persona, keys de agente y de la organización, scopes, invitados y privacidad.
Beta
Plan está en beta. Todo lo que está bajo /plan en la aplicación web, los comandos del CLI y de la agent skill para proyectos, objetivos, tableros y tareas, y la API pública /v1/plan/ puede cambiar antes de la disponibilidad general. ¿Quieres probarlo con tu equipo? Escribe a [email protected].
La API de Plan acepta tres credenciales. Se comportan distinto, así que elige la que corresponda a quien actúa. Las reglas generales de toda la API de Dailybot están en Autenticación y Autenticación del CLI; esta página cubre lo específico de Plan.
Tres credenciales
| Credencial | Cómo se envía | Actúa como | Úsala para |
|---|---|---|---|
| Sesión iniciada | Authorization: Bearer <token> (la app web, o dailybot login para el CLI) |
Tú, con tu rol | La app web de Dailybot, y scripts y agentes que trabajan en nombre de una persona |
| API key personal | X-API-KEY: <key> |
La persona que la creó, para sí misma | Scripts, CI y agentes que deben ser esa persona |
| Key de agente o de la organización | X-API-KEY: <key> |
Un actor del sistema: sin una persona detrás | Integraciones servidor a servidor que leen o escriben trabajo visible para la organización |
Sesión iniciada: actúa como tú
Una sesión iniciada lleva tu identidad y tu rol en la organización. dailybot login obtiene una con un código de un solo uso enviado por correo; el mismo flujo está disponible por HTTP (consulta el inicio rápido). Un token de login solo viaja al host de la API que lo emitió.
curl -sS "https://api.dailybot.com/v1/plan/me/tasks/" \
-H "Authorization: Bearer $DAILYBOT_TOKEN"
API key personal: actúa como su persona
Una API key personal la crea una persona para sí misma. En Plan responde exactamente como esa persona en la app web:
- Ve lo que ve la persona, incluidos los tableros privados a los que pertenece.
mees la persona, y cada escritura se registra como la persona. - Puede hacer todo lo que la persona puede hacer en cada endpoint de Plan: todas las lecturas y todas las escrituras de tareas, y todas las escrituras de estructura y membresías: proyectos, tableros, columnas, objetivos, hitos, miembros (por usuario o equipo), participantes, silenciar, vistas guardadas y adjuntos.
- No hay prerrequisito de administrador de la organización ni scope que pedir: todo miembro no invitado puede, así que su key también.
- Una key cuya fila lleva scopes
tasks:*explícitos tiene un techo que eligió la persona:tasks:writecubre también las operaciones de administración, ytasks:readdeja la key en solo lectura. Una key con solo scopes ajenos a Plan no tiene acceso a Plan.
curl -sS "https://api.dailybot.com/v1/plan/me/tasks/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Key de agente o de la organización: un actor del sistema
Una key sin una persona detrás nunca actúa como una persona:
- Solo ve tableros visibles para la organización, nunca tableros exclusivos para miembros.
- No tiene
me:?owner=meresponde400 actor_required. - Los endpoints que requieren una persona o un administrador (listados más abajo) responden
403 insufficient_scope. - Debe tener sus propios scopes de Plan (
tasks:readytasks:write). - Actúa como una persona específica solo cuando la solicitud también lleva un exchange token (
X-EXCHANGE-TOKEN), como se describe en Autenticación. - No puede nombrar a un agente en una escritura: enviar un nombre de agente con una key de agente es
400 invalid_agent_attribution.
curl -sS "https://api.dailybot.com/v1/plan/boards/" \
-H "X-API-KEY: $DAILYBOT_API_KEY"
Las keys de agente y de la organización necesitan scopes de Plan habilitados. Una key nueva no tiene ninguno. Durante la Beta, escribe a [email protected] para habilitarlos.
Los invitados están limitados por su rol con una key o una sesión por igual: 403 guest_not_allowed, antes de revisar cualquier otra cosa. Una key vencida es 401 credential_expired; una key revocada o un dueño desactivado también es 401 (consulta los errores de inicio de sesión).
Scopes
| Scope | Otorga |
|---|---|
tasks:read |
Todas las lecturas |
tasks:write |
Escrituras de fila: tareas, comentarios, etiquetas, relaciones, participantes. En la fila de una key cubre también las operaciones de administración de abajo |
tasks:admin |
Escrituras de contenedores: proyectos, tableros, estados, membresías, objetivos. Todo miembro no invitado lo tiene |
Cada endpoint de la referencia indica su scope. Cómo los obtiene cada credencial:
| Credencial | Scopes |
|---|---|
| Sesión iniciada, miembro no invitado | tasks:read, tasks:write, tasks:admin |
| API key personal | Todo lo que puede hacer su persona, sin otorgar nada. Si la fila de la key lista scopes de Plan explícitos, son un techo |
| Key de agente o de la organización | Solo los scopes otorgados a la key (tasks:read, tasks:write); se rechaza en los endpoints que requieren una persona |
| Invitado, con cualquier credencial | Ninguno: se rechaza con 403 guest_not_allowed antes del entitlement |
Una llamada sin el scope que necesita responde 403 insufficient_scope.
La privacidad es la membresía (invitación), no el rol de la organización. Los contenedores de toda la organización son un espacio compartido. Un proyecto, tablero o tarea members responde 404 not found a quien no tiene un grant, en lecturas, listas, búsqueda, comentarios, adjuntos y actividad por igual. Trátalo como no visible, nunca como «no permitido». Un tablero dentro de un proyecto members sigue la membresía del proyecto, y los tableros exponen effective_visibility (org o members) para distinguirlo. Invita a una persona o a un equipo con escrituras de membresía para compartir; el último grant en un contenedor privado es 409 last_grant_cannot_be_removed. No hay roles por proyecto como lead o viewer: la membresía es solo un grant.
Supervisión. Los administradores de la organización y los managers de todos los equipos pueden ver todos los proyectos. Un tablero members sigue necesitando un grant explícito.
Los invitados se rechazan antes de revisar cualquier otra cosa, así que un invitado nunca sabe si la organización tiene Plan habilitado ni qué tan cerca está de los límites de su plan.
Endpoints que requieren una persona
Algunos endpoints necesitan una persona detrás de la solicitud, así que una key de agente o de la organización se rechaza con 403 insufficient_scope. Una sesión iniciada y una API key personal funcionan en todos. En la referencia, la insignia API key de un endpoint significa que también se acepta una key de agente o de la organización; los endpoints sin ella son los de esta lista. Se dividen en cuatro familias:
- Tus propias cosas: tus tareas, conteos, tableros recientes, bandeja, cursor de actividad, favoritos y vistas guardadas.
- Quién puede ver: listas de miembros de proyecto (la lista de miembros de un tablero funciona con cualquier key). Cambiar miembros es una operación de administración (abajo).
- A quién se notifica: participantes de tareas y suscripciones de seguimiento. Una key sin persona no tiene a nadie que responda por a quién se notifica.
- Administración (
tasks:admin): crear, editar, archivar y restaurar proyectos, tableros, estados de flujo y objetivos, reordenar estados, agregar y quitar adjuntos de proyectos y objetivos, agregar, cambiar y quitar miembros de tableros y proyectos, y vincular objetivos con proyectos. Una API key personal puede hacer todo esto.
Gestionar las etiquetas de la organización con la API de Plan (…/labels/) también requiere una persona.
POST /v1/plan/projects/: Crear un proyectoPATCH /v1/plan/projects/{project_id}/: Actualizar un proyectoPOST /v1/plan/projects/{project_id}/archive/: Archivar un proyecto, en cascada a sus tableros y sus tareasPOST /v1/plan/projects/{project_id}/restore/: Restaurar un proyecto archivadoGET /v1/plan/projects/{project_id}/views/: Las vistas guardadas de esta persona dentro de un proyectoPUT /v1/plan/projects/{project_id}/views/: Reemplazar las vistas guardadas de esta persona en un proyectoGET /v1/plan/projects/{project_id}/members/: Miembros de un proyectoPOST /v1/plan/projects/{project_id}/members/: Invitar a alguien, o a todo un equipo, a un proyectoDELETE /v1/plan/projects/{project_id}/members/{user_id}/: Quitar a alguien de un proyectoPATCH /v1/plan/projects/{project_id}/members/{user_id}/: Consultar un permiso de membresía del proyecto (el rol es de solo lectura)POST /v1/plan/projects/{project_id}/attachments/: Subir un adjunto a un proyectoDELETE /v1/plan/projects/{project_id}/attachments/{attachment_id}/: Quitar un adjunto de un proyecto
POST /v1/plan/goals/: Crear un objetivoPATCH /v1/plan/goals/{goal_id}/: Actualizar un objetivo o declarar su estadoPOST /v1/plan/goals/{goal_id}/archive/: Archivar un objetivo. Los proyectos se conservan, sin objetivoPOST /v1/plan/goals/{goal_id}/restore/: Recuperar un objetivo archivadoPOST /v1/plan/goals/{goal_id}/projects/: Vincular un proyecto a un objetivo (desde la página del objetivo)DELETE /v1/plan/goals/{goal_id}/projects/{project_id}/: Desvincular un proyecto de un objetivoPOST /v1/plan/goals/{goal_id}/attachments/: Subir un adjunto a un objetivoDELETE /v1/plan/goals/{goal_id}/attachments/{attachment_id}/: Quitar un adjunto de un objetivo
POST /v1/plan/boards/: Crear un tablero con sus cinco estados predeterminadosPATCH /v1/plan/boards/{board_id}/: Actualizar un tablero, incluido el cambio de nombre de su clavePOST /v1/plan/boards/{board_id}/archive/: Archivar un tablero, en cascada a sus tareasPOST /v1/plan/boards/{board_id}/restore/: Restaurar un tablero archivadoPOST /v1/plan/boards/{board_id}/visit/: Registrar que quien llama abrió un tablero (recent_boards de HomePulse)POST /v1/plan/boards/{board_id}/states/: Agregar un estado a un tableroPATCH /v1/plan/boards/{board_id}/states/{state_id}/: Renombrar, cambiar el color o reordenar un estadoPOST /v1/plan/boards/{board_id}/states/{state_id}/archive/: Retirar una columnaPOST /v1/plan/boards/{board_id}/states/{state_id}/restore/: Restaurar una columna retiradaPOST /v1/plan/boards/{board_id}/states/reorder/: Reordenar todas las columnas activas de un tablero en una sola llamadaGET /v1/plan/boards/{board_id}/views/: Las vistas guardadas de quien llama para este tableroPUT /v1/plan/boards/{board_id}/views/: Reemplazar las vistas guardadas de quien llama para este tableroGET /v1/plan/boards/{board_id}/mentionables/: Buscar personas que se pueden mencionar en un tableroPOST /v1/plan/boards/{board_id}/members/: Agregar un miembro a un tableroDELETE /v1/plan/boards/{board_id}/members/{user_id}/: Quitar a un miembro de un tableroPATCH /v1/plan/boards/{board_id}/members/{user_id}/: Consultar un permiso de membresía del tablero (el rol es de solo lectura)GET /v1/plan/boards/{board_id}/labels/: Listar las etiquetas de la organización (verificación de acceso al tablero)POST /v1/plan/boards/{board_id}/labels/: Crear una etiqueta de la organizaciónGET /v1/plan/views/{view_id}/: Una vista guardada por uuidPATCH /v1/plan/views/{view_id}/: Editar una vista guardadaDELETE /v1/plan/views/{view_id}/: Eliminar una vista guardada
POST /v1/plan/tasks/{task_id}/subscription/: Suscribirse a las notificaciones de la tarea (rol de observador)DELETE /v1/plan/tasks/{task_id}/subscription/: Quitar una suscripción de observadorGET /v1/plan/tasks/{task_id}/participants/: Quién está en esta tarjetaPOST /v1/plan/tasks/{task_id}/participants/: Poner a alguien en esta tarjetaDELETE /v1/plan/tasks/{task_id}/participants/{user_uuid}/: Quitar a alguien de esta tarjeta
GET /v1/plan/me/tasks/: Las tareas del usuario que llamaGET /v1/plan/me/tasks/counts/: Conteos de las pestañas de tareas personalesGET /v1/plan/me/recents/: Tableros visitados recientemente por quien llamaGET /v1/plan/inbox/: Eventos de tareas relevantes para notificar a quien llamaPOST /v1/plan/inbox/read-all/: Marcar como leídos todos los elementos de la bandeja de entradaPOST /v1/plan/inbox/{item_uuid}/read/: Ponerse al día hasta una fila de la bandeja de entradaGET /v1/plan/inbox/unread-count/: Conteo de no leídos en la bandeja de entrada de quien llamaGET /v1/plan/me/activity-cursor/: Leer el cursor de lectura de actividad de quien llamaPUT /v1/plan/me/activity-cursor/: Marcar la actividad como leída hasta una marca de tiempoGET /v1/plan/labels/: Listar las etiquetas de la organizaciónPOST /v1/plan/labels/: Crear una etiqueta de la organizaciónPATCH /v1/plan/labels/{label_id}/: Actualizar una etiqueta de la organizaciónDELETE /v1/plan/labels/{label_id}/: Eliminar una etiqueta de la organizaciónGET /v1/plan/me/favorites/: Tus tableros y vistas guardadas fijadosPOST /v1/plan/me/favorites/: Fijar un tablero o una vista guardadaPATCH /v1/plan/me/favorites/{favorite_id}/: Mover un pin dentro de tu listaDELETE /v1/plan/me/favorites/{favorite_id}/: Quitar un pin
Qué pasa cuando Plan no está habilitado
Lo que recibes depende del motivo:
| Situación | Respuesta |
|---|---|
| El plan de tu organización permite Plan, pero todavía no está en la Beta | 402 plan_upgrade_required en todos los endpoints de Plan, con cualquier credencial. Es lo esperado durante la Beta: escribe a [email protected] |
| Organización con plan gratuito, token de usuario del CLI | 403 plan_upgrade_required, al iniciar sesión, antes de llegar a Plan |
| Organización con plan gratuito, API key de la organización | 401 plan_free_api_keys_forbidden |
GET /v1/plan/entitlements/ nunca responde 402: llámalo para saber si Plan está habilitado y, si no, por qué.
Errores de inicio de sesión
Vienen de la credencial misma, antes de que se aplique cualquier regla de Plan:
| Estado | Código | Significado |
|---|---|---|
| 401 | credential_absent · credential_expired · credential_malformed |
Sin credencial, una vencida o una que no se puede leer |
| 401 | invalid_credentials |
La key o el token no existe |
| 401 | api_key_owner_inactive |
El dueño de la key fue desactivado |
| 401 | plan_free_api_keys_forbidden |
Las API keys no están disponibles en el plan gratuito |
| 401 | plan_missing_core_api_integrations |
El plan de la organización no incluye acceso a la API |
| 403 | plan_upgrade_required |
Inicio de sesión del CLI con plan gratuito que llega a un endpoint de pago |
| 429 | (limitado) | Demasiadas solicitudes: espera los segundos que indica Retry-After |
La lista completa de códigos de Plan está en las tablas de errores de la referencia y en Errores.