DM Champ Docs

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.

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_id como parâmetro de consulta, para que possa ler e criar as automações de um cliente com a sua chave de agência. Um sub_account_id que não seja uma das contas dos seus clientes devolve 404. Consulte API para Agências.


Como funciona: primeiro o rascunho

A API foi concebida para que nada comece a ser executado por acidente.

  1. Leia o catálogo. O GET /automations/steps lista todos os gatilhos, ações e tipos de passos que pode utilizar, além da gramática para escrever um grafo (graph_rules).
  2. Crie um rascunho. O POST /automations armazena a automação desativada. Nada é executado ainda.
  3. 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.
  4. 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 seu key (o slug que utiliza num gráfico) e os seus params, marcados required onde se encontram.
  • api_actions: as operações desta API que um passo de ação pode chamar. Sem q, estas surgem como etiquetas agrupadas por área em api_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 é true quando 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 exemplo q=hubspot. Cada uma indica se a conta tem essa aplicação ligada (connected), e connected_apps lista as aplicações que a conta tem ligadas.
  • app_actions_unavailable é true quando 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 exemplo trigger_1 ou send_reminder), um type (um dos 8 tipos de passo), um label opcional e as suas definições em data, 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 source e um target. As arestas que saem de uma condição transportam sourceHandle true ou false. As arestas que saem de um ciclo transportam body ou done. As arestas que saem de um atraso de “Aguardar resposta” transportam replied ou timed_out. Outras arestas não têm sourceHandle; 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 é true enquanto está desativada. Uma nova automatização é sempre um rascunho até a ativar, pelo que enabled: false aqui é normal, não uma falha.
  • open_path é onde se abre no construtor da aplicação.
  • warnings lista as coisas que o construtor não conseguiu concluir, como etiquetas curtas (por exemplo agent_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:

  1. Leia a automatização com GET /automations/{automationId}.
  2. Altere o que for necessário nesse gráfico.
  3. Envie o gráfico completo de volta, incluindo todos os passos.

Quando o enviar de volta:

  • Mantenha o alias de 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 é live para uma execução real, ou safe para 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 runs vazia é uma resposta, não uma falha. A resposta contém então um note: 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": "..." }.


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.