Rotas de API
Referência técnica da API REST externa da plataforma, onde conseguir suas credenciais, o que cada rota espera receber e o que ela devolve, limites de uso e um testador interativo para experimentar as chamadas sem sair da documentação.
Visão geral do serviço
A API externa é um serviço próprio, separado da interface web, feito para sistemas de terceiros integrarem com a plataforma sem depender de sessão de navegador: um ERP disparando execuções, um orquestrador consultando status, um painel externo lendo histórico de resultados.
Todas as rotas ficam sob o caminho base /v1, publicado em https://api.browsermate.io:8443. Esse é o endereço padrão do serviço, já preenchido em URL Base no testador, mais abaixo.
Onde obter suas credenciais
O guia completo de geração e gestão das duas credenciais está em Chaves de API. Aqui vai um resumo direto ao ponto. São duas credenciais diferentes, geradas em dois lugares diferentes da plataforma. Nenhuma delas expõe qualquer identificador interno de outro usuário. Em particular, você nunca precisa saber ou informar quem é o dono de um processo: se ele foi compartilhado com você, a API descobre isso sozinha a partir do seu próprio compartilhamento.
1. Credencial de conta: identifica quem está chamando
Vale para todas as chamadas. É a sua identidade perante a API.
- No Menu, acesse Credenciais de API.
- Clique em Gerar credencial e dê um nome (Label) que identifique o sistema que vai usá-la. Ex.:
ERP Produção. - Copie o valor completo mostrado, no formato
bm_live_<prefixo>.<segredo>. Ele só aparece uma vez, nesta tela, logo após a criação. - Use esse valor completo no header
Authorization: Bearer bm_live_...em toda chamada.
2. Chave do processo: libera uma automação específica
Vale só para chamadas sobre aquele processo. É a mesma chave descrita em Chaves de API.
- Na tela Meus Agentes, no card do processo, clique no ícone ⇄ APIs.
- Preencha um Identificador, que vira o rótulo do "executor" registrado na trilha de auditoria de cada chamada feita com essa chave, e clique em Gerar Código.
- Copie o código gerado e use-o no header
X-Process-Keynas chamadas sobre este processo. - Confirme que a Permissão de Acesso das APIs do processo está em LIBERADO. Sem isso, a chave não funciona mesmo sendo válida.
Como as credenciais são usadas
| Header | Credencial | Quando enviar |
|---|---|---|
Authorization: Bearer bm_live_... |
Credencial de conta | Sempre, em toda rota, exceto GET /ping |
X-Process-Key: <código> |
Chave do processo | Só nas rotas que operam sobre um processo específico: detalhes, matrix, histórico, disparo de execução e criação de agendamento |
Idempotency-Key: <chave sua> |
Definida por você (não é gerada pela plataforma) | Opcional, só em POST /processes/:pid/start. Ver Limites e controles |
Veja em Catálogo de rotas o resumo de cabeçalhos exigidos por cada rota, e um exemplo de requisição completa (com todos os headers) para cada uma.
Formato de respostas e erros
Erros sempre voltam no mesmo formato, com um código estável para tratamento automático e uma mensagem legível:
{
"error": {
"code": "PROCESS_KEY_EXPIRED",
"message": "Chave de API do processo expirada."
}
}
| HTTP | Código | Situação |
|---|---|---|
| 400 | INVALID_PROCESS_ID, INVALID_MATRIX, INVALID_ACTION, INVALID_NAME, INVALID_CRON | Parâmetro ausente ou em formato inválido |
| 401 | MISSING_CREDENTIAL, INVALID_CREDENTIAL, CREDENTIAL_REVOKED, CREDENTIAL_EXPIRED | Problema com a credencial de conta |
| 401 | MISSING_PROCESS_KEY, INVALID_PROCESS_KEY, PROCESS_KEY_REVOKED, PROCESS_KEY_EXPIRED | Problema com a chave do processo |
| 402 | PLAN_FEATURE_UNAVAILABLE | O plano atual da conta não inclui o recurso que a chamada pediu: acesso à API externa (vale para toda rota) ou agendamento de execuções (rotas de /schedules). A credencial continua válida, mas a chamada não executa até um upgrade de plano (ver Créditos). A mensagem devolvida diz qual dos dois faltou |
| 403 | FORBIDDEN | Sua conta não tem vínculo com o processo (não é dono nem foi compartilhado com ela), ou o compartilhamento não inclui a permissão exigida pela rota |
| 403 | API_DISABLED | O processo existe e você tem acesso a ele, mas o acesso via API está BLOQUEADO |
| 403 | OWNER_INACTIVE | O dono do processo está sem acesso ativo na plataforma, por bloqueio do administrador da empresa ou por suspensão do plano. A execução não chega a ser enfileirada, e repetir a chamada não resolve enquanto o acesso não for restabelecido |
| 402 | INSUFFICIENT_CREDITS | A empresa dona do processo está sem saldo de créditos no plano atual (ver Créditos). A execução não chega a ser enfileirada, e repetir a chamada não resolve até o próximo reset mensal ou um upgrade de plano |
| 404 | PROCESS_NOT_FOUND, INSTANCE_NOT_FOUND, SCHEDULE_NOT_FOUND, NOT_FOUND | Recurso inexistente ou fora do alcance da sua conta |
| 409 | INSTANCE_FINISHED, INSTANCE_UNRESOLVED | Ação de controle não se aplica ao estado atual da instância |
| 409 | PROCESS_NOT_PUBLISHED | O processo ainda não tem versão publicada em produção, então não há etapa a executar. Vale para o start, o webhook e o agendamento: nada é enfileirado, e repetir a chamada não resolve até o dono publicar a primeira versão no editor |
| 429 | RATE_LIMITED | Limite de requisições excedido. Ver Limites e controles |
| 502 | ROUTER_ERROR | Falha ao enfileirar a execução no runtime de destino |
| 400 | INVALID_ENVIRONMENT | O runtime de destino não existe, está fora do alcance do dono do processo, não tem instalação no ambiente da execução (Desenvolvimento, Homologação ou Produção) ou tem essa instalação suspensa pelo plano. Também sai quando stage tem um valor fora de dev, staging e prod. Vale para o environmentID enviado na chamada e para o runtime cadastrado no processo, quando o dono dele deixou de alcançá-lo. Diferente de AGENT_OFFLINE, repetir a chamada não resolve: o cadastro precisa ser corrigido |
| 503 | AGENT_OFFLINE | O runtime do processo está offline e sem fila para execuções pendentes |
Limites e controles
- Limite global: 120 requisições por minuto por credencial de conta.
- Limite de disparo: 10 chamadas por minuto a
POST /processes/:pid/startpor credencial, pensado para o volume de um disparador de execuções, não para rajadas de teste. - Idempotência: enviando o mesmo
Idempotency-Keydentro de 24 horas emPOST /processes/:pid/start, a chamada devolve a mesmainstanceIDjá criada em vez de iniciar uma nova execução, útil para retries seguros em caso de timeout de rede. - Validação da matrix: os campos enviados em
matrixprecisam corresponder aos nomes de Variável definidos no processo (verGET /processes/:pid/matrix); campos desconhecidos são rejeitados. A regra de uso de cada variável também vale: valor numa variável Fixa, valor fora das opções ou do formato e variável obrigatória (marcada como Obrigatório, ou de Opções ou Formato sem padrão) sem valor são recusados comINVALID_MATRIX. - Sempre a versão publicada: a API não aceita nem precisa de um parâmetro de versão. Ela sempre dispara a versão atualmente publicada do processo. Não existe, em nenhum lugar da plataforma (nem na execução manual, nem no agendamento), uma forma de fixar uma versão histórica específica por número.
Catálogo de rotas
Resumo dos cabeçalhos exigidos por rota. O detalhe completo (parâmetros, requisição de exemplo e resposta) vem logo abaixo de cada uma:
| Rota | Authorization | X-Process-Key | Idempotency-Key |
|---|---|---|---|
GET/ping | — | — | — |
GET/me | obrigatório | — | — |
GET/environments | obrigatório | — | — |
GET/processes | obrigatório | — | — |
GET/processes/:pid | obrigatório | obrigatório | — |
GET/processes/:pid/matrix | obrigatório | obrigatório | — |
GET/processes/:pid/executions | obrigatório | obrigatório | — |
POST/processes/:pid/start | obrigatório | obrigatório | opcional |
GET/instances/:iid | obrigatório | — | — |
POST/instances/:iid/stop|pause|resume | obrigatório | — | — |
GET/instances/:iid/logs | obrigatório | — | — |
GET/schedules | obrigatório | — | — |
POST/schedules | obrigatório | obrigatório | — |
PATCH/schedules/:id | obrigatório | — | — |
DELETE/schedules/:id | obrigatório | — | — |
curl assumem estas três variáveis já exportadas no terminal. API_BASE já é o endereço padrão do serviço; troque BM_TOKEN e PROCESS_KEY pelos seus valores reais:
export API_BASE="https://api.browsermate.io:8443"
export BM_TOKEN="bm_live_9fQ2xR7a.k3JYQnP8mR2tWv5XoZ1cLdEfGhIjKlMnOpQr"
export PROCESS_KEY="7f3a9c1d2e5b8f0a4d6c8e1b3f5a7d9c"
Meta
GET/v1/ping
Verifica se o serviço está no ar. Não exige autenticação.
Recebe: nada, sem parâmetros, sem headers de autenticação.
curl "$API_BASE/v1/ping"
Devolve:
{ "ok": true, "version": "1" }
GET/v1/me
Identidade da credencial de conta usada na chamada.
Recebe: só o header de autenticação, sem parâmetros.
curl "$API_BASE/v1/me" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve: o e-mail, nome e o rótulo (label) da credencial usada, útil para confirmar que a credencial certa está configurada no seu sistema.
{
"account": {
"email": "maria@empresa.com",
"name": "Maria Souza",
"credId": "-Nab12cd34",
"credLabel": "ERP Produção"
}
}
Runtimes
GET/v1/environments
Lista os runtimes que a sua conta alcança.
Recebe: só o header de autenticação, sem parâmetros. A lista traz os runtimes que quem chama alcança, com os mesmos IDs que aparecem no cartão de cada runtime na tela Meus Runtimes. O disparo e o agendamento valem pelo alcance do dono do processo: num processo compartilhado com você, o environmentID enviado precisa ser um runtime que o dono alcança (os dele e os visíveis para toda a empresa), e um runtime seu que não é visível para a empresa é recusado mesmo aparecendo nesta lista.
environmentID.
curl "$API_BASE/v1/environments" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve: os runtimes próprios e os runtimes compartilhados pela sua empresa. ambientes traz uma entrada por ambiente (dev, staging e prod): null quando o runtime não tem instalação naquele ambiente, ou a situação da instalação que o atende, com online (conectada neste momento) e offlineFlow (aceita execuções na fila enquanto está offline). Dois ambientes atendidos pela mesma instalação mostram a mesma situação. shared marca os runtimes de um administrador da empresa visíveis para todos.
{
"environments": [
{
"environmentID": "3f1c9a52-77e0-4b18-9d33-8a1e2c4b6d70",
"name": "Contas a Pagar",
"description": "Lançamentos do time financeiro",
"ambientes": {
"dev": { "online": true, "offlineFlow": false },
"staging": { "online": true, "offlineFlow": false },
"prod": { "online": false, "offlineFlow": true }
},
"shared": false
}
]
}
Processos
GET/v1/processes
Lista os processos da sua conta e os compartilhados com você, com informações básicas.
Recebe: só o header de autenticação, sem parâmetros. É a partir daqui que você descobre os processID disponíveis para usar nas rotas seguintes.
curl "$API_BASE/v1/processes" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve: processos próprios ("owned": true) e compartilhados com você ("owned": false, com as permissões que o dono concedeu no compartilhamento).
{
"processes": [
{ "processID": "1042", "processName": "Importação NF-e", "agentName": "NF-Importer", "active": true, "paused": false, "owned": true },
{ "processID": "2087", "processName": "Conciliação Bancária", "agentName": "Financeiro-Bot", "active": true, "owned": false,
"ownerName": "João Lima",
"permissions": { "execute": true, "edit": false, "api": true, "schedule": true, "delete": false, "share": false } }
]
}
Repare que o item compartilhado não traz nenhum token do dono, só o nome dele (ownerName) e as permissões concedidas. Para agir sobre esse processo, use o processID normalmente: a chave do processo (gerada pelo dono) já é suficiente para a API resolver tudo.
GET/v1/processes/:pid
Detalhes do processo, incluindo a definição da matrix de parâmetros.
Recebe:
| Nome | Onde | Obrigatório | Descrição |
|---|---|---|---|
pid | caminho da URL | sim | ID do processo (veja em GET /processes) |
Authorization | header | sim | Sua credencial de conta |
X-Process-Key | header | sim | Chave gerada para este processo |
curl "$API_BASE/v1/processes/1042" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY"
Devolve:
{
"processID": "1042",
"processName": "Importação NF-e",
"description": "Lê XML de NF-e e lança no ERP",
"agentName": "NF-Importer",
"active": true,
"apiEnabled": true,
"currentVersion": 3,
"avgHumanTime": "0:45",
"avgOperatorCost": 12.5,
"matrix": [
{ "name": "cnpj_fornecedor", "type": "Texto", "default": "" }
]
}
404 PROCESS_NOT_FOUND se o processo não existir; 403 FORBIDDEN se sua conta não for dona nem tiver compartilhamento com esse processo.
GET/v1/processes/:pid/matrix
Só a definição dos campos de parâmetro do processo, útil para montar formulários.
Recebe: o mesmo que GET /processes/:pid (pid na URL, Authorization e X-Process-Key nos headers).
curl "$API_BASE/v1/processes/1042/matrix" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY"
Devolve: os campos (name) que você vai usar depois como chave de matrix no disparo de execução ou na criação de agendamento, o mesmo nome de Variável que aparece no cadastro do processo. Na variável com regra de uso vêm também usage (fixed, options ou format), scope (input ou input_flow) e, nas Opções, options: cada opção com o value, que é o que se manda, e o label que a tela mostra. No Formato vem format: o preset (cpf, cnpj, cep, email, telefone, placa, numeros ou custom, com a expressão em pattern) e a ajuda em hint, quando há. A variável obrigatória vem com "required": true, inclusive a do tipo Secreto.
{ "matrix": [
{ "name": "cnpj_fornecedor", "type": "Texto", "default": "" },
{ "name": "filial", "type": "Texto", "default": "0012", "usage": "options", "scope": "input",
"options": [ { "value": "0012", "label": "Filial Campinas" }, { "value": "0047", "label": "" } ] }
] }
GET/v1/processes/:pid/executions
Histórico de execuções do processo, com status, duração e ganhos por execução.
Recebe:
| Nome | Onde | Obrigatório | Descrição |
|---|---|---|---|
pid | caminho da URL | sim | ID do processo |
from | query string | não | Data inicial AAAA-MM-DD. Padrão: 30 dias atrás. |
to | query string | não | Data final AAAA-MM-DD. Padrão: hoje. |
limit | query string | não | Quantidade máxima de linhas (1–500). Padrão: 50. |
curl "$API_BASE/v1/processes/1042/executions?from=2026-06-01&to=2026-07-06&limit=20" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY"
Devolve:
{
"from": "2026-06-01", "to": "2026-07-06",
"executions": [
{ "instanceID": "a1b2c3", "processID": "1042", "processName": "Importação NF-e",
"status": "success", "startedAt": "2026-07-06T13:02:11.000Z", "finishedAt": "2026-07-06T13:04:47.000Z",
"durationSeconds": 156, "savingsValue": 12.5, "fteHours": 0.75 }
]
}
POST/v1/processes/:pid/start
Dispara uma execução do processo, com parâmetros opcionais.
Para sistemas que empurram eventos (CRM, ERP, formulários), o caminho recomendado é o webhook do processo, sem credenciais no header e com mapeamento visual do payload. Esta rota continua sendo a opção certa quando o chamador quer controlar os valores da matrix a cada disparo, ou quando quem dispara é uma conta com quem o processo foi compartilhado.
Recebe:
| Nome | Onde | Obrigatório | Descrição |
|---|---|---|---|
pid | caminho da URL | sim | ID do processo |
matrix | corpo (JSON) | não | Objeto { variavel: valor } com overrides para esta execução. Os nomes vêm de GET /processes/:pid/matrix (o mesmo nome de Variável cadastrado no processo) |
environmentID | corpo (JSON) | não | ID do runtime que deve executar. Os IDs vêm de GET /environments. Omitido, vale o runtime cadastrado no processo |
stage | corpo (JSON) | não | Ambiente desta execução: dev (Desenvolvimento), staging (Homologação) ou prod (Produção). Decide qual instalação do runtime roda e quais valores do Cofre de Senhas a execução usa. Omitido, vale o ambiente do processo |
Idempotency-Key | header | não | Chave sua para tornar o disparo seguro contra retries |
A permissão de execução precisa estar concedida no compartilhamento, se o processo não for seu (ver permissions.execute em GET /processes).
Cada campo de matrix tem um type (devolvido por GET /processes/:pid/matrix), e o valor enviado é lido pelo tipo. Um valor que não cabe no tipo é recusado com INVALID_MATRIX, e a mensagem diz qual campo foi:
| Type | Formato do valor | Exemplo |
|---|---|---|
Texto | string | "12.345.678/0001-99" |
Número | number, ou string com vírgula decimal | 3, "2,5" |
Moeda | number (ponto decimal), ou string no formato brasileiro, com ou sem R$ | 1500.5, "1.500,50" |
Verdadeiro/Falso | boolean, ou string "sim"/"não", "1"/"0" | true |
Lista | array (cada elemento é um item), ou string com os itens separados por vírgula | ["Av. Paulista, 1020", "Rua Augusta, 500"], "SP, RJ, MG" |
Objeto | objeto JSON, ou string com um JSON | {"nome": "Ana", "idade": 30} |
Secreto | string (ou number). Sem valor padrão: o valor só existe se você o enviar | "sk_live_9f8e7d" |
["Av. Paulista, 1020", "Rua Augusta, 500"] são dois itens. Os elementos podem ser registros ([{"numero": "P1"}, {"numero": "P2"}]). Numa string, cada vírgula separa um item. Array é aceito nos campos Lista e Objeto, e objeto no campo Objeto; nos demais casos, a chamada é recusada com INVALID_MATRIX.
GET /processes/:pid/matrix devolve esse campo com default sempre vazio. O tipo Secreto não pode ser usado na criação de agendamento (INVALID_MATRIX), porque o registro de um agendamento fica guardado. Veja Dados Sensíveis.
environmentID troca o runtime desta chamada, e stage troca o ambiente. A instalação que roda é a que o runtime tem nesse ambiente. Só valem runtimes ao alcance do dono do processo (os da conta dele e os visíveis para toda a empresa), com instalação no ambiente da execução e com essa instalação fora da suspensão pelo plano; qualquer outro é recusado com INVALID_ENVIRONMENT. Num processo compartilhado com você, isso quer dizer que um runtime só seu, não visível para a empresa, é recusado. O ID de uma instalação também é aceito em environmentID e vale pelo runtime a que ela pertence. Os valores do cofre do ambiente indicado em stage exigem o runtime atualizado na máquina.
curl -X POST "$API_BASE/v1/processes/1042/start" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-8231" \
-d '{
"matrix": {
"cnpj_fornecedor": "12.345.678/0001-99",
"numero_tentativas": 3,
"valor_minimo": 1500.50,
"reprocessar_pendentes": true,
"cpfs_lista": ["111.111.111-11", "222.222.222-22", "333.333.333-33"]
}
}'
curl -X POST "$API_BASE/v1/processes/1042/start" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY" \
-H "Content-Type: application/json" \
-d '{ "environmentID": "3f1c9a52-77e0-4b18-9d33-8a1e2c4b6d70", "stage": "staging" }'
Devolve: o instanceID criado. Guarde-o para consultar o status depois em GET /instances/:iid.
{ "instanceID": "a1b2c3", "status": "started" }
{ "instanceID": "a1b2c3", "status": "queued" }
503 AGENT_OFFLINE se o runtime estiver offline e sem fila habilitada. A mensagem traz o nome do runtime que está fora. 400 INVALID_ENVIRONMENT se o environmentID enviado não existir, não estiver ao alcance do dono do processo ou não tiver instalação no ambiente da execução, se a instalação desse ambiente estiver suspensa pelo plano, se stage tiver um valor fora de dev, staging e prod, e também quando o runtime cadastrado no próprio processo não é alcançável pelo dono dele, caso em que a mensagem traz o identificador do runtime e a correção é no cadastro do processo, não na chamada. 403 OWNER_INACTIVE se o dono do processo estiver sem acesso ativo na plataforma: nesse caso nada é enfileirado, e a situação só muda quando o acesso dele for restabelecido. 409 PROCESS_NOT_PUBLISHED se o processo ainda não tiver versão publicada em produção: nada é enfileirado até o dono publicar a primeira versão no editor. Reenviando com o mesmo Idempotency-Key dentro de 24h, a resposta volta com "replayed": true e o instanceID da primeira chamada, em vez de criar uma nova execução.
Instâncias
GET/v1/instances/:iid
Status de uma execução: na fila, em execução, ou o resultado final.
Recebe: o instanceID devolvido pelo start, no caminho da URL. Não precisa da chave do processo, só da sua credencial de conta.
| Nome | Onde | Obrigatório | Descrição |
|---|---|---|---|
iid | caminho da URL | sim | instanceID devolvido pelo start |
curl "$API_BASE/v1/instances/a1b2c3" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve: o formato muda conforme o estágio da execução.
{ "instanceID": "a1b2c3", "processID": "1042", "status": "running", "processName": "Importação NF-e", "userName": "ERP Produção", "startedAt": 1751818931000 }
{
"instanceID": "a1b2c3", "processID": "1042", "processName": "Importação NF-e",
"status": "success", "startedAt": "2026-07-06T13:02:11.000Z", "finishedAt": "2026-07-06T13:04:47.000Z",
"durationSeconds": 156, "errorStep": null, "errorMessage": null,
"savingsValue": 12.5, "fteHours": 0.75, "version": "3"
}
status assume queued, running, success, error, terminated, stopped ou unknown (curta janela entre sair da fila e aparecer como em execução). 404 INSTANCE_NOT_FOUND se a instância não existir ou não pertencer à sua conta.
POST/v1/instances/:iid/stop · /pause · /resume
Controla uma execução em andamento (parar, pausar ou retomar).
Recebe: o instanceID no caminho, mais a ação (stop, pause ou resume) como último segmento da URL. Sem corpo.
curl -X POST "$API_BASE/v1/instances/a1b2c3/pause" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve:
{ "ok": true, "action": "pause" }
409 INSTANCE_FINISHED se a execução já terminou; 404 INSTANCE_NOT_FOUND se não existir ou não pertencer à sua conta.
GET/v1/instances/:iid/logs
Logs de passos da execução, os mesmos da Trilha de Auditoria. Útil para investigar falhas.
Recebe: o instanceID no caminho da URL.
curl "$API_BASE/v1/instances/a1b2c3/logs" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve:
{ "logs": [ { "timestamp": "2026-09-21T10:00:01Z", "severity": "INFO", "message": "Etapa concluída: Ler XML", "stepID": "Ler XML", "userName": "ERP Produção", "version": "3", "evidence": null } ] }
São as linhas do registro oficial da execução, em ordem cronológica e até 1000 por chamada. Por isso seguem o prazo de retenção do plano, e o dado marcado como sensível aparece mascarado. O stepID é o nome da etapa, e severity vale INFO, WARNING ou ERROR. Só enxerga a instância quem a executou ou é dono do processo.
Agendamentos
GET/v1/schedules
Lista seus agendamentos, incluindo os criados via API em processos compartilhados.
Recebe: só o header de autenticação, sem parâmetros.
curl "$API_BASE/v1/schedules" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve:
{
"schedules": [
{ "id": "-Nab99xy", "name": "Conciliação diária", "processID": "1042", "processName": "Importação NF-e",
"cronExpression": "0 9 * * 1-5", "active": true, "userName": "ERP Produção", "matrix": {},
"environmentID": "3f1c9a52-77e0-4b18-9d33-8a1e2c4b6d70", "stage": "prod" }
]
}
environmentID e stage vêm vazios ("") quando o agendamento segue o runtime ou o ambiente do processo.
unavailable
Um agendamento pode estar "active": true e mesmo assim não disparar, quando o plano da empresa dona do processo deixou de incluir agendamento de execuções. Nesse caso a entrada vem com "unavailable": "OWNER_PLAN_NO_SCHEDULING". Ela continua na lista de propósito: some da execução, não da integração. O campo só aparece quando é o caso, então quem já consome esta rota não precisa mudar nada.
POST/v1/schedules
Cria um novo agendamento para o processo, com recorrência em formato CRON.
Recebe:
| Campo | Onde | Obrigatório | Descrição |
|---|---|---|---|
processID | corpo (JSON) | sim | ID do processo. A chave enviada em X-Process-Key precisa ser deste processo |
name | corpo (JSON) | sim | Nome do agendamento |
cronExpression | corpo (JSON) | sim | Expressão CRON padrão (fuso America/São Paulo) |
matrix | corpo (JSON) | não | Objeto { variavel: valor } aplicado como override fixo em toda execução agendada. Mesma regra de nomes do start manual |
environmentID | corpo (JSON) | não | ID do runtime que deve executar o agendamento. Os IDs vêm de GET /environments. Omitido, vale o runtime cadastrado no processo |
stage | corpo (JSON) | não | Ambiente das execuções do agendamento: dev, staging ou prod. Fixa a instalação do runtime nesse ambiente e os valores do cofre desse ambiente. Omitido, cada disparo segue o ambiente que o processo tiver naquele momento. Mesma regra de POST /processes/:pid/start |
active | corpo (JSON) | não | Padrão true |
Ao gravar um agendamento ligado, a rota confere o par runtime e ambiente que vai valer: os enviados em environmentID e stage, ou, omitidos, os do processo publicado. Com o runtime que não existe mais, sem instalação nesse par ou com a instalação suspensa pelo plano, nada é gravado e a resposta é 400 INVALID_ENVIRONMENT, com a mesma mensagem que o Router daria no disparo. Criado com "active": false, não é conferido: a conferência acontece ao religar.
A permissão de agendamento precisa estar concedida no compartilhamento, se o processo não for seu.
402 PLAN_FEATURE_UNAVAILABLE e nada é gravado. Em processo compartilhado, quem vale é o plano da empresa dona do processo, porque o disparo periódico roda na conta dela e consome os créditos dela.
matrix segue o type devolvido por GET /processes/:pid/matrix (ver a tabela completa em POST /processes/:pid/start). Vale a mesma regra para campos tipo Lista: array, com cada elemento como um item, ou string com os itens separados por vírgula.
matrix nesta rota devolve 400 INVALID_MATRIX dizendo qual campo. Para um agendamento que precisa de credencial, use o Cofre nos campos da etapa. Veja Dados Sensíveis.
curl -X POST "$API_BASE/v1/schedules" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "X-Process-Key: $PROCESS_KEY" \
-H "Content-Type: application/json" \
-d '{
"processID": "1042",
"name": "Conciliação diária",
"cronExpression": "0 9 * * 1-5",
"environmentID": "3f1c9a52-77e0-4b18-9d33-8a1e2c4b6d70",
"matrix": {
"numero_tentativas": 3,
"valor_minimo": 1500.50,
"reprocessar_pendentes": true,
"cpfs_lista": ["111.111.111-11", "222.222.222-22", "333.333.333-33"]
}
}'
Devolve: o ID do agendamento criado.
{ "id": "-Nab99xy" }
userName registra o rótulo da chave usada na criação, preservando a rastreabilidade de quem configurou o agendamento.
PATCH/v1/schedules/:id
Ativa ou desativa um agendamento existente.
Recebe: o id do agendamento no caminho, e o novo estado no corpo.
| Campo | Onde | Obrigatório | Descrição |
|---|---|---|---|
id | caminho da URL | sim | ID do agendamento (veja em GET /schedules) |
active | corpo (JSON) | sim | true para ativar, false para desativar |
curl -X PATCH "$API_BASE/v1/schedules/-Nab99xy" \
-H "Authorization: Bearer $BM_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "active": false }'
Devolve:
{ "id": "-Nab99xy", "active": false }
Erros: 402 PLAN_FEATURE_UNAVAILABLE ao enviar active: true quando o plano da empresa dona do processo não inclui agendamento de execuções. 400 INVALID_ENVIRONMENT ao enviar active: true quando o par runtime e ambiente do agendamento (o fixado, ou o do processo publicado) não tem instalação: religar confere o par de novo, com a mesma mensagem que o Router daria no disparo, e o agendamento continua desligado. Desativar é sempre aceito: active: false continua funcionando mesmo depois de uma queda de plano, e essa é a via para desligar um agendamento que o downgrade deixou ligado.
DELETE/v1/schedules/:id
Remove um agendamento definitivamente.
Recebe: o id do agendamento no caminho.
curl -X DELETE "$API_BASE/v1/schedules/-Nab99xy" \
-H "Authorization: Bearer $BM_TOKEN"
Devolve:
{ "ok": true }
Webhook: contrato da rota
Cada processo tem um webhook próprio: uma URL que sistemas externos chamam com um POST JSON para entregar dados e disparar a automação. É o caminho para integrar sistemas que empurram eventos, como um CRM ao ganhar um negócio, um ERP ao emitir uma nota ou um formulário ao receber uma resposta.
Diferente das rotas do catálogo acima, o webhook não usa credencial de conta nem chave de processo: o segredo vai embutido na própria URL, porque o sistema chamador muitas vezes só sabe fazer um POST, sem headers customizados. Trate a URL como uma senha: quem a tem consegue chamá-la.
GET/v1/hooks/:pid/:token
Verificação de assinatura da Meta (WhatsApp, Instagram, Messenger). Devolve o desafio como texto puro.
Ao cadastrar a URL no painel da Meta, ela chama a URL com hub.mode=subscribe e um hub.challenge e só aceita se a resposta for o desafio, como texto puro. A URL do processo responde sozinha. Não dispara o processo nem grava captura.
| Situação | Código |
|---|---|
| URL válida, token vigente, webhook ligado | 200, com o hub.challenge no corpo |
Sem hub.mode=subscribe, ou URL que não existe | 404 |
| Token rotacionado | 401 |
| Webhook desligado | 403 |
POST/v1/hooks/:pid/:token
Recebe o payload do sistema externo. Captura (dev) ou dispara a versão publicada (produção).
Recebe:
| Nome | Onde | Obrigatório | Descrição |
|---|---|---|---|
pid e token | caminho da URL | sim | Já vêm prontos na URL copiada do modal. Não monte manualmente |
| corpo | JSON | não | O payload do evento (até 1 MB; acima de 100 KB a captura de teste não fica disponível para mapeamento). Em UTF-8, o padrão, ou em ISO-8859-1 quando o cabeçalho declarar charset=ISO-8859-1; só o webhook aceita a segunda |
Idempotency-Key | header | não | Só na URL de produção: retry com a mesma chave em 24h devolve a mesma instanceID em vez de disparar de novo |
curl -X POST "$WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{ "customer": { "email": "ana@acme.com" }, "order": { "id": "PED-8812", "total": 149.90 } }'
Devolve (desenvolvimento):
{ "captured": true, "captureId": "-Nab12cd" }
Devolve (produção):
{ "instanceID": "8f3a…", "status": "started" }
Devolve (produção, origem em modo Aguardar): a conexão fica aberta até o processo responder ou o limite de espera da origem acabar (padrão 30 s, máximo 120 s). Fora desse modo, vale a resposta acima.
| Situação | Código | Corpo |
|---|---|---|
| O processo passou pela etapa Webhook Response | O definido pelo dono do processo: 200, 201, 202, 400, 401, 403, 404, 409, 422 ou 500 | O JSON definido na etapa |
| Concluiu, ou terminou dentro de um ramo sem próximo passo, sem passar pela etapa | 202 | { "instanceID": "8f3a…", "status": "FINALIZED" } |
Uma rota de encerramento (terminate) desenhada no processo foi tomada | 500 | { "instanceID": "8f3a…", "status": "TERMINATED" }. Ambíguo por natureza (pode ser um fim limpo ou o jeito de quem desenhou abortar por um problema), tratado como falha |
| Estourou o limite de execução de etapas do agente | 500 | { "instanceID": "8f3a…", "status": "STEP_LIMIT_REACHED" }. Possível loop no desenho do processo |
| O processo falhou ou foi parado | 500 | { "instanceID": "8f3a…", "status": "ERROR" } (também STOPPED ou CRASHED). Sem mensagem de erro e sem variáveis |
| O limite de espera acabou com o processo já em execução | 202 | { "instanceID": "8f3a…", "status": "running" }. A execução continua |
| O limite de espera acabou com o processo ainda esperando vaga na fila do runtime | 202 | { "instanceID": "8f3a…", "status": "queued" }. A execução continua na fila e roda na vez dela, mas a resposta dela não é entregue a esta chamada |
| Agente offline com fila | 202 | { "instanceID": "8f3a…", "status": "queued" }, sem esperar |
| A resposta gravada pelo agente é inválida | 502 | { "instanceID": "8f3a…", "status": "INVALID_RESPONSE" } |
Nesse modo a resposta sai sempre como application/json, com o cabeçalho X-Instance-Id, e o processo não define nenhum outro header. Passou do limite de espera, não repita a chamada: a execução segue, rodando ou na fila do runtime, e reenviar cria outra. O resultado dela se consulta por GET /v1/instances/:id, que devolve queued, running e depois o status final. Um retry com a mesma Idempotency-Key devolve o instanceID da execução original, sem o corpo da resposta.
Erros: 404 NOT_FOUND (URL não confere, sem revelar se o processo existe); 401 WEBHOOK_TOKEN_REVOKED (URL antiga após gerar uma nova); 403 WEBHOOK_DISABLED (o webhook do processo está desligado no editor, nas URLs DEV e PROD); 402 PLAN_FEATURE_UNAVAILABLE (produção, plano sem API); 409 PROCESS_NOT_PUBLISHED (produção, processo não publicado); 400 INVALID_ENVIRONMENT (produção, o runtime cadastrado no processo não existe, ficou fora do alcance do dono, não tem instalação no ambiente do agente ou tem essa instalação suspensa pelo plano: correção é no cadastro do processo, repetir a chamada não resolve; quando o runtime cadastrado não existe mais, a mensagem traz o ID dele: Runtime não encontrado na conta do dono deste agente (ID). Peça ao dono para reconfigurar o runtime do agente.); 503 AGENT_OFFLINE; 403 OWNER_INACTIVE (dono do processo sem acesso ativo na plataforma); 400 BAD_REQUEST (corpo não é um JSON válido); 415 UNSUPPORTED_CHARSET (codificação fora de UTF-8 e ISO-8859-1); 413 PAYLOAD_TOO_LARGE (corpo acima de 1 MB). A execução iniciada pela produção aparece no histórico e pode ser acompanhada por GET /v1/instances/:id com as credenciais normais da API.
Testar a API
Preencha suas credenciais e escolha uma rota para montar e enviar a chamada real a partir desta página. Nada aqui é enviado para a browserMate. A chamada vai direto do seu navegador para o serviço de API.
Boas práticas
- Uma credencial de conta por sistema integrador. Assim como as chaves de processo, crie uma credencial com label próprio para cada consumidor. Revogar uma não afeta as demais.
- Sempre envie
Idempotency-Keyem disparos automatizados. Protege contra duplicidade de execução quando a resposta se perde por timeout de rede. - Segredo vai em campo do tipo Secreto. Um token ou uma API Key enviados num campo Texto aparecem nos logs da execução. No tipo Secreto eles não aparecem em log e esperam cifrados na fila. Para uma credencial que você já conhece antes de executar, prefira o Cofre. Veja Dados Sensíveis.
- Consulte a matrix antes de montar o payload do start. Os nomes de Variável podem ser renomeados ou removidos se o processo for remodelado. Use
GET /processes/:pid/matrixpara confirmar os nomes atuais em vez de fixá-los no seu código sem checagem periódica. - Trate
AGENT_OFFLINEcom espera e nova tentativa, não como falha definitiva. O runtime pode estar temporariamente offline. - Não repita a chamada em
OWNER_INACTIVE. É uma questão de acesso da conta dona do processo, resolvida dentro da plataforma pelo administrador da empresa. Tentar de novo não muda o resultado. - Monitore pelo
instanceID. Guarde o valor devolvido pelo start para consultar o status depois emGET /instances/:iid. - Revise periodicamente as credenciais de conta e chaves de processo ativas. Revogue o que não está mais em uso.
