Cards: ações
Duplica um card, cria um card a partir de modelo, salva um card como modelo pessoal e carimba a aprovação de um card de SQL.
Ações que partem de um card ou de um modelo, sem precisar escrever uma especificação. Todas exigem manage_dashboards e acesso de escrita à aba. Para a lista de modelos disponíveis, veja Catálogo e modelos.
Duplicar card
/api/v1/admin/dashboards/{id}/cards/{cardId}/duplicateAdminDuplicar um card
Parâmetros de caminho
iduuidobrigatórioId da aba (UUID).
cardIduuidobrigatórioId do card (UUID).
Exemplo de requisição (duplicar)
bash
curl -X POST "$BASE_URL/api/v1/admin/dashboards/8da0f9c1-b05b-4809-b07d-0b36573489e7/cards/dd3470e6-dc16-4b41-9393-23797b50d7ba/duplicate" \
-H "Authorization: Bearer $TOKEN"Resposta (duplicar)
201Card copiado
json
{
"id": "1fe54f18-d4cb-453f-9db5-965f6fc9db01",
"dashboard_id": "8da0f9c1-b05b-4809-b07d-0b36573489e7",
"spec": {
"spec_version": 1,
"kind": "query",
"title": "Receita",
"viz": { "type": "kpi", "snippet_id": "receita-semana", "number_format": { "style": "currency_cents" } },
"query": {
"entity": "orders",
"period": { "mode": "inherit" },
"metrics": [ { "id": "receita", "kind": "catalog", "ref": "orders.revenue", "status_scope": { "mode": "store_default", "include": ["Paid", "shipped", "delivered"] } } ]
}
},
"spec_version": 1,
"kind": "Q",
"title": "Receita",
"grid_row": 0,
"grid_col": 0,
"width": 1,
"height": 1,
"order": 0,
"status": "A",
"source": "M",
"created_by": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc",
"created_at": "2026-10-11T21:10:41.552Z",
"updated_at": "2026-10-11T21:10:41.552Z"
}Campos da resposta
(objeto)objectO novo card, na mesma aba, com a mesma especificação.
Erros (duplicar)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_dashboards"} |
| 404 | O card não existe ou a aba dele não é sua. | {"error":"card not found"} |
| 500 | Falha inesperada no servidor. | {"error":"failed to ..."} |
Criar a partir de modelo
/api/v1/admin/dashboards/{id}/cards/from-templateAdminCriar um card a partir de um modelo
Parâmetros de caminho
iduuidobrigatórioId da aba (UUID).
Corpo da requisição
template_slugstringobrigatórioslug de um modelo de Catálogo e modelos.grid_rowintegerpadrão: 0Linha da grade.
grid_colintegerpadrão: 0Coluna, 0 a 2.
orderintegerpadrão: 0Ordem de exibição. Sem isso, todo card novo fica na ordem
0.Exemplo de requisição (modelo)
bash
curl -X POST "$BASE_URL/api/v1/admin/dashboards/8da0f9c1-b05b-4809-b07d-0b36573489e7/cards/from-template" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"template_slug": "ven-receita-diaria", "grid_row": 1, "grid_col": 0, "order": 2}'Resposta (modelo)
201Card criado
json
{
"id": "dd3470e6-dc16-4b41-9393-23797b50d7ba",
"dashboard_id": "8da0f9c1-b05b-4809-b07d-0b36573489e7",
"spec": {
"spec_version": 1,
"kind": "query",
"title": "Receita",
"viz": { "type": "kpi", "snippet_id": "receita-semana", "number_format": { "style": "currency_cents" } },
"query": {
"entity": "orders",
"period": { "mode": "inherit" },
"metrics": [ { "id": "receita", "kind": "catalog", "ref": "orders.revenue", "status_scope": { "mode": "store_default", "include": ["Paid", "shipped", "delivered"] } } ]
}
},
"spec_version": 1,
"kind": "Q",
"title": "Receita",
"grid_row": 0,
"grid_col": 0,
"width": 1,
"height": 1,
"order": 0,
"status": "A",
"source": "M",
"created_by": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc",
"created_at": "2026-10-11T21:10:41.552Z",
"updated_at": "2026-10-11T21:10:41.552Z"
}Campos da resposta
(objeto)objectO card criado. Largura e altura vêm do modelo (
default_width, default_height); source é T e template_slug guarda o modelo.Erros (modelo)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_dashboards"} |
| 400 | Corpo inválido: não é JSON, tem campo desconhecido (a leitura rejeita campos que a API não conhece) ou passa de 1 MB. | {"error":"invalid request body","detail":"json: unknown field \"foo\""} |
| 404 | A aba não existe, não é sua ou não está visível para você. A API responde 404 em vez de 403 para não revelar que o id existe. | {"error":"dashboard not found"} |
| 422 | Modelo inexistente, ou que não passa mais na validação desta versão. | {"error":"failed to create card from template","detail":"dashboards: not found"} |
Salvar como modelo
/api/v1/admin/dashboards/{id}/cards/{cardId}/save-as-templateAdminSalvar um card como modelo pessoal
Parâmetros de caminho
iduuidobrigatórioId da aba (UUID).
cardIduuidobrigatórioId do card (UUID).
Corpo da requisição
name_ptstringobrigatórioNome do modelo. Obrigatório.
categorystringpadrão: geralCategoria. Vazio vira
geral.Exemplo de requisição (salvar modelo)
bash
curl -X POST "$BASE_URL/api/v1/admin/dashboards/8da0f9c1-b05b-4809-b07d-0b36573489e7/cards/dd3470e6-dc16-4b41-9393-23797b50d7ba/save-as-template" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name_pt": "Receita da semana", "category": "geral"}'Resposta (salvar modelo)
201Modelo salvo
json
{
"slug": "personal-6b1c0d6e-4e5a-4a2f-9a55-3f0f2f5c9a10",
"category": "geral",
"name_pt": "Receita da semana",
"name_en": "Receita da semana",
"description_pt": "",
"spec": { "spec_version": 1, "kind": "query", "title": "Receita" },
"icon": "",
"panel": "A",
"default_width": 1,
"default_height": 1,
"is_builtin": false,
"has_real_data": true,
"position": 0,
"is_mine": true
}Campos da resposta
(objeto)objectO modelo criado, com os campos de Catálogo e modelos. O
slug começa com personal-; name_en repete name_pt. Só quem salvou o vê na biblioteca. Não há rota para apagá-lo.Erros (salvar modelo)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_dashboards"} |
| 400 | Corpo inválido: não é JSON, tem campo desconhecido (a leitura rejeita campos que a API não conhece) ou passa de 1 MB. | {"error":"invalid request body","detail":"json: unknown field \"foo\""} |
| 404 | O card não existe ou a aba dele não é sua. | {"error":"card not found"} |
| 422 | name_pt vazio ou falha ao salvar. | {"error":"failed to save card as template","detail":"name_pt is required"} |
Aprovar card de SQL
/api/v1/admin/dashboards/{id}/cards/{cardId}/approveAdminCarimbar a aprovação de um card de SQL
Parâmetros de caminho
iduuidobrigatórioId da aba (UUID).
cardIduuidobrigatórioId do card (UUID).
Exemplo de requisição (aprovar)
bash
curl -X POST "$BASE_URL/api/v1/admin/dashboards/8da0f9c1-b05b-4809-b07d-0b36573489e7/cards/dd3470e6-dc16-4b41-9393-23797b50d7ba/approve" \
-H "Authorization: Bearer $TOKEN"Resposta (aprovar)
200Card aprovado
json
{
"id": "dd3470e6-dc16-4b41-9393-23797b50d7ba",
"dashboard_id": "8da0f9c1-b05b-4809-b07d-0b36573489e7",
"spec": {
"spec_version": 1,
"kind": "query",
"title": "Receita",
"viz": { "type": "kpi", "snippet_id": "receita-semana", "number_format": { "style": "currency_cents" } },
"query": {
"entity": "orders",
"period": { "mode": "inherit" },
"metrics": [ { "id": "receita", "kind": "catalog", "ref": "orders.revenue", "status_scope": { "mode": "store_default", "include": ["Paid", "shipped", "delivered"] } } ]
}
},
"spec_version": 1,
"kind": "S",
"title": "Receita",
"grid_row": 0,
"grid_col": 0,
"width": 1,
"height": 1,
"order": 0,
"status": "A",
"source": "M",
"created_by": "d4613dde-ac7a-431c-9232-50d8cd6ad5fc",
"created_at": "2026-10-11T21:10:41.552Z",
"updated_at": "2026-10-11T21:10:41.552Z"
}Campos da resposta
(objeto)objectO card, com
approved_by_user_id e approved_at preenchidos.Erros (aprovar)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"manage_dashboards"} |
| 403 | Falta o privilégio manage_reports. | {"error":"manage_reports required to approve a sql card"} |
| 404 | O card não existe ou a aba dele não é sua. | {"error":"card not found"} |
| 400 | O card não é de SQL livre. | {"error":"card_not_sql","detail":"dashboards: card is not kind=\"sql\""} |
| 500 | Falha inesperada no servidor. | {"error":"failed to ..."} |