Referência da API REST
Todos os caminhos são relativos a https://shopify.workflow-transactional-email.app. Todos os pontos finais, exceto o índice, exigem Authorization: Bearer fak_... - consulte Autenticação e chaves de API.
As respostas são em JSON. Os erros seguem o mesmo formato em todos os casos:
{ "error": "Invalid or missing API key" }Índice e identidade
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1 |
nenhum | Índice da API. Confirma se a API está em funcionamento e informa a versão atual |
| OBTER | /api/v1/me |
ler | Verifique se uma chave funciona e veja seu nível de acesso |
O índice não necessita de chave; portanto, é uma verificação de integridade segura para a qual se pode direcionar um monitor.
Layouts de e-mail
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/email-templates |
ler | Lista de modelos de e-mail. q permite pesquisar por nome, assunto e descrição; category=transactional ou category=marketing exibe um tipo de e-mail |
| POST | /api/v1/email-templates |
escrever | Criar um layout |
| OBTER | /api/v1/email-templates/:id |
ler | Um layout com seu design ou anexos, seus textos de rodapé e a lista de seus idiomas |
| PUT / PATCH | /api/v1/email-templates/:id |
escrever | Alterar um layout. Apenas os campos que o senhor enviar serão alterados |
| EXCLUIR | /api/v1/email-templates/:id |
escrever | Excluir um layout com suas traduções e versões |
| OBTER | /api/v1/layout-schema |
ler | Como criar um layout: o formato de design, as configurações padrão de cada bloco, o Liquid que você pode utilizar, os limites e um exemplo |
A lista aceita page (padrão 1), limit (padrão 25, máximo 100) e q, que realiza a pesquisa por nome, assunto e descrição. Não há filtro por tipo na API; consulte, em vez disso, category para cada layout.
Um layout possui os seguintes campos:
| Campo | Notas |
|---|---|
name, description |
Nome obrigatório, no máximo 200 caracteres; descrição: no máximo 2.000 |
bodyType |
visual (padrão) ou text. Fixo após a criação |
defaultLocale |
O idioma do próprio conteúdo do layout, en, a menos que seja definido |
category |
transactional (padrão) ou marketing. Veja abaixo |
subject, previewText |
É permitido o consumo de bebidas. É obrigatório o cumprimento da disciplina |
bodyDesign |
Layouts visuais: { blocks, global?, header?, footer?, testVariables? }. Envie o design completo ao alterá-lo; o HTML body é gerado a partir dele |
body |
Formatação de texto: o corpo do HTML |
attachments |
Formatações de texto: [{ filename, fileKey, sendAsLink? }] para arquivos enviados (consulte os arquivos abaixo) ou [{ filename, url }] para um arquivo obtido via https no momento do envio do e-mail |
marketingTexts |
Os textos do rodapé de um layout de marketing, ou null. Veja abaixo |
O campo “Liquid” no assunto, no texto de pré-visualização, no corpo e em todos os blocos de texto deve ser analisado, e todos os links fileKey devem pertencer à sua loja; caso contrário, a gravação será recusada com um código de erro 400 que identifica o campo em questão. Leia GET /api/v1/layout-schema antes de criar um design visual: ele é gerado pelo próprio construtor, portanto não pode apresentar divergências.
Cada gravação realizada por meio desta API é mantida no histórico de versões do layout, exatamente como um salvamento no aplicativo.
Layouts transacionais e de marketing
category explica para que serve um layout. Um layout transacional é enviado a todos os destinatários, sem alterações. Um layout de marketing ignora os destinatários que cancelaram a inscrição (uma etapa em que a mensagem “Todos os destinatários do campo ‘Para’ cancelaram a inscrição” não é enviada e aparece como SKIPPED no histórico), é enviado como uma mensagem por destinatário do campo “Para”, com seu próprio link de cancelamento de inscrição (no máximo 20 por etapa), e termina com a frase de cancelamento de inscrição e os dados da sua empresa. {{ unsubscribe_url }} e {{ unsubscribe_link }} - insira o link você mesmo; nos layouts transacionais, ambos os campos ficam em branco. As informações para os lojistas sobre isso estão em E-mails de marketing e cancelamentos de inscrição.
marketingTexts é o texto do rodapé que um layout de marketing utiliza em vez dos textos aplicáveis a toda a loja, definidos em Configurações:
{
"marketingTexts": {
"unsubscribeText": "You get this because you shop with us. {{ unsubscribe_link }}",
"unsubscribeLinkLabel": "Unsubscribe",
"companyDetails": "Example GmbH, Musterstrasse 1, 10115 Berlin"
}
}Todos os campos são opcionais. Um campo definido substitui o texto de “Configurações” referente a esse campo; os demais permanecem inalterados. null (padrão) significa os textos de “Configurações” correspondentes ao idioma do e-mail. Limites: unsubscribeText e companyDetails: 2.000 caracteres; unsubscribeLinkLabel: 100. Um unsubscribeText deve conter {{ unsubscribe_link }} ou {{ unsubscribe_url }}; caso contrário, a gravação será recusada. O campo é armazenado para qualquer layout, mas só é enviado com layouts de marketing.
A exclusão de um layout nunca é bloqueada. Caso ainda haja etapas Shopify Flow que o indiquem, a resposta inclui um warning indicando quantas; essas etapas falharão até que utilizem outro layout.
Traduções
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/email-templates/:id/translations |
ler | Cada idioma de um layout com seu conteúdo |
| OBTER | /api/v1/email-templates/:id/translations/:locale |
ler | Um idioma |
| PUT | /api/v1/email-templates/:id/translations/:locale |
escrever | Criar ou substituir um idioma |
| EXCLUIR | /api/v1/email-templates/:id/translations/:locale |
escrever | Remova um idioma. Nesse caso, o sistema recorre ao layout padrão |
| POST | /api/v1/email-templates/:id/translations/:locale/promote |
escrever | Defina esse idioma como o idioma principal do layout |
:locale é um código de idioma, como de, fr ou pt-br; não importa se as letras estão em maiúsculas ou minúsculas, nem o separador. São permitidos até 30 idiomas por layout. O campo “Idioma” da etapa Shopify Flow seleciona um deles no momento do envio: a localidade exata, em seguida o idioma base, depois uma variante regional e, caso contrário, o próprio layout.
Um PUT recebe todo o conteúdo traduzido: subject (obrigatório), previewText e bodyDesign (visual) ou body (texto). Mantenha as tags Liquid e as URLs inalteradas. Dois campos são específicos para uma tradução:
| Campo | Formatação de texto | Significado |
|---|---|---|
attachments |
sim | Uma lista (com o mesmo formato do layout) = anexos próprios deste idioma, [] = nenhum neste idioma. null = enviar os anexos do layout. Omitido = manter a opção atual; um novo idioma utiliza os do layout. Os layouts visuais transportam seus anexos como blocos no bodyDesign de cada idioma e rejeitam este campo |
marketingTexts |
qualquer | Os textos do rodapé deste idioma são exibidos sobre os do layout, campo por campo. null = os do layout. “Omitido” = manter a escolha atual |
É retornada uma tradução com os mesmos dois campos: attachments é null, embora utilize o layout, e marketingTexts é null, embora utilize o layout.
promote troca o layout e a tradução: o layout assume o conteúdo e a localização da tradução, e o conteúdo que ele possuía passa a ser a tradução para o idioma em que estava anteriormente. Os anexos e os textos do rodapé também trocam de lugar, de modo que cada idioma continua enviando o que enviava anteriormente. A resposta informa promoted, previousMainLanguage e o layout. Trata-se de uma única versão, portanto, pode ser desfeita.
Versões
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/email-templates/:id/versions |
ler | Versões salvas, com as mais recentes em primeiro lugar. O aplicativo mantém as 25 mais recentes |
| OBTER | /api/v1/email-templates/:id/versions/:version |
ler | O instantâneo completo de uma versão: layout e todas as traduções |
| POST | /api/v1/email-templates/:id/versions/:version/restore |
escrever | Coloque essa versão de volta. Gravada como uma nova versão |
| OBTER | /api/v1/email-templates/:id/versions/github?page= |
ler | Todas as versões armazenadas no repositório do GitHub vinculado, 20 por página |
| OBTER | /api/v1/email-templates/:id/versions/github/:sha |
ler | O layout tal como estava em um commit |
| POST | /api/v1/email-templates/:id/versions/github/:sha/restore |
escrever | Reverter para uma versão anterior do GitHub, como se fosse um salvamento |
Os endpoints do GitHub retornam o código de erro 409 quando nenhum repositório está conectado na página do Desenvolvedor. Consulte Histórico de versões do layout e Mantenha um histórico ilimitado de layouts no GitHub.
Remetentes de e-mail
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/smtp-configs |
ler | Listar remetentes SMTP |
| OBTER | /api/v1/senders |
ler | Listar caixas de correio conectadas (Microsoft 365, Google) |
Os remetentes SMTP informam hasUsername e hasPassword em vez da credencial propriamente dita - ambas as partes são ocultadas, uma vez que o nome de usuário faz parte da credencial tanto quanto a senha. Um remetente permanece identificável por meio de seu nome, host e endereço de origem. As caixas de correio conectadas informam um endereço parcialmente mascarado, como so***@example.com, e nunca seus tokens de login.
Somente leitura. Conecte-se e edite os remetentes no aplicativo.
Segredos
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/secrets |
ler | Liste nomes secretos e descrições |
Retorna hasValue, nunca o valor. Não há nenhum endpoint que leia um segredo de volta. Crie e atualize segredos no aplicativo.
Arquivos enviados
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/files |
ler | Lista de logotipos, imagens e anexos enviados |
| EXCLUIR | /api/v1/files |
escrever | Excluir um, por key no corpo do texto |
A lista aceita page, limit (máximo de 100) e q para realizar pesquisas por nome de arquivo.
Adicione ?usage=true e cada arquivo também exibirá inUse, além de uma matriz usedBy que lista os layouts e predefinições que o referenciam. É assim que você identifica tudo o que pode ser excluído com segurança em uma única solicitação. O recurso verifica seus layouts e predefinições; portanto, é opcional e não vem ativado por padrão.
O envio de arquivos não está disponível aqui - adicione arquivos por meio do seletor de mídia do aplicativo.
Solicitações HTTP
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/http-requests |
ler | Listar solicitações HTTP |
| POST | /api/v1/http-requests |
escrever | Crie um |
| OBTER | /api/v1/http-requests/:id |
ler | Adquira um |
| PUT / PATCH | /api/v1/http-requests/:id |
escrever | Atualização 1 |
| EXCLUIR | /api/v1/http-requests/:id |
escrever | Excluir um |
| POST | /api/v1/http-requests/:id/test |
executar | Execute-o no alvo real |
A função “List” aceita os mesmos parâmetros page, limit e q que os layouts de e-mail.
O endereço de destino url deve ser http:// ou https://. Outros esquemas são rejeitados ao salvar.
As credenciais literais inseridas no cabeçalho ou no corpo são ocultadas em todas as respostas. Os valores referenciados como {{ secrets.KEY }} são retornados exatamente como foram escritos, pois a referência em si não contém informações confidenciais.
História e estatísticas
Abrange tanto o envio de e-mails quanto as solicitações HTTP.
| Método | Caminho | Nível | Objetivo |
|---|---|---|---|
| OBTER | /api/v1/history |
ler | Execuções de listas |
| OBTER | /api/v1/history/:id |
ler | Obter uma execução com os dados da solicitação e da resposta |
| OBTER | /api/v1/stats |
ler | Totais e taxa de sucesso |
A propriedade “history” aceita os valores page, limit (máximo de 100), actionType, status (PENDING, SUCCESS, FAILED, SKIPPED) e actionConfigId para filtrar por um único layout ou solicitação.
SKIPPED trata-se de um e-mail de marketing cujos destinatários haviam cancelado o recebimento: nada foi enviado, nenhuma cota foi utilizada e isso não conta para a taxa de sucesso.
actionType deve ser exatamente EMAIL ou HTTP_REQUEST. Um valor não reconhecido é ignorado, em vez de ser rejeitado; portanto, um erro de digitação retorna todos os resultados, em vez de gerar um erro.
O Stats aceita days (padrão: 30; máximo: 365).
Códigos de status
| Código | Significado |
|---|---|
| 200 | Sucesso |
| 201 | Criado |
| 400 | Solicitação inválida ou falha na validação. O parâmetro error indica o nome do campo; por exemplo, subject: required |
| 401 | Chave de API ausente, com formato incorreto ou revogada |
| 403 | A chave é válida, mas seu nível é muito baixo para este endpoint |
| 404 | Não encontrado ou pertence a outra loja |
| 405 | Método incorreto para este caminho |
| 409 | Recusado porque o registro ainda está em uso (exclusão de arquivo) ou porque o GitHub não está conectado (versões do GitHub) |
| 429 | Limitação de taxa - veja abaixo |
| 502 | A solicitação foi executada, mas o destino de terceiros apresentou falha |
Um registro pertencente a outra loja retorna o código 404 em vez de 403; portanto, a API nunca confirma se um ID existe em outro lugar.
Limites de taxa
Dois orçamentos independentes, ambos por chave:
- 300 solicitações a cada 60 segundos em todos os pontos de extremidade.
- Além disso, são realizadas 60 chamadas por hora, abrangendo
POST /api/v1/http-requests/:id/test.
O excedimento de qualquer um desses limites retorna o código 429, acompanhado da mensagem explicativa error. O orçamento de execução é deliberadamente restrito: um loop descontrolado que envia solicitações ativas a um provedor de pagamentos representa uma falha muito mais grave do que um script lento.
Os orçamentos são definidos por chave, e não por loja; portanto, uma integração não pode esgotar o limite de outra.

