Documentação

API dn.task

Referência completa dos endpoints REST. Use o YAML para alimentar IAs e geradores de cliente (OpenAPI 3.1).

Basehttps://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gatewayEdge Function direta
Proxyhttps://dntask.lovable.app/api/public/externalAlternativa — mesma API, mesma X-API-Key

API dn.task — Documentação Completa

A API REST da dn.task permite que agentes do dnOS e integrações externas leiam e modifiquem boards, listas, cards, comentários, checklists, automações e analytics dos workspaces.


URL Base

https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway

Todos os endpoints são prefixados por essa URL. O escopo de uma chave de API é sempre um único workspace.

URL alternativa (proxy)

Se o host direto da Edge Function não estiver acessível a partir do seu ambiente (DNS bloqueado, rede restrita, etc.), use o proxy hospedado no próprio app:

https://dntask.lovable.app/api/public/external

O proxy apenas encaminha a requisição — mesmos caminhos, mesmos métodos (GET, POST, PATCH, PUT, DELETE), mesmo corpo e mesma autenticação via header X-API-Key. Exemplo:

curl -X GET "https://dntask.lovable.app/api/public/external/boards" \
  -H "X-API-Key: dntask_sua_chave_aqui"


Autenticação

Toda requisição (exceto as internas de automação) DEVE incluir o header:

X-API-Key: dntask_sua_chave_aqui
  • Chaves são geradas em Configurações → API Keys
  • A chave plain só é exibida uma única vez no momento da criação
  • O servidor valida o SHA-256 da chave contra api_keys.key_hash
  • Chaves desativadas ou inexistentes retornam 401 UNAUTHORIZED
  • O campo last_used_at é atualizado automaticamente a cada chamada autenticada

Exemplo

curl -X GET "https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway/boards?workspace_id=SEU_WORKSPACE_ID" \
  -H "X-API-Key: dntask_sua_chave_aqui"

Formato Padrão de Erro

Todas as respostas de erro seguem este formato JSON:

{
  "error": "Mensagem legível descrevendo o problema",
  "code": "CODE_CONSTANT"
}

Códigos de erro possíveis

HTTPcodeQuando ocorre
400VALIDATION_ERRORParâmetros obrigatórios faltando ou inválidos
401UNAUTHORIZEDHeader X-API-Key ausente, inválido ou chave desativada
403UNAUTHORIZEDA chave existe, mas o recurso pertence a outro workspace
404NOT_FOUNDRecurso (board, card, lista, membro, automação) não encontrado
405VALIDATION_ERRORMétodo HTTP não suportado para a rota
500INTERNAL_ERRORFalha interna ou erro do banco de dados

Endpoints

Boards

GET /boards

Lista os boards (não arquivados) do workspace.

  • Query params

    • workspace_id (obrigatório, uuid) — workspace dono dos boards
  • Request

    curl "https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway/boards?workspace_id=WS" \
      -H "X-API-Key: dntask_..."
    
  • Response 200

    {
      "boards": [
        {
          "id": "uuid",
          "name": "Sprint 12",
          "description": null,
          "approval_list_id": "uuid | null",
          "responsible_member_id": "uuid | null",
          "created_at": "2026-05-01T10:00:00Z",
          "lists": [
            { "id": "uuid", "name": "Backlog", "position": 0, "wip_limit": null, "list_type": "backlog" },
            { "id": "uuid", "name": "Em andamento", "position": 1, "wip_limit": 5, "list_type": "development" },
            { "id": "uuid", "name": "Aguardando aprovação", "position": 2, "wip_limit": null, "list_type": "approval" },
            { "id": "uuid", "name": "Concluído", "position": 3, "wip_limit": null, "list_type": null }
          ],
          "lists_count": 4,
          "open_cards_count": 27
        }
      ]
    }
    
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 500 INTERNAL_ERROR


GET /boards/:board_id

Retorna um board específico com suas etapas classificadas e as categorias do board.

  • Path params: board_id (uuid)

  • Request

    curl "https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway/boards/BOARD_ID" \
      -H "X-API-Key: dntask_..."
    
  • Response 200

    {
      "id": "uuid",
      "name": "Sprint 12",
      "description": null,
      "workspace_id": "uuid",
      "approval_list_id": "uuid | null",
      "responsible_member_id": "uuid | null",
      "created_at": "2026-05-01T10:00:00Z",
      "lists": [
        {
          "id": "uuid",
          "name": "Backlog",
          "board_id": "uuid",
          "position": 0,
          "wip_limit": null,
          "archived": false,
          "list_type": "backlog"
        }
      ],
      "lists_count": 4,
      "open_cards_count": 27,
      "categories": [
        { "id": "uuid", "board_id": "uuid", "name": "Melhoria", "color": "#10b981", "icon": "Wrench", "position": 0 }
      ]
    }
    
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR


PATCH /boards/:board_id

Atualiza dados do board.

  • Body (todos opcionais): name, description, approval_list_id (uuid de uma lista deste board, ou null para remover a etapa de aprovação)
  • Response 200: { "id", "name", "description", "workspace_id", "approval_list_id", "created_at" }
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

DELETE /boards/:board_id

Exclui o board. Se ele tiver listas ou cards, é obrigatório usar ?force=true (remove tudo em cascata). Operação irreversível.

  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND

Etapas (Listas)

Cada etapa (lista) do board tem um atributo list_type que define seu papel no fluxo — é a mesma classificação feita no modal Configurações → Etapas do board:

list_typeSignificadoQuantidade por board
"backlog"Etapa inicial das novas solicitaçõesno máximo 1
"development"Etapas de execução/desenvolvimentovárias
"approval"Etapa em que o card aguarda aprovação do solicitante (sincronizada com approval_list_id)no máximo 1
nullSem classificaçãovárias

list_type é retornado em todo endpoint que devolve listas (GET /boards, GET /boards/:id, GET /boards/:id/lists, POST /boards/:id/lists, PATCH /lists/:id) e também no objeto Card (campo list_type, referente à etapa atual do card).

GET /boards/:board_id/lists

Lista as etapas não arquivadas do board, ordenadas por position.

  • Request

    curl "https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway/boards/BOARD_ID/lists" \
      -H "X-API-Key: dntask_..."
    
  • Response 200

    {
      "lists": [
        {
          "id": "uuid",
          "name": "Backlog",
          "board_id": "uuid",
          "position": 0,
          "wip_limit": null,
          "archived": false,
          "list_type": "backlog"
        }
      ]
    }
    
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND


POST /boards/:board_id/lists

Cria uma nova etapa.

  • Body

    • name (obrigatório, string)
    • position (opcional, number — default: última posição + 1)
    • wip_limit (opcional, number | null)
    • list_type (opcional, backlog | development | approval | null)
  • Response 201: objeto lista completo (mesmo formato acima)

  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND


PATCH /lists/:list_id

Atualiza nome, posição, wip_limit, archived ou list_type de uma etapa.

  • Body (todos opcionais): name, position, wip_limit, archived, list_type
  • Response 200: objeto lista atualizado
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

DELETE /lists/:list_id

Exclui a etapa. Se ela tiver cards ativos, é obrigatório usar ?force=true (os cards são removidos junto).

  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

Membros do board

GET /boards/:board_id/members

Lista os membros vinculados ao board.

  • Response 200: { "members": [{ "member_id", "role", "display_name", "avatar_url", "is_agent", "added_at" }] }

POST /boards/:board_id/members

Vincula um membro ao board. Body: member_id (uuid, obrigatório), role (admin | member, default member). Response 201: { "board_id", "member_id", "role", "created_at" }

PATCH /boards/:board_id/members/:member_id

Altera o papel do membro no board. Body: role (admin | member).

DELETE /boards/:board_id/members/:member_id

Remove o vínculo do membro com o board.

  • Erros (todos): 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

GET /boards/:board_id/cards

Lista cards de um board, com filtros opcionais.

  • Path params: board_id (uuid)

  • Query params

    • archived"true" ou "false" (default: "false")
    • list_id — filtra por lista
    • list_type — filtra pelas etapas classificadas: backlog, development, approval, none (etapas sem classificação). Aceita múltiplos separados por vírgula, ex.: list_type=development,approval
    • due_statuson_track | approaching | overdue | done
    • completedall (default) | true (apenas concluídos) | false (apenas não concluídos). Aliases aceitos: done, not_done, 1, 0
    • prioritylow | medium | high | urgent
    • category_id — uuid de uma categoria do board (veja GET /boards/:id/categories)
    • member_id — apenas cards atribuídos a este membro
    • label_id — apenas cards com este label
  • Response 200

    {
      "cards": [
        {
          "id": "uuid",
          "title": "Implementar login",
          "description": "Texto markdown...",
          "list_id": "uuid",
          "list_name": "Em andamento",
          "list_type": "development | backlog | approval | null",
          "board_id": "uuid",
          "due_date": "2026-05-20T18:00:00Z",
          "due_status": "on_track",
          "priority": "high",
          "category_id": "uuid | null",
          "category": { "id": "uuid", "name": "Melhoria", "color": "#10b981", "icon": "Wrench" },
          "archived": false,
          "position": 3,
          "created_at": "2026-05-01T10:00:00Z",
          "updated_at": "2026-05-10T14:00:00Z",
          "members": [{ "id": "uuid", "display_name": "Diego", "avatar_url": null, "is_agent": false }],
          "labels":  [{ "id": "uuid", "name": "Bug", "color": "#ef4444" }],
          "checklist_progress": "2/5",
          "checklists": [
            {
              "id": "uuid",
              "name": "Passos",
              "position": 1024,
              "items": [
                {
                  "id": "uuid",
                  "title": "Criar migration",
                  "completed": false,
                  "position": 1024,
                  "due_date": "2026-08-10T00:00:00Z",
                  "assignee_id": "uuid | null",
                  "assignee": { "id": "uuid", "display_name": "Bruno", "avatar_url": null, "is_agent": false }
                }
              ]
            }
          ],
          "comments_count": 4,
          "requester_member_id": "uuid | null",
          "requester": { "id": "uuid", "display_name": "Ana", "avatar_url": null, "is_agent": false },
          "assignee_member_id": "uuid | null",
          "assignee": { "id": "uuid", "display_name": "Bruno", "avatar_url": null, "is_agent": false },
          "approval_list_id": "uuid | null",
          "approval_status": "pending | null",
          "rejected_at": "2026-09-04T18:00:00Z | null",
          "rejected_by": "uuid | null",
          "rejection_reason": "string | null",
          "share_url": "https://dntask.lovable.app/board/BOARD_ID?card=CARD_ID"
        }
      ]
    }
    
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR


Cards

GET /cards/:card_id

Retorna o card completo (mesmos campos de GET /boards/:id/cards), incluindo o link compartilhável (share_url) que abre o card direto no app web.

  • Path params: card_id (uuid)
  • Response 200: objeto card completo, com share_url no formato https://dntask.lovable.app/board/{board_id}?card={card_id} e o array checklists[] (itens com due_date, assignee_id e assignee).
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND

💡 O campo share_url é retornado em todas as respostas que incluem um card (list, create, patch, move, archive, get). Basta abrir essa URL no navegador (estando logado no workspace) que o board carrega e o cartão é aberto automaticamente.


POST /cards

Cria um novo card.

  • Body
    {
      "list_id": "uuid (obrigatório)",
      "title": "string (obrigatório)",
      "description": "string | null",
      "due_date": "ISO 8601 | null",
      "priority": "low | medium | high | urgent (default: medium)",
      "category_id": "uuid | null (deve pertencer ao mesmo board da lista)",
      "requester_member_id": "uuid | null",
      "assignee_member_id": "uuid | null",
      "member_ids": ["uuid", "..."],
      "label_ids":  ["uuid", "..."]
    }
    

Se requester_member_id for informado, o membro é vinculado como solicitante do card e adicionado automaticamente à lista de membros. Quando o card entra na approval_list_id do board, o solicitante recebe notificação e o campo approval_status passa a "pending".

Se assignee_member_id for informado, o membro é definido como responsável pelo card e também é adicionado automaticamente à lista de membros. Envie null no PATCH para remover o responsável.

  • Request

    curl -X POST "https://dbeknvfrzagveqeqdnwo.supabase.co/functions/v1/api-gateway/cards" \
      -H "X-API-Key: dntask_..." \
      -H "Content-Type: application/json" \
      -d '{"list_id":"LISTA","title":"Novo card","description":"detalhes"}'
    
  • Response 201: objeto card completo (mesmo formato de GET /boards/:id/cards)

  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR


PATCH /cards/:card_id

Atualiza campos do card. Mover de lista também atualiza board_id automaticamente.

  • Body (todos opcionais)

    {
      "title": "string",
      "description": "string | null",
      "due_date": "ISO 8601 | null",
      "due_status": "on_track | approaching | overdue | done",
      "priority": "low | medium | high | urgent",
      "category_id": "uuid | null (deve pertencer ao board do card)",
      "requester_member_id": "uuid | null",
      "assignee_member_id": "uuid | null",
      "list_id": "uuid"
    }
    
  • Response 200: objeto card completo atualizado

  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR


POST /cards/:card_id/approve

Aprova o card como solicitante. Só funciona se o card estiver na approval_list_id do board — o card é movido para o topo da lista seguinte e uma entrada requester_approved é registrada no histórico.

  • Body (opcional): { "approver_member_id": "uuid" } — se omitido, usa o solicitante do card como ator do log.
  • Response 200: objeto card completo atualizado
  • Erros: 400 VALIDATION_ERROR (card fora da etapa de aprovação, sem solicitante ou sem próxima lista), 401/403 UNAUTHORIZED, 404 NOT_FOUND

POST /cards/:card_id/reject

Rejeita o card como solicitante. Move o card para o topo da lista anterior à approval_list_id, registra um comentário automático ("Rejeitado pelo solicitante: <reason>") e loga requester_rejected.

  • Body: { "reason": "texto (obrigatório, mínimo 3 chars)", "rejecter_member_id": "uuid (opcional)" }
  • Response 200: objeto card completo atualizado
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

POST /cards/:card_id/archive

Arquiva um card (não remove do banco). Use unarchive para reverter.

  • Response 200: objeto card completo com archived: true
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND

POST /cards/:card_id/unarchive

Desarquiva um card previamente arquivado.

  • Response 200: objeto card completo com archived: false
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND

DELETE /cards/:card_id

Remove permanentemente um card e todos os dados relacionados (comentários, checklists, anexos, labels). Operação irreversível — prefira archive quando quiser apenas ocultar.

  • Response 200: { "success": true, "id": "uuid" }
  • Erros: 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR

POST /cards/:card_id/move

Move um card para outra lista (e opcionalmente em uma posição específica).

  • Body
    { "list_id": "uuid (obrigatório)", "position": 2 }
    
  • Se position não for fornecido, o card vai para o fim da lista alvo.
  • Response 200: objeto card completo atualizado
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND, 500 INTERNAL_ERROR

POST /cards/:card_id/comments

Adiciona um comentário. A chave deve estar associada a um membro (member_id).

  • Body: { "content": "Texto do comentário" }
  • Response 201
    { "id": "uuid", "card_id": "uuid", "author_id": "uuid", "content": "...", "created_at": "..." }
    
  • Erros: 400 VALIDATION_ERROR, 401 UNAUTHORIZED (chave sem membro), 403 UNAUTHORIZED, 404 NOT_FOUND

Checklists

Cada card pode ter um único checklist (criado automaticamente no primeiro item). Os endpoints abaixo operam sobre esse checklist e seus itens.

GET /cards/:card_id/checklist

Lista o checklist do card e todos os seus itens (ordenados por position).

  • Response 200
    {
      "checklists": [
        {
          "id": "uuid",
          "card_id": "uuid",
          "name": "Checklist",
          "position": 0,
          "checklist_items": [
            { "id": "uuid", "title": "Etapa 1", "completed": false, "position": 0, "due_date": "2026-08-20T12:00:00Z", "assignee_id": "uuid | null" }
          ]
        }
      ]
    }
    

POST /cards/:card_id/checklist

Adiciona um item ao checklist do card. Cria o checklist automaticamente se ainda não existir.

  • Body
    {
      "title": "string (obrigatório)",
      "due_date": "2026-08-20T12:00:00Z (opcional, ISO 8601 ou null)",
      "assignee_id": "uuid do membro responsável (opcional ou null)"
    }
    
  • assignee_id deve ser um membro do mesmo workspace.
  • Response 201
    { "id": "uuid", "checklist_id": "uuid", "card_id": "uuid", "title": "Etapa 1", "completed": false, "position": 0, "due_date": null, "assignee_id": null }
    
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND

PATCH /cards/:card_id/checklist

Renomeia ou exclui o checklist inteiro.

  • Body (renomear): { "name": "Novo nome" }
  • Body (excluir): { "delete": true } (remove o checklist e todos os itens)
  • Response 200: checklist atualizado ou { "success": true } em caso de exclusão

DELETE /cards/:card_id/checklist

Remove o checklist do card.

  • Query: force=true é obrigatório quando há itens (caso contrário retorna 400)
  • Response 200: { "success": true }

PATCH /cards/:card_id/checklist/:item_id

Atualiza um item específico (título, status, prazo e/ou responsável).

  • Body: { "title"?: string, "completed"?: boolean, "due_date"?: string | null, "assignee_id"?: uuid | null } (pelo menos um campo)
  • Envie null em due_date ou assignee_id para limpar o valor.
  • Response 200: objeto checklist_item atualizado (inclui due_date e assignee_id)

DELETE /cards/:card_id/checklist/:item_id

Remove um item do checklist.

  • Response 200: { "success": true }

PATCH /cards/:card_id/checklist-items/:item_id (alias legado)

Equivalente a PATCH /cards/:card_id/checklist/:item_id — mantido para compatibilidade.

  • Body: { "completed": true }
  • Response 200: objeto checklist_item atualizado

Members

GET /members

Lista membros do workspace.

  • Query: workspace_id (obrigatório)
  • Response 200
    {
      "members": [
        { "id": "uuid", "display_name": "Diego", "role": "super_admin",
          "is_agent": false, "agent_id": null, "avatar_url": null }
      ]
    }
    

GET /members/:member_id/cards

Lista cards (não arquivados) atribuídos a um membro.

  • Query: due_status, priority, board_id (opcionais)
  • Response 200: { "cards": [...] } (mesmo formato dos cards completos)

Labels

GET /labels

Lista labels de um board.

  • Query: board_id (obrigatório)
  • Response 200
    { "labels": [{ "id": "uuid", "name": "Bug", "color": "#ef4444", "board_id": "uuid" }] }
    

GET /boards/{board_id}/labels

Mesma lista, no formato RESTful.

  • Response 200: { "labels": [{ "id", "name", "color", "board_id" }] }

POST /boards/{board_id}/labels

Cria uma nova etiqueta no board.

  • Body
    { "name": "Bug", "color": "#ef4444" }
    
  • Response 201: { "id", "name", "color", "board_id" }
  • color deve estar no formato #RRGGBB (padrão: #3D61FF).

PATCH /labels/{label_id}

Atualiza nome e/ou cor de uma etiqueta.

  • Body (campos opcionais)
    { "name": "Critical", "color": "#dc2626" }
    
  • Response 200: { "id", "name", "color", "board_id" }

DELETE /labels/{label_id}

Remove a etiqueta e a desvincula de todos os cards.

  • Response 200: { "success": true }

Board Categories

Categorias são escopadas ao board — cada board mantém sua própria lista (CRUD abaixo). Os cards referenciam a categoria por category_id; a resposta inclui o objeto expandido category: { id, name, color, icon }.

⚠️ Breaking change: o antigo campo category (enum new_product | evolution | improvement | bug) foi removido. Requisições que enviarem category recebem 400 VALIDATION_ERROR. Use category_id (uuid de GET /boards/:id/categories) em POST /cards, PATCH /cards/:id e no filtro ?category_id= de GET /boards/:id/cards e GET /members/:id/cards.

GET /boards/{board_id}/categories

Lista as categorias do board, ordenadas por position.

  • Response 200
    {
      "categories": [
        { "id": "uuid", "board_id": "uuid", "name": "Melhoria", "color": "#10b981", "icon": "Wrench", "position": 0 }
      ]
    }
    

POST /boards/{board_id}/categories

Cria uma categoria no board.

  • Body
    { "name": "Bug/manutenção", "color": "#ef4444", "icon": "Bug" }
    
  • color no formato #RRGGBB; icon é o nome de um ícone do catálogo Lucide previsto (Sparkles, TrendingUp, Wrench, Bug, Zap, Star, Flag, Tag, Layers, Rocket, Shield, Target).
  • Response 201: objeto categoria criado (com position calculado automaticamente).
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 404 NOT_FOUND.

PATCH /categories/{category_id}

Atualiza name, color, icon e/ou position (todos opcionais).

  • Body: { "name"?: string, "color"?: "#RRGGBB", "icon"?: string, "position"?: number }
  • Response 200: categoria atualizada.

DELETE /categories/{category_id}

Remove a categoria. Cards que a referenciavam ficam com category_id = null automaticamente.

  • Response 200: { "success": true }

Automations

GET /automations

Lista automações do workspace.

  • Query: workspace_id (obrigatório), board_id (opcional)
  • Response 200: { "automations": [ ... ] }

POST /automations

Cria uma automação.

  • Body
    {
      "name": "Mover para Done quando concluído",
      "active": true,
      "board_id": "uuid | null",
      "trigger_type": "card_created | card_moved | label_added | checklist_completed | due_date_overdue | due_date_approaching",
      "trigger_config": { "list_id": "uuid", "label_id": "uuid", "hours_before": 24 },
      "action_type": "move_card | assign_member | add_label | set_due_status | add_comment | notify_member",
      "action_config": { "list_id": "uuid", "member_id": "uuid", "label_id": "uuid", "due_status": "done", "content": "...", "message": "..." }
    }
    
  • Response 201: objeto automation
  • Erros: 400 VALIDATION_ERROR, 401/403 UNAUTHORIZED, 500 INTERNAL_ERROR

PATCH /automations/:id

Atualiza qualquer subconjunto dos campos acima. Response 200: automation atualizada.

DELETE /automations/:id

Remove a automação. Response 200: { "deleted": true }

GET /automations/:id/logs

Histórico de execuções.

  • Query: limit (default 50, máx 200)
  • Response 200: { "logs": [ { "id", "automation_id", "card_id", "status", "detail", "triggered_at" } ] }

Analytics

GET /analytics/overview

Visão geral do workspace.

  • Query: workspace_id (obrigatório), period = 7d | 30d (default) | 90d
  • Response 200
    {
      "period": "30d",
      "total_cards_open": 84,
      "total_cards_done": 156,
      "total_cards_overdue": 7,
      "cards_created_in_period": 42,
      "cards_completed_in_period": 38,
      "completion_rate": 90.5,
      "most_active_board": { "id": "uuid", "name": "Sprint 12", "cards_count": 22 },
      "most_active_member": { "id": "uuid", "name": "Diego", "actions_count": 134 }
    }
    

GET /analytics/boards/:board_id

Métricas detalhadas de um board: cycle time por lista, throughput semanal e top members.

  • Query: period
  • Response 200: { "board_id", "board_name", "period", "lists": [...], "throughput": [...], "top_members": [...] }

GET /analytics/members

Atividade dos membros no período.

  • Query: workspace_id (obrigatório), period
  • Response 200: { "period", "members": [ { "member_id", "display_name", "total_actions", "last_active_at", ... } ] }

GET /analytics/cards/overdue

Cards atrasados, ordenados por due_date ascendente.

  • Query: workspace_id (obrigatório), board_id (opcional)
  • Response 200
    {
      "cards": [
        { "card_id": "uuid", "title": "...", "board_name": "...", "list_name": "...",
          "due_date": "2026-05-10T...", "days_overdue": 5, "members": [...] }
      ]
    }
    

Boas Práticas

  • Idempotência: POST /cards cria um novo card a cada chamada — guarde o id retornado para evitar duplicatas.
  • Paginação: a API atual retorna todos os registros do escopo solicitado. Use filtros (list_id, list_type, completed, due_status, label_id, member_id) para limitar volumes.
  • Rate limiting: não há limite explícito, mas mantenha um padrão razoável (≤ 10 req/s por chave).
  • Segurança: nunca exponha a chave em código client-side. Use no servidor da sua integração.

Changelog

1.0.7 — 2026-09-04

  • boards passam a expor responsible_member_id (membro responsável pelo board, configurado no modal de Configurações).
  • Cards passam a expor rejected_at, rejected_by e rejection_reason. Quando o responsável do board recusa um card, ele é arquivado, a justificativa é registrada e o solicitante é notificado.

1.0.6 — 2026-08-05

  • POST /cards/:card_id/checklist aceita due_date e assignee_id ao criar o item.
  • PATCH /cards/:card_id/checklist/:item_id (e o alias legado) aceita due_date e assignee_id; envie null para limpar.
  • GET /cards/:card_id/checklist retorna due_date e assignee_id em cada item.
  • assignee_id é validado como membro do workspace.

1.0.5 — 2026-08-05

  • GET /boards/:board_id/cards e GET /cards/:card_id passam a retornar o array checklists[] com os itens de cada checklist.
  • Cada item traz id, title, completed, position, due_date (prazo do item) e assignee_id + assignee (membro responsável pela execução do item).
  • Checklists e itens vêm ordenados por position. O campo checklist_progress continua disponível.
  • YAML OpenAPI atualizado com os schemas Checklist e ChecklistItem.

1.0.4 — 2026-08-04

  • GET /boards/:board_id/cards ganhou o filtro completed: all (padrão), true (apenas concluídos) ou false (apenas não concluídos). Aliases aceitos: done, not_done, 1, 0.
  • GET /boards/:board_id/cards ganhou o filtro list_type: filtra cards pela classificação da etapa (backlog, development, approval, none), aceitando múltiplos valores separados por vírgula — ex.: ?list_type=development,approval&completed=false.
  • YAML OpenAPI atualizado com os dois novos parâmetros de query.

1.0.3 — 2026-08-04

  • GET /boards agora retorna, para cada board, o array lists[] completo (com list_type) além de approval_list_id.
  • Novo endpoint GET /boards/:board_id: board com etapas classificadas, contadores e categorias.
  • Documentadas as seções Etapas (Listas) (GET/POST /boards/:id/lists, PATCH/DELETE /lists/:id) e Membros do board, que já existiam na API mas não estavam na documentação.
  • Corrigida a descrição dos deletes: o parâmetro correto é ?force=true (não ?permanent=true).
  • YAML OpenAPI atualizado com esses caminhos e com os schemas Board.lists, Board.categories e BoardMember.

1.0.2 — 2026-08-04

  • Nova URL alternativa (proxy): https://dntask.lovable.app/api/public/external. Encaminha as requisições para a mesma API, para clientes que não conseguem alcançar o host direto da Edge Function. Mesmos caminhos, métodos, corpo e autenticação (X-API-Key).
  • O proxy não adiciona nenhuma regra de negócio: apenas repassa a requisição e devolve a resposta original (status e corpo idênticos).
  • Suporta CORS (inclui OPTIONS de preflight), então também pode ser chamado a partir do browser.

1.0.1 — 2026-08-02

  • Correção: POST /cards, PATCH /cards/:id (com troca de etapa), POST /cards/:id/move, PATCH /lists/:id e DELETE /lists/:id retornavam 404 "List not found" mesmo com list_id válido, por causa de uma ambiguidade de relacionamento entre listas e boards introduzida pela etapa de aprovação. Corrigido.
  • Erros reais do banco deixam de ser mascarados como 404; agora retornam 500 INTERNAL_ERROR com a mensagem.
  • list_id e card_id inválidos (não-uuid) retornam 400 VALIDATION_ERROR.
  • Objeto Card passa a incluir list_type (classificação da etapa atual).

Última atualização: 2026-08-05