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
| HTTP | code | Quando ocorre |
|---|---|---|
| 400 | VALIDATION_ERROR | Parâmetros obrigatórios faltando ou inválidos |
| 401 | UNAUTHORIZED | Header X-API-Key ausente, inválido ou chave desativada |
| 403 | UNAUTHORIZED | A chave existe, mas o recurso pertence a outro workspace |
| 404 | NOT_FOUND | Recurso (board, card, lista, membro, automação) não encontrado |
| 405 | VALIDATION_ERROR | Método HTTP não suportado para a rota |
| 500 | INTERNAL_ERROR | Falha 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, ounullpara 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_type | Significado | Quantidade por board |
|---|---|---|
"backlog" | Etapa inicial das novas solicitações | no máximo 1 |
"development" | Etapas de execução/desenvolvimento | várias |
"approval" | Etapa em que o card aguarda aprovação do solicitante (sincronizada com approval_list_id) | no máximo 1 |
null | Sem classificação | vá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 listalist_type— filtra pelas etapas classificadas:backlog,development,approval,none(etapas sem classificação). Aceita múltiplos separados por vírgula, ex.:list_type=development,approvaldue_status—on_track|approaching|overdue|donecompleted—all(default) |true(apenas concluídos) |false(apenas não concluídos). Aliases aceitos:done,not_done,1,0priority—low|medium|high|urgentcategory_id— uuid de uma categoria do board (vejaGET /boards/:id/categories)member_id— apenas cards atribuídos a este membrolabel_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_urlno formatohttps://dntask.lovable.app/board/{board_id}?card={card_id}e o arraychecklists[](itens comdue_date,assignee_ideassignee). - 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_idfor informado, o membro é vinculado como solicitante do card e adicionado automaticamente à lista de membros. Quando o card entra naapproval_list_iddo board, o solicitante recebe notificação e o campoapproval_statuspassa a"pending".
Se
assignee_member_idfor informado, o membro é definido como responsável pelo card e também é adicionado automaticamente à lista de membros. EnvienullnoPATCHpara 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
positionnã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_iddeve 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
nullemdue_dateouassignee_idpara limpar o valor. - Response 200: objeto checklist_item atualizado (inclui
due_dateeassignee_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" } colordeve 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(enumnew_product | evolution | improvement | bug) foi removido. Requisições que enviaremcategoryrecebem400 VALIDATION_ERROR. Usecategory_id(uuid deGET /boards/:id/categories) emPOST /cards,PATCH /cards/:ide no filtro?category_id=deGET /boards/:id/cardseGET /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" } colorno 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
positioncalculado 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 /cardscria um novo card a cada chamada — guarde oidretornado 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
boardspassam a exporresponsible_member_id(membro responsável pelo board, configurado no modal de Configurações).- Cards passam a expor
rejected_at,rejected_byerejection_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/checklistaceitadue_dateeassignee_idao criar o item.PATCH /cards/:card_id/checklist/:item_id(e o alias legado) aceitadue_dateeassignee_id; envienullpara limpar.GET /cards/:card_id/checklistretornadue_dateeassignee_idem cada item.assignee_idé validado como membro do workspace.
1.0.5 — 2026-08-05
GET /boards/:board_id/cardseGET /cards/:card_idpassam a retornar o arraychecklists[]com os itens de cada checklist.- Cada item traz
id,title,completed,position,due_date(prazo do item) eassignee_id+assignee(membro responsável pela execução do item). - Checklists e itens vêm ordenados por
position. O campochecklist_progresscontinua disponível. - YAML OpenAPI atualizado com os schemas
ChecklisteChecklistItem.
1.0.4 — 2026-08-04
GET /boards/:board_id/cardsganhou o filtrocompleted:all(padrão),true(apenas concluídos) oufalse(apenas não concluídos). Aliases aceitos:done,not_done,1,0.GET /boards/:board_id/cardsganhou o filtrolist_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 /boardsagora retorna, para cada board, o arraylists[]completo (comlist_type) além deapproval_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.categorieseBoardMember.
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
OPTIONSde 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/:ideDELETE /lists/:idretornavam404 "List not found"mesmo comlist_idvá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 retornam500 INTERNAL_ERRORcom a mensagem. list_idecard_idinválidos (não-uuid) retornam400 VALIDATION_ERROR.- Objeto Card passa a incluir
list_type(classificação da etapa atual).
Última atualização: 2026-08-05