Endpoint ·
POST /conversation/actionssend_json envia uma requisição ao seu sistema —seu ERP, seu CRM, seu backend— com um
conteúdo que você escreve, sem que um modelo o redija. É a mesma ação «Chamar o seu
sistema» que a equipe do negócio configura em um action set pelo painel; aqui ela roda sozinha,
dentro de um grupo de ações.
Se você quiser, um funcionário AI lê o que o seu sistema responder e continua a conversa com o
cliente. Por exemplo: registrar o pedido e fazer o funcionário confirmar ao cliente o número que o
seu sistema devolveu.
Como ela se diferencia de um funcionário AI do tipo JSON:
- O funcionário JSON redige o corpo com um modelo a partir da conversa, e o marca com
is_test: truequando roda no Tester. send_jsonenvia sempre o corpo que você escreveu, byte a byte. O despacho não passa por um modelo nem consome tokens (a continuação, se você configurar uma, consome), e não leva nenhuma marca de teste.
url— URL do seu sistema,http://ouhttps://(obrigatório, até 2000 caracteres). Sem usuário nem senha na URL: a autenticação vai emheaders.method—GET,POST,PUTouPATCH. Se omitido,POST.headers— cabeçalhos da requisição; por exemplo, a autenticação do seu sistema. O nome aceita letras, dígitos e hífens, e não são aceitosHost,Content-Length,Transfer-Encoding,Connection,Keep-Alive,UpgradenemExpect; cada valor tem que ser Latin-1 (sem caracteres de controle ASCII exceto o tab): caso contrário a requisição é rejeitada com400 INVALID_REQUEST. Até 50 cabeçalhos, com o nome de até 256 caracteres e o valor de até 8192; juntos, nomes e valores somam até 16384.query_params— parâmetros adicionados à query string deurl. Um com o mesmo nome de um parâmetro deurlsubstitui a sua primeira ocorrência, no lugar, e as repetidas são descartadas; os demais pares são enviados como estão, sem ser codificados de novo (comquery_params, os segmentos vazios, como&&ou um&final, são omitidos). Até 50 parâmetros, com os mesmos limites de nome e valor queheaders, e a URL enviada —já codificada, com os parâmetros e com o path como a requisição o codifica— não pode passar de 8192 caracteres: um path comñou acentos conta mais do que aparenta. Passado qualquer limite, a requisição é rejeitada com400 INVALID_REQUEST.body— o corpo, como texto JSON (até 10.000 caracteres). Não é aceito comGET.wrap_key— envolve o corpo sob essa chave (até 100 caracteres): com"data", o seu sistema recebe{"data":<body>}. Exigebody.response_processor—{ ai_employee, instructions }: o funcionário AI que lê a resposta e, opcionalmente, o que fazer com ela (até 500 caracteres).
send_json não dispara o AI, mas conta no limite de 3 ações que disparam o AI por grupo, com
ou sem response_processor: a resposta dela pode continuar a conversa. Em uma lista, este objeto
vai no array actions de um POST /conversation/actions — veja Montar uma lista de
ações.
O corpo é texto, não um objeto
body é uma string com JSON dentro. É assim que ele sai byte a byte: o seu sistema recebe
exatamente esse texto, com as chaves na sua ordem e os números como você os escreveu —150.50 não
vira 150.5, e um inteiro de mais de 16 dígitos não perde precisão—. Com wrap_key, esse mesmo texto vai sem ser tocado dentro da envoltura: o seu sistema recebe {"<wrap_key>":<body>}. Se não for JSON válido, a
requisição é rejeitada com 400 INVALID_REQUEST e nenhuma ação do grupo é executada.
É fixo: não leva variáveis nem dados da conversa, e a requisição também não leva cabeçalhos da
plataforma. Se o seu sistema precisa saber de qual conversa se trata, inclua isso você mesmo no
body ou em query_params.
Com corpo, a requisição leva Content-Type: application/json; para substituí-lo, passe-o em
headers com esse mesmo nome. Com GET não há corpo: os dados vão na URL ou em query_params.
A resposta do seu sistema não faz a ação falhar
O seu sistema responder com erro, responder tarde ou não responder não é uma falha dosend_json: a ação conta como bem-sucedida, não dispara stop_on_error e não escala a conversa. A
ação só falha por algo do nosso lado, ou se response_processor não resolver (veja abaixo). No
Registro de atividade do painel ela aparece como bem-sucedida, com a nota de que o seu sistema
respondeu com erro ou não respondeu, ou de que não o chamamos porque a URL dele está bloqueada ou não
foi encontrada.
O que vale saber sobre a entrega:
- O seu sistema tem 30 segundos para responder. Se não responder a tempo, ou houver um erro de
rede, a requisição é repetida uma vez, idêntica: se o seu sistema a processou mas demorou para
responder, ele a recebe duas vezes. Se a requisição cria algo —um pedido, uma cobrança—, inclua o
seu próprio identificador no
bodye deduplique por ele. - Reenviar o grupo a envia de novo.
POST /conversation/actionsnão deduplica: se você repetir um grupo comsend_json, o seu sistema recebe a requisição de novo. Vale a mesma recomendação. - Uma resposta de erro não é repetida, e um redirecionamento não é seguido.
- A URL precisa resolver para um endereço público. Um IP privado ou local é bloqueado e a requisição não sai.
Continuar a conversa com a resposta
Comresponse_processor, o que o seu sistema responder pode ser lido por um funcionário AI para
continuar escrevendo ao cliente. Valem as mesmas regras da resposta do funcionário AI do tipo JSON,
descritas em O que seu endpoint responde pode continuar a
conversa:
- O funcionário precisa ser operacional e estar ativo. Se o nome não resolver para um, a ação
falha com
AI_EMPLOYEE_NOT_FOUND—ouAMBIGUOUS_AI_EMPLOYEE, se o nome coincidir com mais de um— e a requisição não sai. Não é validado no preflight: o grupo é aceito e a falha aparece ao executar. - Pode ser clássico ou v2 (novo motor). Um v2 lê a resposta com seus poderes: se um deles volta a enviar dados ao seu sistema, essa resposta também conta no limite da cadeia abaixo. Se os funcionários v2 estiverem desligados na plataforma, a resposta não é processada e aparece um cartão de erro na conversa. Numa conversa de teste esse cartão não aparece.
- Só é lida uma resposta
2xxcom corpo, e o corpo é mostrado a um modelo: responda só com o que o cliente possa vir a saber. - A continuação roda depois, em segundo plano e sem um prazo garantido.
- Com outra ação de AI no grupo, o cliente pode receber duas respostas. Se o mesmo grupo inclui
run_ai,ai_assistanceouassign_ai_employeecomrun: true, essa ação responde ao cliente e a continuação volta a escrever com o que o seu sistema respondeu. As duas podem rodar ao mesmo tempo, não necessariamente uma depois da outra. Numa campanha, além disso, se a continuação assumir a conversa primeiro, a mensagem da ação de AI pode não sair. Se você quer uma resposta só, deixe que a continuação a dê. - A cadeia tem um teto. Se a continuação despachar de novo para o seu sistema, essa resposta
também pode continuar a conversa. Um
send_jsonavulso em um grupo de ações começa a cadeia do início, então cabem duas continuações. Quantas cabem em cada caso está nessa mesma seção de webhooks.
A própria ação também está sendo habilitada por etapas. Enquanto não estiver habilitada na
plataforma, um grupo que a inclui é rejeitado inteiro com
400 INVALID_REQUEST, antes de executar
qualquer coisa; se a plataforma não conseguiu confirmar se está habilitada, responde
500 FETCH_FAILED, e você pode tentar de novo.Disponibilidade: continuar a conversa com a resposta está sendo habilitado por etapas no
nível da plataforma, não conta a conta. Enquanto não estiver habilitado, a resposta do seu
sistema é registrada e não continua a conversa.
send_json em uma campanha: ali sai uma requisição por
destinatário —veja como elas chegam—.
Exemplo executável
Umsend_json sobre uma conversa identificada por telefone e canal: registra um pedido no seu
sistema e um funcionário AI confirma ao cliente o número que o seu sistema devolver.
Request
Resposta
202 Accepted — o grupo foi aceito e roda em background. O resultado real por ação não viaja
na resposta (consulte-o depois — veja Como é
executado).