API de Automações
Uma automação é um fluxo de trabalho composto por passos: um ou mais gatilhos que o iniciam, seguidos de ações, condições, atrasos, passos de IA e o restante, ligados num grafo. É a mesma automação que vê e edita na página de Automações. Este guia abrange a leitura e a criação das mesmas através da API.
- URL Base:
https://api.dmchamp.com/v1 - Autenticação: a sua chave de API (consulte Autenticação)
- Erros: consulte Erros e Paginação e Erros abaixo
Todos os exemplos abaixo mostram o formato de consulta ?apiKey= em cURL e o cabeçalho X-API-Key em JavaScript e Python. Qualquer um funciona em todos os endpoints.
Agências: todos os endpoints nesta página aceitam
sub_account_idcomo parâmetro de consulta, para que possa ler e criar as automações de um cliente com a sua chave de agência. Umsub_account_idque não seja uma das contas dos seus clientes devolve404. Consulte API para Agências.
Como funciona: primeiro o rascunho
A API foi concebida para que nada comece a ser executado por acidente.
- Leia o catálogo. O
GET /automations/stepslista todos os gatilhos, ações e tipos de passos que pode utilizar, além da gramática para escrever um grafo (graph_rules). - Crie um rascunho. O
POST /automationsarmazena a automação desativada. Nada é executado ainda. - Verifique-a. Leia-a novamente, abra-a no construtor (a resposta fornece-lhe o seu
open_path) e certifique-se de que o proprietário da conta viu o que ela faz e a quem se destina. - Ative-a. O
POST /automations/{automationId}/enableé uma chamada própria. Este é o passo que faz com que coisas reais aconteçam: mensagens enviadas, registos alterados, ferramentas fornecidas a um agente de IA.
A edição nunca altera o estado de uma automação (ligada ou desligada). Isto também significa que uma edição numa automação que está ligada entra em vigor imediatamente, na automação em tempo real. Para alterar uma automação em execução de forma segura, desative-a, edite-a, verifique-a e ative-a novamente.
Cada grafo que envia passa pelas mesmas verificações que o construtor aplica. Um grafo que não possa ser aberto ou executado é recusado com um 400 que lista exatamente o que deve ser corrigido.
Acesso
- A conta necessita de Automações. Sem isso, todas as chamadas nesta página devolvem
403. - O acesso de um membro da equipa segue a sua área de Automações na Gestão de Equipas: a leitura (listar, obter, passos, execuções, pastas) requer Ver, tudo o que altera algo requer Editar.
- Numa conta de cliente cujo plano exclui a criação e edição de automações, as chamadas de escrita devolvem
403, exatamente como o construtor faz na aplicação.
O objeto de automação
A lista devolve um resumo de cada automação, sem os seus passos:
{
"id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"enabled": false,
"updated_at": "2026-10-27T09:40:00.000Z",
"trigger_kind": "incoming_message",
"folder_id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708",
"folder_name": "Sales"
}
| Campo | Significado |
|---|---|
id |
O id da automação. |
name |
Como é chamada na lista. |
description |
Uma a três frases sobre o que faz, ou null. |
enabled |
Se está ligada. Uma automação desativada nunca é executada. |
updated_at |
Quando foi alterada pela última vez. |
trigger_kind |
O que a desencadeia, por exemplo incoming_message, schedule, webhook, agent_function ou manual. null quando o grafo ainda não tem gatilho. |
folder_id, folder_name |
A pasta onde está guardada, ou null se não tiver pasta. |
Ler uma automatização adiciona created_at e o seu graph:
{
"id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"enabled": false,
"created_at": "2026-10-27T09:12:00.000Z",
"updated_at": "2026-10-27T09:40:00.000Z",
"trigger_kind": "incoming_message",
"folder_id": null,
"folder_name": null,
"graph": {
"nodes": [
{
"id": "trigger_1",
"kind": "trigger",
"label": "Incoming message",
"alias": "incoming_message",
"action": "incoming_message",
"params": { "message_filter_contains": "price" },
"config": { "kind": "incoming_message", "message_filter_contains": "price" }
},
{
"id": "send_prices",
"kind": "action",
"label": "Send message",
"alias": "send_message",
"action": "SEND_MESSAGE",
"params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" },
"config": { "provider": "native", "slug": "SEND_MESSAGE", "params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" } }
}
],
"edges": [{ "from": "trigger_1", "to": "send_prices" }]
}
}
Cada passo (nodes[]) contém:
| Campo | Significado |
|---|---|
id |
O id do passo, único dentro do grafo. |
kind |
O tipo de passo: trigger, action, condition, transform, ai, delay, loop ou respond. Consulte Tipos de passo. |
label |
O nome apresentado no passo no construtor. |
alias |
O nome de referência do passo. Passos posteriores leem o seu output como ${nodes.<alias>.<field>}. null num passo que não tenha nenhum (é então referenciado pelo seu id). |
action |
O que o passo faz: a ação que executa, ou num passo de gatilho, o tipo de gatilho. null noutros passos. |
params |
Os parâmetros da ação num passo de ação, ou as definições do gatilho num passo de gatilho. null em qualquer outro tipo. Mantido para leitores mais antigos: config contém os mesmos valores e mais. |
config |
As definições completas do passo tal como o construtor as armazena, para cada tipo de passo: as regras de uma condição, o prompt de um passo de IA, a duração de um atraso, o slug e os parâmetros de uma ação. |
Cada ligação (edges[]) tem from e to (ids de passo), e branch quando segue um ramo de um passo, por exemplo true ou false após uma condição.
Duas coisas em config são alteradas na saída:
- Os segredos são ocultados. Valores que parecem credenciais (segredos de webhook, tokens, chaves de API, palavras-passe, valores de cabeçalho) são devolvidos como
"[redacted]". Envie"[redacted]"de volta inalterado e o valor armazenado será mantido. - Textos longos são encurtados. Um texto único com mais de cerca de 4.000 caracteres é cortado e termina com reticências. Se enviar esse passo de volta, coloque primeiro o seu texto completo.
Listar automatizações
GET /automations devolve as automatizações na conta, da mais recentemente alterada para a mais antiga, como resumos (sem passos).
Parâmetros de consulta (todos opcionais): folder_id (apenas as automatizações nessa pasta, um id de Listar pastas, ou none para as que não estão em nenhuma pasta), sub_account_id.
cURL
curl "https://api.dmchamp.com/v1/automations?apiKey=YOUR_API_KEY&folder_id=none"
JavaScript
const res = await fetch("https://api.dmchamp.com/v1/automations?folder_id=none", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { automations } = await res.json();
Python
res = requests.get(
"https://api.dmchamp.com/v1/automations",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"folder_id": "none"},
)
automations = res.json()["automations"]
Resposta (200)
{ "success": true, "automations": [{ "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "...": "..." }] }
Se o serviço de automatização não puder ser contactado, receberá um 503, nunca uma lista vazia em seu lugar. Uma lista vazia significa sempre que não existem automatizações.
Obter uma automatização
GET /automations/{automationId} devolve uma automatização com o seu grafo completo: o tipo, etiqueta, alias, ação, parâmetros e definições de cada passo, além das ligações entre eles.
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f?apiKey=YOUR_API_KEY"
const res = await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { automation } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
headers={"X-API-Key": "YOUR_API_KEY"},
)
automation = res.json()["automation"]
Resposta (200)
{ "success": true, "automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "graph": { "nodes": ["..."], "edges": ["..."] } } }
Um id que não exista nesta conta devolve 404.
Catálogo de passos
GET /automations/steps devolve tudo o que pode ser utilizado para construir uma automatização:
node_kinds: os 8 tipos de passo, cada um com uma etiqueta e uma descrição.triggers: todos os gatilhos que podem iniciar uma automatização, com os seus campos de definições (fields) e os valores que transmitem aos passos seguintes (output_keys).actions: as ações integradas que um passo de ação pode executar, cada uma com o seukey(o slug que utiliza num gráfico) e os seusparams, marcadosrequiredonde se encontram.api_actions: as operações desta API que um passo de ação pode chamar. Semq, estas surgem como etiquetas agrupadas por área emapi_actions_by_tag, e a lista simples fica vazia, uma vez que existem várias centenas delas.graph_rules: a gramática para escrever um gráfico: os dados que cada tipo de passo transporta, cada tipo de gatilho com as suas chaves de definições, os fornecedores de ações, os nomes das ramificações e a sintaxe do modelo. Leia-a antes de criar ou editar um.counts: os totais por lista, independentemente do que pesquisou.
Isto é o que o construtor oferece, não o que a conta construiu. Verifique isto antes de concluir que um gatilho ou ação não existe.
Parâmetros de consulta (todos opcionais): q, uma palavra para pesquisar em todas as listas (insensível a maiúsculas/minúsculas), e sub_account_id.
Com q:
api_actionsé a lista simples de correspondências, limitada a 60.api_actions_truncatedétruequando o limite é aplicado. As primeiras correspondências transportam os seus parâmetros.- As ações para aplicações de terceiros ligadas também são pesquisadas e devolvidas em
app_actions. Pesquise pelo nome da aplicação, por exemploq=hubspot. Cada uma indica se a conta tem essa aplicação ligada (connected), econnected_appslista as aplicações que a conta tem ligadas. app_actions_unavailableétruequando as ações da aplicação não puderam ser pesquisadas desta vez. As outras listas continuam completas.
curl "https://api.dmchamp.com/v1/automations/steps?apiKey=YOUR_API_KEY&q=tag"
const res = await fetch("https://api.dmchamp.com/v1/automations/steps?q=tag", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { triggers, actions, graph_rules } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/steps",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"q": "tag"},
)
catalogue = res.json()
Resposta (200, abreviada)
{
"success": true,
"q": "tag",
"node_kinds": [{ "kind": "trigger", "label": "Trigger", "description": "Starts the automation when an event happens." }],
"triggers": [
{
"kind": "tag_applied",
"label": "Tag applied",
"group": "Contacts",
"fields": ["tag_name", "channel", "applied_by"],
"output_keys": ["contact.id", "contact.first_name", "..."]
}
],
"actions": [
{
"key": "SET_CONTACT_TAG",
"label": "Set contact tag",
"group": "Contacts",
"provider": "native",
"params": [{ "key": "contact_id", "required": true }, { "key": "tag", "required": true }]
}
],
"api_actions": ["..."],
"app_actions": [],
"graph_rules": "GRAPH: { nodes: [{ id, type, label?, data }], edges: [{ source, target, sourceHandle? }] } ...",
"counts": { "node_kinds": 8, "triggers": 40, "actions": 44, "api_actions": 454 }
}
As listas de tipos de passo e gatilhos abaixo são retiradas deste endpoint. O próprio endpoint é sempre a lista atual.
Criar uma automatização
POST /automations cria uma automatização a partir de um nome e de um gráfico. É guardada desativada, como um rascunho.
Corpo
| Campo | Obrigatório | Significado |
|---|---|---|
name |
Sim | Como é designado na lista. Curto e específico. |
description |
Não | Uma a três frases sobre o que faz e quando é executado. |
graph |
Sim | { nodes, edges }, ver abaixo. |
folder_id |
Não | A pasta onde a guardar, um id de Listar pastas. Se for omitido ou null, não vai para nenhuma pasta. |
O gráfico. graph_rules do catálogo de passos é a gramática completa. Em resumo:
- Cada nó tem um
id(único no gráfico, por exemplotrigger_1ousend_reminder), umtype(um dos 8 tipos de passo), umlabelopcional e as suas definições emdata, sob uma chave com o nome do seu tipo:data.trigger = { kind, ... },data.action = { provider, slug, params },data.condition = { ... },data.delay = { seconds },data.ai = { prompt },data.loop = { over },data.transform = { language, code },data.respond = { status, body, content_type }. - Uma automatização necessita de pelo menos um gatilho. A gramática ativa permite até 10, e a automatização inicia-se quando qualquer um deles é disparado.
- Todos os outros passos devem ser alcançáveis a partir de um gatilho, e nenhuma ligação pode conduzir a um passo anterior.
- Cada aresta tem um
sourcee umtarget. As arestas que saem de uma condição transportamsourceHandletrueoufalse. As arestas que saem de um ciclo transportambodyoudone. As arestas que saem de um atraso de “Aguardar resposta” transportamrepliedoutimed_out. Outras arestas não têmsourceHandle; a gramática lista o resto. - Os slugs e parâmetros de ação provêm do catálogo. Nunca adivinhe um id (um agente, uma etiqueta, uma lista, uma fase): procure-o primeiro com a API, ou deixe o campo como
""para a pessoa escolher no construtor. - As posições são opcionais. Os passos sem posição são dispostos automaticamente.
- Os valores de passos anteriores são escritos como
${trigger.<field>}e${nodes.<step>.<field>}. Consulte Utilizar o que um passo anterior devolveu e Expressões no guia de Automatizações.
O gráfico é aceite em duas grafias: a do próprio construtor (nós com type e data, arestas com source e target, como abaixo) e a que Obter uma automatização responde (nós com kind, config, action, params; arestas com from, to, branch). Assim, pode ler uma automatização, alterar um passo e enviá-la de volta.
curl -X POST "https://api.dmchamp.com/v1/automations?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Price question auto-reply",
"description": "Replies with the price list when someone asks about prices.",
"graph": {
"nodes": [
{ "id": "trigger_1", "type": "trigger", "label": "Incoming message",
"data": { "trigger": { "kind": "incoming_message", "message_filter_contains": "price" } } },
{ "id": "send_prices", "type": "action", "label": "Send message",
"data": { "action": { "provider": "native", "slug": "SEND_MESSAGE",
"params": { "contact_id": "${trigger.contact.id}", "body": "Hi ${trigger.contact.first_name}, here is our price list: https://example.com/prices" } } } }
],
"edges": [{ "source": "trigger_1", "target": "send_prices" }]
}
}'
const res = await fetch("https://api.dmchamp.com/v1/automations", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ name: "Price question auto-reply", graph: { nodes, edges } }),
});
const { automation, draft, open_path, warnings } = await res.json();
res = requests.post(
"https://api.dmchamp.com/v1/automations",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"name": "Price question auto-reply", "graph": {"nodes": nodes, "edges": edges}},
)
draft = res.json()
Resposta (201)
{
"success": true,
"automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": false, "graph": { "...": "..." } },
"draft": true,
"open_path": "/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f",
"warnings": []
}
automationé a automatização tal como está guardada, com a mesma forma que Obter uma automatização.draftétrueenquanto está desativada. Uma nova automatização é sempre um rascunho até a ativar, pelo queenabled: falseaqui é normal, não uma falha.open_pathé onde se abre no construtor da aplicação.warningslista as coisas que o construtor não conseguiu concluir, como etiquetas curtas (por exemploagent_function:not_linked). Fica vazio quando tudo está correto.
Uma criação não é segura para repetir cegamente. Se um pedido exceder o tempo limite, liste as suas automatizações antes de o enviar novamente, ou poderá acabar com dois rascunhos.
Atualizar uma automatização
PUT /automations/{automationId} altera o nome, a descrição e/ou o gráfico. Envie apenas os campos que pretende alterar.
Corpo: name, description, graph (todos opcionais, pelo menos um).
Um graph substitui o gráfico todo, por isso trabalhe sempre a partir do que está guardado:
- Leia a automatização com
GET /automations/{automationId}. - Altere o que for necessário nesse gráfico.
- Envie o gráfico completo de volta, incluindo todos os passos.
Quando o enviar de volta:
- Mantenha o
aliasde cada passo exatamente como o recebeu. Os passos seguintes referem-se a um passo pelo seu alias (${nodes.<alias>.<field>}). Se o alterar ou remover, todas as referências a esse passo ficarão vazias. Consulte Nomear os seus passos. - Deixe os valores
"[redacted]"como estão. Um valor apresentado como"[redacted]"mantém o seu valor armazenado. - Restaure textos encurtados. Um texto que tenha sido devolvido com reticências no final foi cortado na leitura.
O estado de ativação da automatização nunca é alterado aqui. Se estiver ativa, a sua edição entra em vigor assim que for guardada. Enquanto uma automatização estiver ativa, qualquer alteração que a leve a disparar a si própria será recusada: desative-a primeiro.
curl -X PUT "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Price question auto-reply (EN)" }'
// Read, edit, send back the whole graph
const get = await fetch(`https://api.dmchamp.com/v1/automations/${id}`, { headers: { "X-API-Key": "YOUR_API_KEY" } });
const { automation } = await get.json();
const step = automation.graph.nodes.find((n) => n.id === "send_prices");
step.config.params.body = "Hi ${trigger.contact.first_name}, our new price list: https://example.com/prices";
await fetch(`https://api.dmchamp.com/v1/automations/${id}`, {
method: "PUT",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ graph: automation.graph }),
});
url = f"https://api.dmchamp.com/v1/automations/{automation_id}"
automation = requests.get(url, headers={"X-API-Key": "YOUR_API_KEY"}).json()["automation"]
# ...edit automation["graph"] here, keeping every alias...
requests.put(url, headers={"X-API-Key": "YOUR_API_KEY"}, json={"graph": automation["graph"]})
Resposta (200): com a mesma estrutura de uma criação (automation, draft, open_path, warnings). O envio de nenhum dos campos name, description ou graph devolve 400.
Ativar e desativar
POST /automations/{automationId}/enable liga uma automatização, para que esta seja executada a partir do seu acionador a partir de agora. Chame-o apenas quando o titular da conta tiver visto o que a automatização faz e a quem se destina, e tiver concordado em ligá-la. O construtor recusa-se a ligar um gráfico que não pode ser executado (sem acionador, um ciclo, um passo que dispara a si próprio) com um 400 que explica o motivo.
POST /automations/{automationId}/disable desliga-a (coloca-a em pausa). As execuções já em curso terminam; não se iniciam novas execuções. A desativação é sempre permitida.
Nenhuma das chamadas requer um corpo.
curl -X POST "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/enable?apiKey=YOUR_API_KEY"
await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/disable", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
requests.post(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/enable",
headers={"X-API-Key": "YOUR_API_KEY"},
)
Resposta (200): a automatização tal como está armazenada agora, com a mesma estrutura de uma criação, com draft: false após uma ativação.
Histórico de execuções
GET /automations/{automationId}/runs devolve as execuções de uma automatização, da mais recente para a mais antiga: quando cada execução começou e terminou, o que a desencadeou, se foi bem-sucedida e o erro caso tenha falhado. Ler a automatização diz-lhe o que ela faria. O histórico de execuções diz-lhe o que ela fez, e é a única forma de distinguir uma automatização que nunca foi executada de uma que é executada e falha sempre.
Parâmetros de consulta (todos opcionais): limit (1 a 50, predefinição 10), sub_account_id.
curl "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs?apiKey=YOUR_API_KEY&limit=20"
const res = await fetch("https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs?limit=20", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { runs, note } = await res.json();
res = requests.get(
"https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/runs",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 20},
)
runs = res.json()["runs"]
Resposta (200)
{
"success": true,
"automation": { "id": "8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f", "name": "Price question auto-reply", "enabled": true, "trigger_kind": "incoming_message" },
"runs": [
{
"id": "run_7f3a",
"status": "failed",
"trigger_source": "incoming_message",
"started_at": "2026-10-27T10:02:11.000Z",
"finished_at": "2026-10-27T10:02:12.000Z",
"error": "Contact is on Do Not Disturb list",
"cancel_reason": null,
"mode": "live"
}
]
}
modeélivepara uma execução real, ousafepara uma Execução segura a partir do editor. Uma Execução segura não envia nada, por isso não é prova de que a automatização funciona numa utilização real.- Uma lista
runsvazia é uma resposta, não uma falha. A resposta contém então umnote: ou o acionador nunca foi disparado, ou a automatização está desligada, pelo que nada foi executado.
Pastas
As pastas apenas agrupam automatizações na lista. Nunca alteram o que uma automatização faz ou se está ligada. Consulte Organizar automatizações em pastas.
Listar pastas
GET /automations/folders devolve as pastas, cada uma com o número de automatizações que contém, além de unfiled_count: quantas automatizações não estão em nenhuma pasta.
curl "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY"
{
"success": true,
"folders": [{ "id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708", "name": "Sales", "automation_count": 3 }],
"unfiled_count": 5
}
Criar uma pasta
POST /automations/folders com { "name": "Appointment reminders" }. O nome é obrigatório, pode ter até 100 caracteres e tem de ser único na conta. Organize as automatizações nelas com Mover uma automatização, ou passe folder_id ao criar uma.
curl -X POST "https://api.dmchamp.com/v1/automations/folders?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Appointment reminders" }'
Resposta (201): { "success": true, "folder": { "id": "...", "name": "Appointment reminders", "automation_count": 0 } }. Um nome que outra pasta já tenha devolve 409 com code: "folder_name_taken".
Mudar o nome de uma pasta
PUT /automations/folders/{folderId} com { "name": "..." }. As automatizações nela contidas permanecem onde estão.
Resposta (200): { "success": true, "folder": { ... } }.
Eliminar uma pasta
DELETE /automations/folders/{folderId} elimina apenas a pasta. As automatizações nela contidas não são eliminadas: movem-se para fora de qualquer pasta e continuam a ser executadas exatamente como antes.
curl -X DELETE "https://api.dmchamp.com/v1/automations/folders/f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708?apiKey=YOUR_API_KEY"
{ "success": true, "deleted": true, "moved_to_no_folder": 3, "message": "Folder deleted. 3 automations were moved to No folder; no automation was deleted." }
Mover uma automatização para uma pasta
PUT /automations/{automationId}/folder com { "folder_id": "<folder id>" }, ou { "folder_id": null } para a retirar da sua pasta. folder_id é obrigatório. Apenas o local onde a automatização está listada é alterado.
curl -X PUT "https://api.dmchamp.com/v1/automations/8d2c7f1e-2a3b-4c5d-9e8f-0a1b2c3d4e5f/folder?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "folder_id": "f1a2b3c4-5d6e-7f80-91a2-b3c4d5e6f708" }'
Resposta (200): { "success": true, "automation_id": "...", "folder_id": "..." }.
Catálogo
Tipos de passos
| Tipo | O que faz |
|---|---|
trigger |
Inicia a automatização quando algo acontece. |
action |
Executa um passo: uma ação integrada, uma ação de API, a ação de uma aplicação ligada, um pedido HTTP ou um e-mail. |
condition |
Divide o fluxo com base numa regra, num ramo true e num ramo false. |
transform |
Executa um pequeno pedaço de código para reformatar dados entre passos. |
ai |
Questiona a IA com um prompt que escreve. Pode devolver texto, campos separados ou escolher um de vários ramos. |
delay |
Aguarda por um tempo definido ou aguarda que o contacto responda (com um tempo limite). |
loop |
Repete os passos contidos no seu interior para cada item numa lista. |
respond |
Devolve uma resposta à chamada de webhook ou à chamada de função do agente de IA que iniciou a execução. |
Gatilhos
Estes são os 40 gatilhos que o catálogo lista atualmente, agrupados conforme o construtor os agrupa. A coluna Definições contém as chaves de definições próprias do gatilho (fields), que restringem o momento em que este é ativado. Cada gatilho também aceita respect_quiet_hours, run_hours, reentry e stop_on_response; consulte Definições de automatização.
Mensagens
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Mensagem recebida (incoming_message) |
Um contacto envia uma mensagem em qualquer canal. | campaign (limita-o a um agente de IA), channel, message_filter_contains (palavra-chave), message_filter_regex (padrão) |
Chamada perdida (missed_call) |
Alguém liga para um dos seus números de WhatsApp Web ou para o seu próprio número de SMS e ninguém atende. | to_number |
Mensagem entregue (message_delivered) |
Uma mensagem que enviou é confirmada como entregue pelo canal. | channel, agent |
Falha na mensagem (message_failed) |
Uma mensagem que enviou não pôde ser entregue, com o erro. | channel, agent |
Mensagem enviada (message_sent) |
Qualquer mensagem sai da sua conta: a da IA, a sua, uma difusão, um seguimento. Filtre-a, ou será executada em todas elas. | channel, sent_by |
Seguimento enviado (follow_up_sent) |
Um seguimento automático é enviado. | nenhum |
Seguimento ignorado (follow_up_skipped) |
Um seguimento foi retido porque a sua condição de envio falhou. | nenhum |
Seguimentos concluídos (follow_up_exhausted) |
Um contacto recebeu o último seguimento da sequência e não há mais nada na fila. | nenhum |
Conversa fechada (conversation_closed) |
Um chat é fechado, com a forma como terminou e um resumo. | channel, agent |
Difusão concluída (broadcast_completed) |
Uma difusão terminou de ser enviada, com o número de mensagens enviadas e o número de falhas. | nenhum |
Resposta de lead classificada (outreach_reply_labelled) |
A resposta de um lead de e-mail frio é classificada, por exemplo, como Interessado. | label |
Comentário Skool recebido (skool_comment_received) |
Um membro comenta numa publicação Skool que uma das suas regras de comentário monitoriza. | nenhum |
Contactos
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Novo contacto (contact_created) |
Uma nova pessoa contacta-o pela primeira vez em qualquer canal, e também para importações, a API e contactos que cria manualmente. | nenhum |
Contacto atualizado (contact_updated) |
Um campo de contacto é alterado. | field |
Contactos que adiciona aqui (contact_added) |
Apenas para contactos que coloca nesta automatização pessoalmente a partir da página Contactos. Uma execução por contacto. | nenhum |
Etiqueta aplicada (tag_applied) |
Uma etiqueta é adicionada a um contacto, pelo seu agente de IA, por uma pessoa, por uma automatização ou por uma importação. | tag_name, channel, applied_by |
Etiqueta removida (tag_removed) |
Uma etiqueta é removida de um contacto. | tag_name, channel |
Membro Skool entrou (skool_member_joined) |
Alguém entra numa comunidade Skool que possui ou gere, com o seu perfil, respostas e pontuação de adequação. | group_id, create_contact |
Membro Skool qualificado (skool_member_qualified) |
As respostas de um novo membro Skool atingem ou superam o seu limite. | min_score |
Negócios
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Negócio criado (deal_created) |
Um novo negócio é adicionado a um dos seus funis. | pipeline_id, stage_id |
Fase do negócio alterada (deal_stage_changed) |
Um negócio move-se para uma fase diferente, indicando a fase que deixou e a que entrou. | pipeline_id, to_stage_id, from_stage_id |
Negócio atualizado (deal_updated) |
Um campo de negócio é alterado. | field |
Marcações
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Marcação agendada (appointment_booked) |
Uma nova marcação é agendada. | nenhum |
Marcação cancelada (appointment_cancelled) |
Uma marcação agendada é cancelada. | nenhum |
Marcação reagendada (appointment_rescheduled) |
Uma marcação agendada é movida para outra hora, com a hora antiga ao lado da nova. | event_id |
Antes de uma marcação (appointment_upcoming) |
Um tempo definido antes de cada marcação confirmada, para lembretes. Até cinco lembretes por automatização. | offsets_minutes |
Tarefas
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Tarefa criada (task_created) |
Uma tarefa é criada. | task_type |
Tarefa concluída (task_completed) |
Uma tarefa é movida para uma fase de concluída. | nenhum |
Conta
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Saldo de créditos baixo (low_credit_balance) |
O seu saldo de créditos desce abaixo do seu limite de alerta. | nenhum |
Canal ligado (channel_connected) |
Um dos seus canais termina a ligação. | channel |
Canal desligado (channel_disconnected) |
Um dos seus canais cai: sessão terminada, desvinculado ou cortado. Um número de WhatsApp Web que se volta a ligar sozinho só conta se ainda estiver em baixo após 30 minutos. | channel |
Agência
Gatilho (kind) |
Ativado quando | Definições |
|---|---|---|
Subconta criada (sub_account_created) |
Uma nova conta de cliente é criada, a partir do seu painel, da API ou da sua página de registo. | nenhum |
Atividade da subconta (sub_account_event) |
Algo acontece numa das suas contas de cliente: créditos a esgotar, um canal a ligar-se, uma alteração de plano. | event, threshold |
Geral e aplicações
Acionador (kind) |
Dispara quando | Definições |
|---|---|---|
Agendado (schedule) |
Num agendamento cron. | cron, timezone |
Webhook (webhook) |
Um sistema externo chama o endereço de webhook da automatização. | webhook_secret |
Função de Agente de IA (agent_function) |
O seu agente de IA chama esta automatização como uma função durante uma conversa. | function_name, function_description, parameters, agent_ids, campaign_ids |
Novo item de feed (rss) |
Um novo item aparece num feed RSS ou Atom. | feed_url |
E-mail recebido (email_received) |
Um e-mail chega à sua caixa de correio ligada. | from_contains, subject_contains |
Evento de aplicação (app_event) |
Algo acontece numa aplicação ligada: uma fase de negócio muda, um pagamento é recebido, um formulário é submetido. | toolkit, trigger_slug, connected_account_id, config |
Execução manual (manual) |
Apenas quando iniciada manualmente. | nenhum |
Uma automatização pode conter, no máximo, um acionador de cada tipo: webhook, app_event, agent_function, rss, schedule, email_received, appointment_upcoming e contact_added. Um acionador que dispara quando um registo é criado não pode ser emparelhado com a ação que cria o mesmo registo, porque a automatização dispararia sobre si própria.
Para saber o que cada acionador transmite para os passos seguintes (output_keys) e para obter a lista completa de ações com os seus parâmetros, leia GET /automations/steps. O Guia de Automatizações explica cada acionador nos termos do construtor.
Erros
Todos os erros têm a estrutura habitual { "success": false, "error_code": <status>, "error": "..." }. Um grafo recusado adiciona code e errors:
{
"success": false,
"error_code": 400,
"code": "invalid_graph",
"error": "<the first problem, as one sentence>",
"errors": ["<the first problem, as one sentence>", "<the next problem>"]
}
errors lista todos os problemas, cada um com uma frase de correção, e error é o primeiro. Corrija exatamente o que está listado e envie o grafo completo novamente. code é um de invalid_graph, automation_graph_has_a_cycle, self_triggering_automation, no_trigger ou outro código do construtor.
| Estado | Quando |
|---|---|
400 |
O grafo foi recusado (ver acima), falta um campo obrigatório (name ou graph numa criação, folder_id numa movimentação), uma atualização não enviou nada para alterar, um ID de automatização ou pasta não é válido, ou um nome de pasta está em falta, vazio ou é demasiado longo (code: "invalid_name"). |
403 |
A conta não tem Automatizações; o plano de uma conta de cliente não inclui a criação e edição de automatizações (apenas escrita); ou o acesso do membro da equipa a Automatizações é demasiado limitado (Ver para leitura, Editar para escrita). |
404 |
Não existe nenhuma automatização com esse ID nesta conta, não existe nenhuma pasta com esse ID (code: "folder_not_found"), ou um sub_account_id que não é uma das suas contas de cliente. |
409 |
Já existe uma pasta com esse nome (code: "folder_name_taken"). |
413 |
A automatização é maior do que o 1 MB que o construtor aceita. Mova código ou dados grandes para fora dos seus passos. |
422 |
O construtor rejeitou o pedido por outro motivo. Verifique o grafo em relação a GET /automations/steps; enviar o mesmo pedido novamente não ajudará. |
503 |
Não foi possível contactar o serviço de automatização. Tente novamente dentro de momentos. Para uma criação, liste primeiro as suas automatizações para não criar um segundo rascunho. |
Utilizar estes endpoints via MCP
Todos os endpoints nesta página são também uma ferramenta para um assistente de IA que liga via MCP, com as mesmas regras: uma nova automatização é um rascunho até ser ativada, e uma edição a uma automatização em execução entra em vigor imediatamente.
| Ferramenta | Endpoint |
|---|---|
list_automations |
GET /automations |
get_automation |
GET /automations/{automationId} |
list_automation_steps |
GET /automations/steps |
create_automation |
POST /automations |
update_automation |
PUT /automations/{automationId} |
enable_automation |
POST /automations/{automationId}/enable |
disable_automation |
POST /automations/{automationId}/disable |
list_automation_runs |
GET /automations/{automationId}/runs |
list_automation_folders |
GET /automations/folders |
create_automation_folder |
POST /automations/folders |
rename_automation_folder |
PUT /automations/folders/{folderId} |
delete_automation_folder |
DELETE /automations/folders/{folderId} |
move_automation_to_folder |
PUT /automations/{automationId}/folder |
Próximos passos
- Automatizações: como funcionam os acionadores, passos, variáveis e o histórico de execução no construtor.
- API para Agências: crie automatizações numa conta de cliente com
sub_account_id. - Referência da API: o explorador interativo completo de endpoints.