Saltar para a documentação
API

Listar modelos

Todos os modelos da ligação, do mais recente para o mais antigo, com paginação por keyset.

GETapi.openemail.uk/templates

Executa a chamada real contra o seu espaço de trabalho, com a sua própria chave.

GET /templates

Todos os modelos da ligação, do mais recente para o mais antigo, com paginação por keyset.

Dois motores

shell
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"

Um modelo é um corpo guardado uma vez e enviado muitas vezes, e pertence à LIGAÇÃO e não a quem o escreveu. Uma chave de espaço de trabalho vê os mesmos modelos que um colega, e apagar a conta do autor não os leva consigo.

engine: "blocks" guarda uma árvore cujos tipos de nó são as exportações de @react-email/components (Section, Row, Column, Container, Text, Heading, Button, Link, Img, Hr, Markdown, CodeBlock e CodeInline) e cujas props são as desses próprios componentes. É validada à entrada, pelo que um nó inválido dá um 422 na chamada que o escreveu, em vez de um email partido mais tarde.

engine: "html" guarda markup que já tem, sanitizado uma vez quando a versão é publicada. É esta a opção a usar quando os seus modelos são componentes react-email que vivem no seu próprio repositório: renderize o componente com @react-email/render no seu próprio build e envie o resultado. Não há nenhum endpoint de JSX, nem vai haver. A API aceita HTML porque HTML é o que um cliente de email lê, e executar o componente de quem chama obrigaria a uma sandbox de que ninguém precisa.

Declarado comoPreenchido porEm falta no envio
`slots`quem edita o modeloé apresentado o default do próprio slot
`props`quem enviamissing_template_prop, um 422, e nenhum correio sai

Ambos se escrevem como {{key}} no corpo e no assunto, e ambos têm um kind (text, url ou image) que determina como o valor é escapado quando é substituído. Uma chave que nada declara falha na publicação; um valor url cujo esquema não seja http, https ou mailto é recusado em vez de apresentado.

Uma versão publicada fica congelada. Editar o corpo de um modelo publicado cria um novo rascunho em vez de alterar o que os envios em produção resolvem, pelo que um colega que reescreva o texto não pode alterar o que o seu código já envia, e fixar version significa que também não o pode alterar quando publicar.

Exemplo

Requer templates:read. limit vai até 100, status restringe a draft, active ou archived, e cursor é opaco, por isso devolva o nextCursor que recebeu em vez de construir um.

curl
curl "$OE/templates?limit=25&status=active" -H "$AUTH"
Resposta
{  "object": "list",  "data": [    {      "object": "template",      "id": "tpl_9c1f0a4b7e05d3862c1f0a44",      "name": "Order shipped",      "slug": "order-shipped",      "description": null,      "status": "active",      "publishedVersion": 3,      "latestVersion": 4,      "createdAt": "2026-08-01T09:12:44.000Z",      "updatedAt": "2026-08-28T16:03:10.000Z"    }  ],  "hasMore": false,  "nextCursor": null}

publishedVersion é o que um envio sem version resolve e latestVersion é o rascunho que está por cima dela. Se os dois diferirem, alguém editou e não publicou. Não é um erro, e vale a pena mostrá-lo num registo de implementação.

Uma linha é apenas metadados. Os slots e props declarados são devolvidos pela obtenção individual, que é a chamada a fazer quando precisa de saber o que passar a um modelo.