/api/templates na aplicação control-plane (apps/app) para gerenciar a biblioteca de templates do WhatsApp do workspace. Todas as rotas exigem um operador autenticado com acesso a settings (owner, admin ou developer); a rota de seed exige adicionalmente owner ou admin.
As requisições são restritas ao workspace ativo do chamador — você não pode ver ou alterar templates de outro workspace. Erros de autenticação retornam 401 unauthenticated ou 403 forbidden.
Resumo
GET /api/templates
Lista todos os templates do workspace ativo, ordenados pelos atualizados mais recentemente. Resposta 200401 unauthenticated, 403 forbidden, 500 internal_error.
POST /api/templates
Cria um novo rascunho de template. O template é armazenado comstatus = "draft" e não é enviado à Meta. Use POST /api/templates/{id}/submit depois que o rascunho estiver pronto.
Corpo da requisição
name(string, obrigatório) — letras minúsculas; caracteres não correspondentes são removidos e substituídos por_. Veja name-regex.language(string, padrão"en_US") — código de locale da Meta, por exemplo"it","en_US","pt_BR".category("MARKETING" | "UTILITY" | "AUTHENTICATION", padrão"UTILITY").parameterFormat("POSITIONAL" | "NAMED", padrão"POSITIONAL").components(array) — o formato de componente do schema da Meta.
400 create_failed com message descrevendo o erro de banco de dados ou de validação, além de erros de autenticação.
GET /api/templates/
Busca um único template por id. Retorna404 not_found se o id não existir no workspace do chamador.
Resposta 200 — mesmo formato de uma entrada de lista.
PUT /api/templates/
Atualiza um ou mais campos de um rascunho de template. Os campos enviados são aplicados (patched); campos não enviados permanecem inalterados. Corpo da requisição (todos os campos são opcionais)400 update_failed, erros de autenticação.
DELETE /api/templates/
Exclui um rascunho de template. Apenas templates comstatus = "draft" podem ser excluídos — uma vez enviado, o template é retido para auditoria. Um template que não é rascunho retorna 409 conflict.
Resposta 200
404 not_found, 409 conflict com "Only draft templates can be deleted", erros de autenticação.
POST /api/templates//submit
Envia um rascunho de template ao endpointPOST /{waba_id}/message_templates da Meta. O Switchbord primeiro executa o validador completo do lado do cliente (as mesmas regras documentadas em Regras de template); se alguma verificação falhar, nenhuma chamada é feita à Meta e é retornado um 400 validation_failed com o array de problemas (issues) que falharam.
Em caso de sucesso, a linha do template é atualizada com meta_template_id, status = "pending_approval" e rejection_reason = null.
Em caso de rejeição pela Meta (HTTP 4xx com um corpo error), a linha é atualizada com status = "rejected" e rejection_reason = a mensagem legível para humanos da Meta, e um 400 meta_submit_failed é retornado ao chamador com o payload de erro completo da Meta.
Resposta 200
400 validation_failed— o validador do lado do cliente rejeitou o rascunho.issuesé o array de issues do Zod.400 meta_submit_failed— a Meta retornou um erro.metaé o objetoerrorbruto da Meta (code, subcode,error_user_msg,error_data.details).400 no_waba— nenhuma conta do WhatsApp Business configurada para o workspace.400 no_access_token— nenhum access token da Meta no vault do workspace.404 not_found, erros de autenticação.
POST /api/templates/seed-starter-pack
Semeador (seeder) único, restrito a admins, que envia o pacote inicial da GB Viaggi (8UTILITY + 5 MARKETING, italiano + inglês quando aplicável) para a Meta e faz upsert das linhas correspondentes na tabela local templates. Seguro para reexecutar — a chave de upsert é (workspace_id, name, locale).
Papel necessário: owner ou admin.
Corpo da requisição — vazio.
Resposta 200
status por entrada:
submitted— aceito pela Meta, linha armazenada comopending_approval.error— erro da Meta ou do banco de dados, linha armazenada comorejectedcom a mensagem da Meta.skipped— reservado; não é emitido atualmente.
400 no_waba— nenhuma conta do WhatsApp Business configurada.400 no_access_token— segredometa-access-tokendo vault ausente.500 internal_error— falha não tratada.401 unauthenticated,403 forbidden— o chamador não possui o papel de owner/admin.
Endpoints internos relacionados
Existem duas rotas internas, não públicas, emapps/api para fluxos de sincronização machine-to-machine:
POST /internal/templates— upsert de template do worker para a API após um evento de webhook.POST /internal/templates/sync— resincronização completa da biblioteca a partir da Meta de volta para o Switchbord.
OpenAPI
O formato legível por máquina para esses endpoints será gerado emapps/docs/api-reference/openapi.json por pnpm openapi:generate. Execute o gerador após alterar uma rota para manter a especificação sincronizada.