<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucas</title>
    <description>The latest articles on DEV Community by Lucas (@lucas_ferreira).</description>
    <link>https://dev.to/lucas_ferreira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821523%2F8a141e03-a0f4-42d4-b4f6-38a3247d8baf.png</url>
      <title>DEV Community: Lucas</title>
      <link>https://dev.to/lucas_ferreira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucas_ferreira"/>
    <language>en</language>
    <item>
      <title>Como Usar GLM-5.2 Sem Restrições</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 08:20:47 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-glm-52-sem-restricoes-m1j</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-glm-52-sem-restricoes-m1j</guid>
      <description>&lt;p&gt;GLM-5.2 é um dos poucos modelos de classe de fronteira que você pode executar no seu próprio hardware. Ele é distribuído como pesos abertos sob licença MIT, sem restrições regionais. Na prática, “usar sem restrições” depende de identificar qual limite você está enfrentando: UI do chat, ajuste de instrução, cota de API, roteamento de raciocínio ou infraestrutura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Em resumo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GLM-5.2 (&lt;a href="http://Z.ai" rel="noopener noreferrer"&gt;Z.ai&lt;/a&gt; / Zhipu AI) tem pesos abertos, aproximadamente 753B parâmetros em arquitetura MoE, licença MIT, contexto de 1M de tokens e sem bloqueio regional.&lt;/li&gt;
&lt;li&gt;A maioria das “restrições” vem da interface de chat para consumidor ou do ajuste de instrução do modelo, não de um limite rígido da licença.&lt;/li&gt;
&lt;li&gt;A API bruta oferece controle de prompt do sistema e permite desativar o &lt;code&gt;thinking&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A auto-hospedagem dá controle total da pilha: prompt, runtime, filtros, logs e limites.&lt;/li&gt;
&lt;li&gt;Compilações “abliteradas” da comunidade removem recusas embutidas, como já acontece com &lt;a href="https://apidog.com/pt/blog/deepseek-r1-abliterated/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek R1&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/how-to-run-uncensored-qwq-on-your-local-machine/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QwQ&lt;/a&gt;. A disponibilidade para o GLM-5.2 muda com frequência, então verifique no Hugging Face.&lt;/li&gt;
&lt;li&gt;Ao auto-hospedar, moderação e responsabilidade legal passam a ser suas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Identifique qual restrição você quer remover
&lt;/h2&gt;

&lt;p&gt;“Restrição” pode significar coisas diferentes. Antes de trocar de provedor ou baixar pesos, classifique o problema.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Restrição&lt;/th&gt;
&lt;th&gt;Onde acontece&lt;/th&gt;
&lt;th&gt;Como contornar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recusas do ajuste de instrução&lt;/td&gt;
&lt;td&gt;Nos pesos do modelo de chat&lt;/td&gt;
&lt;td&gt;Auto-hospedagem, prompt de sistema mais específico ou build abliterada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filtros do app de chat&lt;/td&gt;
&lt;td&gt;Interface web do consumidor&lt;/td&gt;
&lt;td&gt;Usar API bruta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limites de plano e taxa&lt;/td&gt;
&lt;td&gt;Provedor hospedado&lt;/td&gt;
&lt;td&gt;Plano pago, outro provedor ou execução local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latência de raciocínio&lt;/td&gt;
&lt;td&gt;Roteamento com &lt;code&gt;thinking&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Desativar &lt;code&gt;thinking&lt;/code&gt; quando não for necessário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controle de política&lt;/td&gt;
&lt;td&gt;Camada do provedor/app&lt;/td&gt;
&lt;td&gt;Usar endpoint compatível com OpenAI, roteador ou servidor próprio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A região não entra nessa lista porque os pesos do GLM-5.2 são licenciados sob MIT sem restrições regionais. A disponibilidade de APIs hospedadas pode variar por provedor, mas os pesos podem ser auto-hospedados.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use a API bruta em vez do aplicativo de chat
&lt;/h2&gt;

&lt;p&gt;A forma mais rápida de ganhar controle é parar de usar a janela de chat do consumidor e chamar a API diretamente.&lt;/p&gt;

&lt;p&gt;Configuração básica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base URL: &lt;code&gt;https://api.z.ai/api/paas/v4/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Endpoint: &lt;code&gt;POST /chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modelo: &lt;code&gt;glm-5.2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo mínimo com &lt;code&gt;curl&lt;/code&gt; e &lt;code&gt;thinking&lt;/code&gt; desativado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.z.ai/api/paas/v4/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ZAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "glm-5.2",
    "thinking": { "type": "disabled" },
    "temperature": 0.7,
    "messages": [
      {
        "role": "system",
        "content": "You are a direct technical assistant. Answer concisely."
      },
      {
        "role": "user",
        "content": "Explain how abliteration changes a model."
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A mesma chamada usando o SDK Python da OpenAI, redirecionado para &lt;a href="http://z.ai" rel="noopener noreferrer"&gt;z.ai&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ZAI_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.z.ai/api/paas/v4/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a direct technical assistant. Answer concisely.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain how abliteration changes a model.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ganho prático aqui vem de dois pontos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você controla o &lt;code&gt;system prompt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Você pode desativar &lt;code&gt;thinking&lt;/code&gt; quando quiser uma resposta mais direta e com menor latência.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para o conjunto completo de parâmetros, consulte o &lt;a href="https://apidog.com/pt/blog/glm-5-2-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API GLM-5.2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Os preços mudam, então valide antes de colocar em produção. Na data da escrita original, fontes secundárias listavam cerca de US$ 1,40 por 1M de tokens de entrada e US$ 4,40 por 1M de tokens de saída. Confira os valores atuais na &lt;a href="https://apidog.com/pt/blog/glm-5-2-pricing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tabela de preços do GLM-5.2&lt;/a&gt;. Se custo for a restrição principal, veja também &lt;a href="https://apidog.com/pt/blog/how-to-use-glm-5-2-for-free/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o GLM-5.2 gratuitamente&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Auto-hospede os pesos abertos
&lt;/h2&gt;

&lt;p&gt;A resposta mais completa para “sem restrições” é executar o modelo por conta própria.&lt;/p&gt;

&lt;p&gt;Como os pesos são licenciados sob MIT, você pode baixar, servir e modificar o GLM-5.2 conforme os termos da licença. Quando o modelo roda na sua infraestrutura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;não há filtro da UI do fornecedor;&lt;/li&gt;
&lt;li&gt;não há limite de taxa externo;&lt;/li&gt;
&lt;li&gt;o prompt de sistema é seu;&lt;/li&gt;
&lt;li&gt;a política de moderação é sua;&lt;/li&gt;
&lt;li&gt;logs, armazenamento e observabilidade ficam sob seu controle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O caminho mais simples para começar é via Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run glm-5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas há uma limitação importante: GLM-5.2 é um modelo MoE com aproximadamente 753B parâmetros. O modelo completo exige muita VRAM.&lt;/p&gt;

&lt;p&gt;Na prática, você provavelmente vai precisar de uma destas opções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build quantizada;&lt;/li&gt;
&lt;li&gt;máquina multi-GPU alugada;&lt;/li&gt;
&lt;li&gt;variante menor do GLM;&lt;/li&gt;
&lt;li&gt;pipeline local usando um modelo menor para desenvolvimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se seu hardware for limitado, o &lt;a href="https://apidog.com/pt/blog/glm-4-7-flash-locally/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GLM-4.7-Flash roda localmente&lt;/a&gt; com muito menos recursos e pode servir como substituto durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Para configurar o ambiente local, consulte o &lt;a href="https://apidog.com/pt/blog/run-glm-5-locally-for-free/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia geral para executar GLM localmente&lt;/a&gt; e o &lt;a href="https://apidog.com/pt/blog/glm-5-for-free-with-ollama/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;passo a passo de configuração do Ollama&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Depois de servir localmente, o Ollama expõe um endpoint compatível com OpenAI em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então o mesmo código da API hospedada funciona mudando apenas a &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;glm-5.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a concise technical assistant.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize the deployment options for GLM-5.2.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Use builds da comunidade sem censura, quando disponíveis
&lt;/h2&gt;

&lt;p&gt;As recusas normalmente vêm do ajuste de instrução. A comunidade open source costuma remover esse comportamento com um processo chamado abliteração, que tenta suprimir a direção interna associada à recusa sem exigir retreinamento completo.&lt;/p&gt;

&lt;p&gt;A mesma abordagem já é usada em builds sem censura de modelos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/pt/blog/how-to-run-uncensored-qwq-on-your-local-machine/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;QwQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/pt/blog/deepseek-r1-abliterated/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek R1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como os pesos do GLM-5.2 são abertos e licenciados sob MIT, essa técnica também pode ser aplicada. Porém, uma build abliterada pronta do GLM-5.2 não é garantida. A disponibilidade muda com frequência, então procure uma versão atual no Hugging Face em vez de assumir que ela já existe.&lt;/p&gt;

&lt;p&gt;Fluxo típico quando houver uma build disponível:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Baixe os pesos abliterados.&lt;/li&gt;
&lt;li&gt;Carregue no Ollama, vLLM ou runtime compatível.&lt;/li&gt;
&lt;li&gt;Exponha um endpoint compatível com OpenAI.&lt;/li&gt;
&lt;li&gt;Teste prompts críticos antes de conectar ao produto.&lt;/li&gt;
&lt;li&gt;Adicione sua própria camada de moderação, se o endpoint for exposto a usuários.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa é a forma mais forte de reduzir recusas embutidas, mas também transfere mais responsabilidade para você.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use um provedor ou roteador que permita controlar políticas
&lt;/h2&gt;

&lt;p&gt;Se você não quiser manter sua própria infraestrutura, use um provedor de roteamento como meio termo.&lt;/p&gt;

&lt;p&gt;O GLM-5.2 aparece no OpenRouter como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z-ai/glm-5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele também está disponível na biblioteca Ollama.&lt;/p&gt;

&lt;p&gt;Um roteador permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trocar o host subjacente sem reescrever sua aplicação;&lt;/li&gt;
&lt;li&gt;manter uma API compatível com OpenAI;&lt;/li&gt;
&lt;li&gt;aplicar sua própria configuração de moderação;&lt;/li&gt;
&lt;li&gt;evitar filtros específicos da UI de chat do consumidor;&lt;/li&gt;
&lt;li&gt;centralizar logs, fallback e controle de custo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse caminho é útil quando você quer mais controle que o app de chat, mas ainda não quer operar GPUs.&lt;/p&gt;

&lt;p&gt;Se quiser comparar o GLM-5.2 com outras alternativas abertas, veja o panorama de &lt;a href="https://apidog.com/pt/blog/llms-no-restrictions/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;LLMs sem restrições&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Teste cada configuração no Apidog antes de implementar
&lt;/h2&gt;

&lt;p&gt;Qualquer uma das opções acima termina em um endpoint compatível com OpenAI. Antes de colocar em produção, valide o comportamento real do endpoint.&lt;/p&gt;

&lt;p&gt;O Apidog ajuda porque permite inspecionar a resposta bruta, inclusive streaming SSE, em vez de ver apenas o texto final.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69rseul4duema8fqtu0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F69rseul4duema8fqtu0e.png" alt="Interface do Apidog testando uma API" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Passo a passo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie uma nova requisição no Apidog.&lt;/li&gt;
&lt;li&gt;Aponte para o endpoint desejado:

&lt;ul&gt;
&lt;li&gt;API hospedada: &lt;code&gt;https://api.z.ai/api/paas/v4/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ollama local: &lt;code&gt;http://localhost:11434/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Para a API hospedada, adicione o header:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;key&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Defina o corpo da requisição:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"glm-5.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stream"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"disabled"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are a concise technical assistant."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain the deployment options for GLM-5.2."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Envie a requisição.&lt;/li&gt;
&lt;li&gt;Observe o fluxo SSE.&lt;/li&gt;
&lt;li&gt;Compare respostas com &lt;code&gt;thinking&lt;/code&gt; ativado e desativado.&lt;/li&gt;
&lt;li&gt;Verifique o objeto &lt;code&gt;usage&lt;/code&gt; para acompanhar consumo de tokens.&lt;/li&gt;
&lt;li&gt;Repita com prompts reais do seu produto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse teste evita descobrir em produção que o prompt de sistema não teve o efeito esperado, que o streaming está diferente do previsto ou que a latência aumentou com o raciocínio ativado.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Responsabilidade ao remover restrições
&lt;/h2&gt;

&lt;p&gt;Remover filtros de produto e executar pesos sem censura é uma prática legítima em pesquisa, red-teaming e ambientes onde você quer implementar sua própria moderação.&lt;/p&gt;

&lt;p&gt;Mas, ao auto-hospedar, você assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;política de uso;&lt;/li&gt;
&lt;li&gt;moderação;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;auditoria;&lt;/li&gt;
&lt;li&gt;exposição legal;&lt;/li&gt;
&lt;li&gt;segurança do endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mantenha três regras práticas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você ainda está sujeito à lei e aos termos das plataformas onde implanta.&lt;/li&gt;
&lt;li&gt;Se outros usuários acessarem o modelo, adicione uma camada de moderação apropriada.&lt;/li&gt;
&lt;li&gt;“Sem restrições” deve significar controle técnico e redução de recusas falsas positivas, não permissão para gerar conteúdo prejudicial ou ilegal.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O GLM-5.2 é realmente de código aberto?
&lt;/h3&gt;

&lt;p&gt;Os pesos são lançados sob licença MIT, uma das licenças mais permissivas. Você pode executá-los, modificá-los e auto-hospedá-los, inclusive para uso comercial, sujeito aos termos da licença.&lt;/p&gt;

&lt;p&gt;Para identidade e especificações do modelo, veja &lt;a href="https://apidog.com/pt/blog/glm-5-2-what-is/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é GLM-5.2&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A API do GLM-5.2 censura respostas?
&lt;/h3&gt;

&lt;p&gt;O modelo de instrução possui alinhamento do ajuste, então pode recusar alguns prompts. A API oferece controle de &lt;code&gt;system prompt&lt;/code&gt; e permite desativar &lt;code&gt;thinking&lt;/code&gt;, o que resolve muitos problemas de tom, latência e recusa excessiva.&lt;/p&gt;

&lt;p&gt;Para remover recusas embutidas de forma mais completa, a alternativa é auto-hospedar uma build abliterada, caso exista uma disponível.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso executar o GLM-5.2 em um laptop?
&lt;/h3&gt;

&lt;p&gt;Não o modelo completo de aproximadamente 753B parâmetros. Para desenvolvimento local, use uma build quantizada, uma máquina GPU alugada ou uma variante menor, como o GLM-4.7-Flash. Depois, aponte o mesmo código para o modelo maior quando necessário.&lt;/p&gt;

&lt;h3&gt;
  
  
  O GLM-5.2 possui bloqueio regional?
&lt;/h3&gt;

&lt;p&gt;Não. Os pesos são licenciados sob MIT sem restrições regionais. A disponibilidade da API hospedada pode variar por provedor, mas a auto-hospedagem está aberta a qualquer pessoa.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Karate para Testes de API: Guia Prático da DSL</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 07:50:56 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/karate-para-testes-de-api-guia-pratico-da-dsl-20d4</link>
      <guid>https://dev.to/lucas_ferreira/karate-para-testes-de-api-guia-pratico-da-dsl-20d4</guid>
      <description>&lt;p&gt;Você quer testes de API legíveis, versionados no Git junto com o código e executáveis em qualquer pipeline de CI. O Karate atende bem esse caso: ele usa uma DSL baseada em Gherkin para escrever cenários &lt;code&gt;Dado / Quando / Então&lt;/code&gt;, sem exigir glue code em Java para testes HTTP comuns. Neste guia, você verá como estruturar arquivos &lt;code&gt;.feature&lt;/code&gt;, configurar ambientes, escrever asserções JSON e rodar tudo em CI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Karate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/karatelabs/karate" rel="noopener noreferrer"&gt;Karate&lt;/a&gt; é um framework open source de automação de testes de API baseado em Java. Você escreve testes em arquivos &lt;code&gt;.feature&lt;/code&gt;, usando a sintaxe Gherkin do Behavior-Driven Development, mas sem precisar implementar definições de steps como no Cucumber.&lt;/p&gt;

&lt;p&gt;Um teste HTTP básico no Karate já vem com suporte nativo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;montar requisições;&lt;/li&gt;
&lt;li&gt;enviar métodos HTTP;&lt;/li&gt;
&lt;li&gt;validar status codes;&lt;/li&gt;
&lt;li&gt;comparar JSON;&lt;/li&gt;
&lt;li&gt;usar matchers flexíveis como &lt;code&gt;#string&lt;/code&gt;, &lt;code&gt;#number&lt;/code&gt; e &lt;code&gt;#[10]&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;executar testes por Maven, Gradle, JUnit 5 ou jar standalone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mr39ptjfqo044170l2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3mr39ptjfqo044170l2u.png" alt="Karate API testing" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Além de testes de API, o projeto também inclui recursos para mocks, testes de performance com Gatling e automação de UI. Aqui, o foco é o núcleo de testes de API.&lt;/p&gt;

&lt;p&gt;Como os testes são arquivos de texto, eles funcionam bem em um &lt;a href="https://apidog.com/pt/blog/rest-assured-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;workflow baseado em código, nativo do Git&lt;/a&gt;. Um pull request mostra exatamente quais cenários, payloads ou asserções foram alterados.&lt;/p&gt;

&lt;p&gt;Se você ainda não usa o estilo &lt;code&gt;Dado / Quando / Então&lt;/code&gt;, veja também o guia sobre &lt;a href="https://apidog.com/pt/blog/behavior-driven-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Behavior-Driven Development&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona: arquivos &lt;code&gt;.feature&lt;/code&gt; e &lt;code&gt;karate-config.js&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Um teste Karate começa com um arquivo &lt;code&gt;.feature&lt;/code&gt;. Cada arquivo possui uma &lt;code&gt;Funcionalidade:&lt;/code&gt; e um ou mais &lt;code&gt;Cenário:&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Funcionalidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; API de Usuário

&lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Listar todos os usuários
  &lt;span class="err"&gt;Dado url 'https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;//jsonplaceholder.typicode.com'&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;caminho 'users'
  &lt;span class="nf"&gt;Quando &lt;/span&gt;método get
  &lt;span class="nf"&gt;Então &lt;/span&gt;status 200
  &lt;span class="nf"&gt;E &lt;/span&gt;match response == '#[10]'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O fluxo é direto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt; define a base da API.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;caminho&lt;/code&gt; adiciona o recurso.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;método get&lt;/code&gt; envia a requisição.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status 200&lt;/code&gt; valida o HTTP status.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;match response == '#[10]'&lt;/code&gt; verifica que a resposta é um array com 10 itens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O marcador &lt;code&gt;#[10]&lt;/code&gt; é próprio do Karate. Ele valida o tamanho do array sem exigir código JavaScript.&lt;/p&gt;

&lt;p&gt;Para entender melhor a sintaxe Gherkin aplicada a APIs, consulte o &lt;a href="https://apidog.com/pt/blog/gherkin-guide-bdd-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia Gherkin para BDD e testes de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando ambientes com &lt;code&gt;karate-config.js&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Em projetos reais, você normalmente precisa alternar entre ambientes como &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;qa&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt; e &lt;code&gt;prod&lt;/code&gt;. O Karate centraliza isso no arquivo &lt;code&gt;karate-config.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Crie um arquivo assim na raiz dos testes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;karate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://qa.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, no arquivo &lt;code&gt;.feature&lt;/code&gt;, use a variável &lt;code&gt;baseUrl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Funcionalidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; API de Usuário

&lt;span class="kn"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nf"&gt;* &lt;/span&gt;url baseUrl

&lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Listar usuários
  &lt;span class="nf"&gt;Dado &lt;/span&gt;caminho 'users'
  &lt;span class="nf"&gt;Quando &lt;/span&gt;método get
  &lt;span class="nf"&gt;Então &lt;/span&gt;status 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para trocar o ambiente em tempo de execução:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; karate.jar &lt;span class="nt"&gt;-Dkarate&lt;/span&gt;.env&lt;span class="o"&gt;=&lt;/span&gt;qa src/test/java/features
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, você evita hardcode de URLs nos cenários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo prático: criando um usuário
&lt;/h2&gt;

&lt;p&gt;Este cenário envia um payload JSON, valida o status code e verifica a forma da resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Funcionalidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Criar usuário

&lt;span class="kn"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nf"&gt;* &lt;/span&gt;url baseUrl

&lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Criar um novo usuário retorna 201
  &lt;span class="nf"&gt;Dado &lt;/span&gt;caminho 'users'
  &lt;span class="err"&gt;E requisição { name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada', job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'engineer'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;Quando &lt;/span&gt;método post
  &lt;span class="nf"&gt;Então &lt;/span&gt;status 201
  &lt;span class="nf"&gt;E &lt;/span&gt;match response.name == 'Ada'
  &lt;span class="nf"&gt;E &lt;/span&gt;match response.id == '#string'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Background:&lt;/code&gt; roda antes de cada cenário do arquivo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; é um step curinga, útil para configuração.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requisição&lt;/code&gt; recebe JSON diretamente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#string&lt;/code&gt; valida que &lt;code&gt;id&lt;/code&gt; existe e é uma string, sem fixar um valor específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse estilo reduz boilerplate: não há DTO, POJO, serializer ou código de setup HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Asserções e comparação de JSON
&lt;/h2&gt;

&lt;p&gt;A principal palavra-chave para validação no Karate é &lt;code&gt;match&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparação exata
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="err"&gt;E match response == { id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'#number', name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada', job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'engineer'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, o objeto precisa ter os campos esperados. Os matchers flexíveis validam tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#number&lt;/code&gt;: número;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#string&lt;/code&gt;: string;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#boolean&lt;/code&gt;: booleano;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#uuid&lt;/code&gt;: UUID.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é útil para campos gerados dinamicamente, como IDs e timestamps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparação parcial com &lt;code&gt;contains&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Quando você só precisa validar parte da resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="err"&gt;E match response contains { name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O teste passa mesmo que a resposta tenha outros campos.&lt;/p&gt;

&lt;p&gt;O Karate também suporta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="err"&gt;E match response !contains { error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;true&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;E match response contains only { name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada', job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'engineer'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;E match response contains any [{ name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada' }, { name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Grace'&lt;/span&gt; &lt;span class="err"&gt;}]&lt;/span&gt;
&lt;span class="err"&gt;E match response contains deep { user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;{ name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'Ada'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validação de arrays
&lt;/h3&gt;

&lt;p&gt;Para validar o tamanho de um array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="nf"&gt;E &lt;/span&gt;match response == '#[10]'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para validar cada item do array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="err"&gt;E match each response == { id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'#number', name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="c"&gt;#string' }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa linha verifica que todos os objetos retornados possuem &lt;code&gt;id&lt;/code&gt; numérico e &lt;code&gt;name&lt;/code&gt; string.&lt;/p&gt;

&lt;p&gt;Para mais padrões de validação, veja o &lt;a href="https://apidog.com/pt/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia prático de asserções de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes orientados a dados
&lt;/h2&gt;

&lt;p&gt;Para executar o mesmo cenário com múltiplas entradas, use &lt;code&gt;Cenário com Estrutura&lt;/code&gt; e &lt;code&gt;Exemplos&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Funcionalidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Criar usuários

&lt;span class="err"&gt;Cenário com Estrutura&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;Criar&lt;/span&gt; &lt;span class="err"&gt;usuários&lt;/span&gt; &lt;span class="nf"&gt;a &lt;/span&gt;partir de uma tabela
  &lt;span class="nf"&gt;Dado &lt;/span&gt;url baseUrl
  &lt;span class="nf"&gt;E &lt;/span&gt;caminho 'users'
  &lt;span class="err"&gt;E requisição { name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&amp;lt;name&amp;gt;', job&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&amp;lt;job&amp;gt;'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;Quando &lt;/span&gt;método post
  &lt;span class="nf"&gt;Então &lt;/span&gt;status 201
  &lt;span class="nf"&gt;E &lt;/span&gt;match response.name == '&lt;span class="nv"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;'

  &lt;span class="nn"&gt;Exemplos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;job&lt;/span&gt;        &lt;span class="p"&gt;|&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Ada&lt;/span&gt;   &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;engenheira&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Grace&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;cientista&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Alan&lt;/span&gt;  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;analista&lt;/span&gt;   &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Karate executa o cenário uma vez para cada linha da tabela.&lt;/p&gt;

&lt;p&gt;Para manter dados grandes fora do &lt;code&gt;.feature&lt;/code&gt;, leia um arquivo externo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="nn"&gt;Exemplos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;read('classpath:test-data/users.json')&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Karate suporta JSON e CSV para esse tipo de execução orientada a dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rodando Karate em CI
&lt;/h2&gt;

&lt;p&gt;Você tem duas opções comuns para executar Karate em pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opção 1: Maven, Gradle e JUnit 5
&lt;/h3&gt;

&lt;p&gt;Em projetos Java, adicione a dependência &lt;code&gt;karate-junit5&lt;/code&gt; e crie um runner apontando para os arquivos &lt;code&gt;.feature&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A vantagem é que seu pipeline continua simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gradle &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso encaixa os testes de API no mesmo fluxo dos testes automatizados existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opção 2: jar standalone
&lt;/h3&gt;

&lt;p&gt;Se você não quer usar Maven ou Gradle, baixe o &lt;code&gt;karate.jar&lt;/code&gt; nos releases do projeto e execute os testes diretamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; karate.jar src/test/java/features
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para filtrar por tags, executar em paralelo e definir diretório de saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; karate.jar &lt;span class="nt"&gt;--tags&lt;/span&gt; @smoke &lt;span class="nt"&gt;--threads&lt;/span&gt; 4 &lt;span class="nt"&gt;--output&lt;/span&gt; reports src/test/java/features
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para passar o ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; karate.jar &lt;span class="nt"&gt;-Dkarate&lt;/span&gt;.env&lt;span class="o"&gt;=&lt;/span&gt;qa src/test/java/features
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a execução, o Karate gera um relatório HTML no diretório de saída, útil como artefato de CI.&lt;/p&gt;

&lt;p&gt;Para uma visão mais ampla sobre pipelines, veja como &lt;a href="https://apidog.com/pt/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatizar testes de API em CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos fortes e compensações
&lt;/h2&gt;

&lt;p&gt;O Karate funciona bem quando você quer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testes versionados no Git;&lt;/li&gt;
&lt;li&gt;cenários legíveis;&lt;/li&gt;
&lt;li&gt;validação JSON com pouco boilerplate;&lt;/li&gt;
&lt;li&gt;execução headless em CI;&lt;/li&gt;
&lt;li&gt;uma abordagem code-first para testes de API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As principais compensações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exige Java instalado;&lt;/li&gt;
&lt;li&gt;a DSL precisa ser aprendida;&lt;/li&gt;
&lt;li&gt;reutilização avançada pode exigir JavaScript ou interoperabilidade Java;&lt;/li&gt;
&lt;li&gt;pessoas não desenvolvedoras podem ter dificuldade para criar e manter cenários.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja: o Karate é forte para times que tratam testes como código e querem manter a suíte próxima da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Karate vs uma abordagem sem código com Apidog
&lt;/h2&gt;

&lt;p&gt;O Karate é baseado em código: você escreve arquivos &lt;code&gt;.feature&lt;/code&gt;, versiona no Git e executa por build tool ou jar.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; segue uma abordagem visual e sem código. Você cria cenários na UI, encadeia requisições e adiciona asserções por configuração, sem escrever DSL.&lt;/p&gt;

&lt;p&gt;Como o ciclo de vida da API fica no mesmo lugar — design, depuração, mocking, documentação e testes — os testes podem reutilizar endpoints e esquemas já definidos. Isso reduz a barreira para QA, produto e outras pessoas que não querem manter um projeto Java.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9jfjzf870u06hqv1x5qx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9jfjzf870u06hqv1x5qx.png" alt="Apidog API testing" width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As suítes visuais também podem rodar em CI com o Apidog CLI.&lt;/p&gt;

&lt;p&gt;Instale com Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute um cenário ou suíte salvo por ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenarioOrSuiteId&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;environmentId&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli,html,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Principais flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: cenário, pasta ou suíte;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ambiente;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reportadores, como &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt; e &lt;code&gt;junit&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; ou &lt;code&gt;--iteration-data&lt;/code&gt;: arquivo ou ID de dados de teste para execução orientada a dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Apidog CLI é headless e roda em qualquer CI com Node. Ele executa cenários salvos no Apidog; não é um remetente interativo de requisições nem um gerador de carga.&lt;/p&gt;

&lt;p&gt;Veja mais em &lt;a href="https://apidog.com/pt/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI para CI/CD&lt;/a&gt; e na comparação &lt;a href="https://apidog.com/pt/blog/apidog-cli-vs-newman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI vs Newman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A diferença principal é o estilo de autoria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Karate: DSL em arquivos versionados no Git.&lt;/li&gt;
&lt;li&gt;Apidog: criação visual com execução headless em pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como escolher
&lt;/h2&gt;

&lt;p&gt;Escolha Karate se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;seu time é majoritariamente desenvolvedor;&lt;/li&gt;
&lt;li&gt;vocês já usam Java/JVM;&lt;/li&gt;
&lt;li&gt;testes devem viver no Git junto com o código;&lt;/li&gt;
&lt;li&gt;a equipe quer controle detalhado por DSL;&lt;/li&gt;
&lt;li&gt;a suíte será mantida como código.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Escolha uma ferramenta sem código como o Apidog se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QA e produto também precisam criar ou editar testes;&lt;/li&gt;
&lt;li&gt;você quer conectar testes com design e documentação de API;&lt;/li&gt;
&lt;li&gt;prefere evitar um projeto Java só para validar APIs;&lt;/li&gt;
&lt;li&gt;precisa manter execução em CI via CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algumas equipes usam os dois: Karate para regressões profundas mantidas por engenharia e uma ferramenta visual para cobertura ampla que mais pessoas conseguem estender.&lt;/p&gt;

&lt;p&gt;Se você ainda está comparando opções, veja como &lt;a href="https://apidog.com/pt/blog/api-automation-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;escolher um framework de teste de automação de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Preciso saber Java para usar o Karate?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não para escrever testes básicos de API. Os arquivos &lt;code&gt;.feature&lt;/code&gt; usam a DSL do Karate com sintaxe Gherkin. Você precisa ter Java instalado para executar os testes, e conhecimento de Java ou JavaScript ajuda em helpers e reutilização avançada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual é a diferença entre Karate e Cucumber?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ambos usam &lt;code&gt;Dado / Quando / Então&lt;/code&gt;. No Cucumber, você normalmente implementa o código das definições de steps. No Karate, os steps HTTP e asserções já vêm prontos para testes de API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Karate pode rodar sem Maven ou Gradle?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Use o &lt;code&gt;karate.jar&lt;/code&gt; standalone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; karate.jar &amp;lt;caminho&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele suporta tags, paralelismo e diretório de saída personalizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que significam &lt;code&gt;#string&lt;/code&gt;, &lt;code&gt;#number&lt;/code&gt; e &lt;code&gt;#[10]&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
São matchers flexíveis do Karate. &lt;code&gt;#string&lt;/code&gt; valida uma string, &lt;code&gt;#number&lt;/code&gt; valida um número e &lt;code&gt;#[10]&lt;/code&gt; valida um array com 10 itens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes de API sem código ainda podem rodar em CI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Uma ferramenta visual como o Apidog pode executar cenários salvos via Apidog CLI em qualquer pipeline com Node. Assim, você cria os testes na UI e mantém execução automatizada em CI.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testes de Regressão de API: Como Identificar Erros Críticos Antecipadamente</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 07:37:31 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/testes-de-regressao-de-api-como-identificar-erros-criticos-antecipadamente-1m00</link>
      <guid>https://dev.to/lucas_ferreira/testes-de-regressao-de-api-como-identificar-erros-criticos-antecipadamente-1m00</guid>
      <description>&lt;p&gt;Você envia uma pequena alteração para um endpoint. O código compila, o recurso funciona e você implanta. Dois dias depois, um cliente móvel começa a travar porque um campo que antes era &lt;code&gt;string&lt;/code&gt; agora é um objeto. A mudança parecia local. Não era.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Teste de regressão de API serve para detectar esse tipo de quebra antes que ela chegue aos consumidores. A ideia é simples: você salva um conjunto de requisições e asserções que representam o comportamento atual da API e executa esse conjunto a cada alteração. Se um código de status, formato de resposta, campo obrigatório ou valor contratual mudar, o teste falha e aponta onde ocorreu a regressão.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é teste de regressão de API
&lt;/h2&gt;

&lt;p&gt;Teste de regressão significa reexecutar testes que já passaram para confirmar que o comportamento existente continua válido após uma alteração.&lt;/p&gt;

&lt;p&gt;Em APIs, esse comportamento é o contrato HTTP usado pelos consumidores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotas disponíveis&lt;/li&gt;
&lt;li&gt;Métodos HTTP&lt;/li&gt;
&lt;li&gt;Códigos de status&lt;/li&gt;
&lt;li&gt;Estrutura da resposta&lt;/li&gt;
&lt;li&gt;Tipos dos campos&lt;/li&gt;
&lt;li&gt;Campos obrigatórios&lt;/li&gt;
&lt;li&gt;Valores com significado contratual&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APIs regridem por motivos comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um campo JSON é renomeado&lt;/li&gt;
&lt;li&gt;Um &lt;code&gt;200&lt;/code&gt; vira &lt;code&gt;204&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Uma validação nova rejeita entradas antes aceitas&lt;/li&gt;
&lt;li&gt;Uma atualização de ORM muda o formato de datas&lt;/li&gt;
&lt;li&gt;Uma dependência altera mensagens de erro&lt;/li&gt;
&lt;li&gt;Um campo obrigatório deixa de ser retornado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas quebras raramente aparecem como erro de compilação. Elas aparecem como integrações quebradas.&lt;/p&gt;

&lt;p&gt;O foco do teste de regressão de API não é testar todo o sistema. É proteger a superfície HTTP à qual outros sistemas se acoplam.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que usar como baseline
&lt;/h2&gt;

&lt;p&gt;O baseline é o comportamento esperado que será comparado nas próximas execuções.&lt;/p&gt;

&lt;p&gt;Ele deve cobrir o que quebraria um consumidor real, sem travar o teste em dados voláteis.&lt;/p&gt;

&lt;p&gt;Use estas quatro camadas como referência.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Códigos de status
&lt;/h3&gt;

&lt;p&gt;Cada endpoint deve retornar um status conhecido para entradas conhecidas.&lt;/p&gt;

&lt;p&gt;Exemplos de regressão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /users retornava 201 e passou a retornar 200
GET /users/42 retornava 200 e passou a retornar 500
DELETE /users/42 retornava 204 e passou a retornar 404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Esquema de resposta
&lt;/h3&gt;

&lt;p&gt;Valide estrutura e tipos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Asserções úteis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body.id é number
body.email é string
body.status é string
body.roles é array
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mudanças como estas devem falhar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- "email": "alice@example.com"
&lt;/span&gt;&lt;span class="gi"&gt;+ "email": { "value": "alice@example.com" }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Campos-chave
&lt;/h3&gt;

&lt;p&gt;Não valide todos os valores. Valide os que têm significado contratual.&lt;/p&gt;

&lt;p&gt;Bons candidatos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; deve existir&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt; deve estar em um enum conhecido&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;total&lt;/code&gt; deve ser número&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;email&lt;/code&gt; deve ter formato de e-mail&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;items&lt;/code&gt; deve ser array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body.status é um de ["active", "pending", "suspended"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Contrato OpenAPI
&lt;/h3&gt;

&lt;p&gt;Compare a resposta real com a especificação OpenAPI.&lt;/p&gt;

&lt;p&gt;Se a especificação diz que &lt;code&gt;email&lt;/code&gt; é obrigatório e a API deixa de retorná-lo, isso deve falhar.&lt;/p&gt;

&lt;p&gt;Para aprofundar essa abordagem, veja &lt;a href="https://apidog.com/pt/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste de contrato de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo de baseline para um endpoint
&lt;/h2&gt;

&lt;p&gt;Um baseline mínimo para &lt;code&gt;GET /v1/users/42&lt;/code&gt; poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /v1/users/42 -&amp;gt; 200

Asserções:
- body.id está presente
- body.id é number
- body.email está presente
- body.email é string
- body.email corresponde ao formato de e-mail
- body.status é um de ["active", "pending", "suspended"]
- body.roles é array
- response time &amp;lt; 800 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas verificações protegem o contrato sem depender de valores dinâmicos.&lt;/p&gt;

&lt;p&gt;Evite isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body.createdAt == "2026-01-01T10:00:00Z"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefira isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body.createdAt é string
body.createdAt segue formato ISO 8601
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para mais exemplos de verificações em respostas, veja &lt;a href="https://apidog.com/pt/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;asserções de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teste manual vs. automatizado
&lt;/h2&gt;

&lt;p&gt;Você pode testar regressão manualmente: abrir um cliente de API, reenviar requisições salvas e inspecionar respostas.&lt;/p&gt;

&lt;p&gt;Isso funciona para poucos endpoints. Depois, quebra por três motivos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pessoas esquecem de executar os testes&lt;/li&gt;
&lt;li&gt;Casos repetitivos são ignorados&lt;/li&gt;
&lt;li&gt;O teste não roda automaticamente em pull requests, merges ou deploys&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automatizar remove essa decisão humana. O conjunto roda sempre.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critério&lt;/th&gt;
&lt;th&gt;Manual&lt;/th&gt;
&lt;th&gt;Automatizado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Executa em cada alteração&lt;/td&gt;
&lt;td&gt;Não, depende da disciplina&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cobertura&lt;/td&gt;
&lt;td&gt;Poucos endpoints&lt;/td&gt;
&lt;td&gt;Conjunto completo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custo por execução&lt;/td&gt;
&lt;td&gt;Tempo humano&lt;/td&gt;
&lt;td&gt;Computação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roda de madrugada&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Esforço inicial&lt;/td&gt;
&lt;td&gt;Baixo&lt;/td&gt;
&lt;td&gt;Moderado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para qualquer API usada por clientes, apps móveis, parceiros ou outros serviços, automatize.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como construir um conjunto de regressão reutilizável
&lt;/h2&gt;

&lt;p&gt;Um conjunto de regressão é um grupo de requisições salvas com asserções.&lt;/p&gt;

&lt;p&gt;A meta é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar uma vez&lt;/li&gt;
&lt;li&gt;Executar sempre&lt;/li&gt;
&lt;li&gt;Estender quando novos endpoints ou bugs aparecerem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Agrupe por recurso
&lt;/h3&gt;

&lt;p&gt;Organize por área da API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users
/orders
/payments
/auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Regression Suite
├── Users
│   ├── GET /users/{id}
│   ├── POST /users
│   └── PATCH /users/{id}
├── Orders
│   ├── GET /orders/{id}
│   └── POST /orders
└── Auth
    └── POST /login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso facilita identificar qual grupo observar quando um serviço muda.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use variáveis de ambiente
&lt;/h3&gt;

&lt;p&gt;Não codifique valores como URL base, tokens ou IDs fixos em cada requisição.&lt;/p&gt;

&lt;p&gt;Use variáveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{baseUrl}}
{{accessToken}}
{{tenantId}}
{{userId}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de ambientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local:
  baseUrl = http://localhost:3000

staging:
  baseUrl = https://staging.api.example.com

production:
  baseUrl = https://api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o mesmo conjunto roda em local, staging ou produção mudando apenas o ambiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Encadeie requisições
&lt;/h3&gt;

&lt;p&gt;Fluxos reais normalmente dependem de respostas anteriores.&lt;/p&gt;

&lt;p&gt;Exemplo CRUD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /users
  extrai body.id como userId

GET /users/{{userId}}
  valida dados criados

PATCH /users/{{userId}}
  atualiza status

DELETE /users/{{userId}}
  remove recurso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse tipo de fluxo detecta regressões que não aparecem em testes isolados.&lt;/p&gt;

&lt;p&gt;Essa prática se aproxima do &lt;a href="https://apidog.com/pt/blog/api-integration-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste de integração de API&lt;/a&gt;, porque valida a sequência entre endpoints.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use dados para cobrir casos de borda
&lt;/h3&gt;

&lt;p&gt;Em vez de criar várias requisições quase iguais, use uma tabela de dados.&lt;/p&gt;

&lt;p&gt;Exemplo CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;email,expectedStatus
alice@example.com,201
bob@test.co,201
not-an-email,422
,422
a@b,422
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A mesma requisição roda cinco vezes, cada uma com entrada e status esperado diferentes.&lt;/p&gt;

&lt;p&gt;Exemplo de lógica do teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /users
body.email = {{email}}

Asserção:
response.status == {{expectedStatus}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione uma nova linha quando encontrar um novo caso de borda. Você aumenta cobertura sem duplicar requisições.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Mantenha o conjunto rápido
&lt;/h3&gt;

&lt;p&gt;Um conjunto lento será ignorado.&lt;/p&gt;

&lt;p&gt;Boas práticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rode apenas o conjunto principal em pull requests&lt;/li&gt;
&lt;li&gt;Deixe fluxos longos para execução noturna&lt;/li&gt;
&lt;li&gt;Simule serviços externos lentos&lt;/li&gt;
&lt;li&gt;Evite dependência de dados instáveis&lt;/li&gt;
&lt;li&gt;Paralelize requisições independentes quando a ferramenta permitir&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um bom objetivo para PRs é manter o conjunto principal em poucos minutos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como executar o conjunto na CI
&lt;/h2&gt;

&lt;p&gt;Um conjunto salvo apenas no seu laptop não protege o repositório.&lt;/p&gt;

&lt;p&gt;Execute os testes nos eventos que podem introduzir regressões:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull requests&lt;/li&gt;
&lt;li&gt;Merges no branch principal&lt;/li&gt;
&lt;li&gt;Deploys para staging&lt;/li&gt;
&lt;li&gt;Deploys para produção, quando aplicável&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O padrão é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalar um runner headless&lt;/li&gt;
&lt;li&gt;Apontar para o conjunto salvo&lt;/li&gt;
&lt;li&gt;Executar contra um ambiente&lt;/li&gt;
&lt;li&gt;Fazer a build falhar se alguma asserção falhar&lt;/li&gt;
&lt;li&gt;Publicar relatório&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O Apidog fornece o &lt;code&gt;apidog-cli&lt;/code&gt; para isso.&lt;/p&gt;

&lt;p&gt;Instale com Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute um cenário, pasta ou conjunto salvo pelo ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; 789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,html,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parâmetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--access-token&lt;/code&gt;: autentica a execução. Armazene como segredo da CI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID do cenário, pasta ou conjunto.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID do ambiente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: formatos de relatório.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formatos comuns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cli    imprime resultado no console
html   gera relatório legível
junit  gera XML para a CI exibir testes aprovados/falhos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exemplo com GitHub Actions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API Regression&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;regression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v6&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v6&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;22'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Apidog CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g apidog-cli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API regression suite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;apidog run \&lt;/span&gt;
            &lt;span class="s"&gt;--access-token "$APIDOG_ACCESS_TOKEN" \&lt;/span&gt;
            &lt;span class="s"&gt;-t 123456 \&lt;/span&gt;
            &lt;span class="s"&gt;-e 789012 \&lt;/span&gt;
            &lt;span class="s"&gt;-r cli,junit&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_ACCESS_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se uma asserção falhar, o runner retorna código diferente de zero e o job fica vermelho. O pull request deve ser bloqueado até a regressão ser corrigida ou explicitamente aceita.&lt;/p&gt;

&lt;p&gt;Para exemplos completos de pipeline, veja &lt;a href="https://apidog.com/pt/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI para CI/CD&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/api-test-automation-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como automatizar testes de API no GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando com arquivo de dados
&lt;/h2&gt;

&lt;p&gt;Se o cenário usa dados externos, passe o arquivo com &lt;code&gt;-d&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; 789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; ./test-data/emails.csv &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test-data/
└── emails.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso, uma única requisição pode ser executada várias vezes com entradas diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando testes de um branch específico
&lt;/h2&gt;

&lt;p&gt;Se você mantém versões diferentes do conjunto em branches, use &lt;code&gt;--branch&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; 789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--branch&lt;/span&gt; feature/new-user-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para manter histórico de execuções na nuvem, adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--upload-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 123456 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; 789012 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,junit &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--upload-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use diferenciação de esquema para detectar quebras antes do deploy
&lt;/h2&gt;

&lt;p&gt;Asserções detectam regressões na API em execução. A diferenciação de esquema detecta regressões na especificação.&lt;/p&gt;

&lt;p&gt;O fluxo é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A especificação OpenAPI fica versionada no repositório&lt;/li&gt;
&lt;li&gt;Um pull request altera a especificação&lt;/li&gt;
&lt;li&gt;A CI compara a nova versão com a anterior&lt;/li&gt;
&lt;li&gt;Mudanças são classificadas como seguras ou incompatíveis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplos de mudanças normalmente seguras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Adicionar campo opcional
Adicionar novo endpoint
Adicionar novo valor opcional
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplos de mudanças incompatíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remover campo
Renomear campo
Alterar tipo de string para object
Tornar campo opcional obrigatório
Remover valor de enum
Alterar código de status esperado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferenciação ajuda o revisor a ver algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Breaking change: removed response property user.phone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;em vez de revisar manualmente uma parede de YAML.&lt;/p&gt;

&lt;p&gt;Combine isso com testes de contrato contra a API ao vivo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A especificação diz o que deve acontecer&lt;/li&gt;
&lt;li&gt;A API real é validada contra essa especificação&lt;/li&gt;
&lt;li&gt;Se código e contrato divergirem, o teste falha&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mudanças incompatíveis nem sempre são bugs. Às vezes são intencionais. O ponto é torná-las explícitas e passar por versionamento, comunicação e descontinuação.&lt;/p&gt;

&lt;p&gt;Para esse processo, veja &lt;a href="https://apidog.com/pt/blog/api-versioning-deprecation-strategy?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como versionar e descontinuar APIs em escala&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como o Apidog ajuda nesse fluxo
&lt;/h2&gt;

&lt;p&gt;O Apidog reúne design de API, cenários de teste, asserções e execução headless em CI.&lt;/p&gt;

&lt;p&gt;Na prática, você pode:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar cenários visualmente&lt;/li&gt;
&lt;li&gt;Encadear requisições&lt;/li&gt;
&lt;li&gt;Extrair valores de uma resposta para a próxima&lt;/li&gt;
&lt;li&gt;Adicionar asserções de status, esquema e campos&lt;/li&gt;
&lt;li&gt;Validar respostas contra o esquema salvo do endpoint&lt;/li&gt;
&lt;li&gt;Executar cenários com dados CSV ou JSON&lt;/li&gt;
&lt;li&gt;Rodar tudo na CI com &lt;code&gt;apidog-cli&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de fluxo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /users
  salva body.id em userId

GET /users/{{userId}}
  valida status 200
  valida body.id
  valida body.email
  valida schema

PATCH /users/{{userId}}
  valida status 200
  valida body.status

DELETE /users/{{userId}}
  valida status 204
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;apidog-cli&lt;/code&gt; não é um cliente interativo nem um gerador de carga. Ele tem um escopo específico: reproduzir conjuntos salvos de forma headless e reportar o resultado.&lt;/p&gt;

&lt;p&gt;Para um fluxo scriptado completo, veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de pipeline de CI/CD do Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo inicial para implementar esta semana
&lt;/h2&gt;

&lt;p&gt;Use este plano se você ainda não tem regressão automatizada de API.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Escolha os cinco endpoints mais chamados
&lt;/h3&gt;

&lt;p&gt;Comece pelos endpoints com maior impacto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/{id}
POST /login
GET /orders/{id}
POST /orders
GET /me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O risco costuma estar onde há mais tráfego e mais consumidores.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Crie uma requisição salva por endpoint
&lt;/h3&gt;

&lt;p&gt;Para cada endpoint, adicione pelo menos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Código de status esperado
- Validação de esquema
- Dois ou três campos-chave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /orders/{{orderId}}

Asserções:
- status == 200
- body.id é string
- body.total é number
- body.status é um de ["created", "paid", "cancelled"]
- body.items é array
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Adicione um fluxo encadeado
&lt;/h3&gt;

&lt;p&gt;Escolha o recurso principal e teste o ciclo completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Criar -&amp;gt; Ler -&amp;gt; Atualizar -&amp;gt; Excluir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /products
GET /products/{{productId}}
PATCH /products/{{productId}}
DELETE /products/{{productId}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Adicione teste orientado a dados
&lt;/h3&gt;

&lt;p&gt;Escolha um endpoint com validação forte, como cadastro ou pagamento.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name,email,expectedStatus
Alice,alice@example.com,201
Bob,bob@test.co,201
Invalid,not-an-email,422
Empty,,422
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Conecte à CI
&lt;/h3&gt;

&lt;p&gt;Adicione um job que:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- instala apidog-cli
- executa o conjunto
- gera relatório JUnit
- falha o pull request se houver regressão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Transforme bugs escapados em testes
&lt;/h3&gt;

&lt;p&gt;Quando uma regressão chegar à produção:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Corrija o bug&lt;/li&gt;
&lt;li&gt;Reproduza o caso no conjunto de regressão&lt;/li&gt;
&lt;li&gt;Adicione uma asserção&lt;/li&gt;
&lt;li&gt;Garanta que o mesmo bug não escape novamente&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse é o ciclo que torna o conjunto mais forte com o tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como o teste de regressão de API difere do teste de regressão geral?
&lt;/h3&gt;

&lt;p&gt;Teste de regressão geral verifica o comportamento do sistema como um todo, incluindo UI, lógica de negócio e integrações internas.&lt;/p&gt;

&lt;p&gt;Teste de regressão de API foca na superfície HTTP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotas&lt;/li&gt;
&lt;li&gt;Métodos&lt;/li&gt;
&lt;li&gt;Códigos de status&lt;/li&gt;
&lt;li&gt;Esquemas de resposta&lt;/li&gt;
&lt;li&gt;Campos obrigatórios&lt;/li&gt;
&lt;li&gt;Valores contratuais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse foco mantém o conjunto rápido o suficiente para rodar em cada pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Com que frequência devo executar o conjunto?
&lt;/h3&gt;

&lt;p&gt;Execute em toda alteração que possa afetar a API.&lt;/p&gt;

&lt;p&gt;Na prática:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em cada pull request&lt;/li&gt;
&lt;li&gt;Em cada merge no branch principal&lt;/li&gt;
&lt;li&gt;Antes de deploys importantes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mantenha um conjunto rápido para PRs e deixe fluxos longos para execuções noturnas.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que devo afirmar para evitar testes frágeis?
&lt;/h3&gt;

&lt;p&gt;Afirme o que quebraria um consumidor.&lt;/p&gt;

&lt;p&gt;Boas asserções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status == 200
body.id existe
body.id é string
body.status está em enum conhecido
body.createdAt segue formato ISO 8601
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Evite travar valores voláteis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body.createdAt == "2026-01-01T10:00:00Z"
response.time == 132 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefira validar tipo, formato e limites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso executar regressão de API sem escrever código?
&lt;/h3&gt;

&lt;p&gt;Sim. Ferramentas como o Apidog permitem criar cenários e asserções visualmente. Depois, o &lt;code&gt;apidog-cli&lt;/code&gt; executa esses cenários na CI sem exigir um harness de teste escrito à mão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como lidar com mudanças intencionais que quebram compatibilidade?
&lt;/h3&gt;

&lt;p&gt;Não trate como surpresa.&lt;/p&gt;

&lt;p&gt;Use um processo explícito:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Detecte a quebra via diff de esquema&lt;/li&gt;
&lt;li&gt;Revise a mudança no pull request&lt;/li&gt;
&lt;li&gt;Versione o endpoint se necessário&lt;/li&gt;
&lt;li&gt;Comunique consumidores&lt;/li&gt;
&lt;li&gt;Deprecie o comportamento antigo&lt;/li&gt;
&lt;li&gt;Atualize o baseline deliberadamente&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O objetivo não é impedir toda mudança. É impedir que mudanças incompatíveis cheguem aos consumidores sem controle.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O que é Flowise? O construtor low-code de código aberto para apps LLM e agentes de IA</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 04:19:09 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/o-que-e-flowise-o-construtor-low-code-de-codigo-aberto-para-apps-llm-e-agentes-de-ia-3f9e</link>
      <guid>https://dev.to/lucas_ferreira/o-que-e-flowise-o-construtor-low-code-de-codigo-aberto-para-apps-llm-e-agentes-de-ia-3f9e</guid>
      <description>&lt;p&gt;Se você quer criar um aplicativo LLM ou um agente de IA sem conectar cada componente manualmente em Python, o Flowise oferece uma alternativa visual e low-code. Você monta nós, conecta entradas e saídas, testa o fluxo na própria interface e publica um endpoint REST para consumir no seu app. Neste guia, você verá o que é o Flowise, quando usar chatflows, agentflows ou assistentes, como executar localmente, como chamar o endpoint de previsão e como testar esse contrato de API. Se você já leu nossa explicação sobre &lt;a href="https://apidog.com/pt/blog/langgraph?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;LangGraph&lt;/a&gt;, pense no Flowise como o lado visual-first do espectro. O código-fonte está no &lt;a href="https://github.com/FlowiseAI/Flowise" rel="noopener noreferrer"&gt;README do projeto no GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Flowise
&lt;/h2&gt;

&lt;p&gt;Flowise é uma plataforma open source para construir agentes de IA e fluxos de trabalho com LLMs. Ele é distribuído sob a licença Apache 2.0, então você pode executá-lo localmente, hospedá-lo por conta própria ou fazer um fork.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwx8eabiju89rsog78ngg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwx8eabiju89rsog78ngg.png" alt="Flowise" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A ideia central é uma tela baseada em nós. Cada nó representa um bloco de construção:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modelo de chat;&lt;/li&gt;
&lt;li&gt;armazenamento de vetores;&lt;/li&gt;
&lt;li&gt;carregador de documentos;&lt;/li&gt;
&lt;li&gt;memória;&lt;/li&gt;
&lt;li&gt;retriever;&lt;/li&gt;
&lt;li&gt;ferramenta externa;&lt;/li&gt;
&lt;li&gt;lógica personalizada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você arrasta os nós para a tela, conecta as saídas às entradas e define como os dados fluem. Quando o fluxo está pronto, o Flowise o expõe como uma API REST que pode ser chamada por qualquer frontend, backend ou serviço interno.&lt;/p&gt;

&lt;p&gt;Nos bastidores, o Flowise conecta componentes de frameworks como LangChain e LlamaIndex. Se você já trabalhou com cadeias, agentes, retrievers, vector stores ou query engines, os conceitos serão familiares. A diferença é a forma de montagem: em vez de importar classes e escrever a orquestração em código, você compõe o fluxo visualmente.&lt;/p&gt;

&lt;p&gt;A troca é clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;você ganha velocidade, legibilidade e colaboração visual;&lt;/li&gt;
&lt;li&gt;você perde parte do controle granular de uma implementação code-first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chatflows, agentflows e assistentes
&lt;/h2&gt;

&lt;p&gt;Flowise oferece três tipos principais de construtores. Escolher o tipo certo evita complexidade desnecessária.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de construtor&lt;/th&gt;
&lt;th&gt;Melhor para&lt;/th&gt;
&lt;th&gt;Escopo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Assistente&lt;/td&gt;
&lt;td&gt;Iniciantes; assistentes de chat que seguem instruções, usam ferramentas e fazem RAG sobre arquivos enviados&lt;/td&gt;
&lt;td&gt;Mais restrito, mais guiado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chatflow&lt;/td&gt;
&lt;td&gt;Sistemas de agente único, chatbots, fluxos LLM mais simples; suporta Graph RAG e rerankers&lt;/td&gt;
&lt;td&gt;Agente único&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentflow&lt;/td&gt;
&lt;td&gt;Sistemas multiagente e orquestração complexa com ramificação, looping e roteamento&lt;/td&gt;
&lt;td&gt;Mais amplo; um superconjunto de Chatflow e Assistente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quando usar um chatflow
&lt;/h3&gt;

&lt;p&gt;Use um &lt;strong&gt;chatflow&lt;/strong&gt; quando você precisa de um pipeline direto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;receber uma pergunta;&lt;/li&gt;
&lt;li&gt;recuperar contexto;&lt;/li&gt;
&lt;li&gt;chamar um modelo;&lt;/li&gt;
&lt;li&gt;retornar uma resposta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse formato funciona bem para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chatbots de suporte;&lt;/li&gt;
&lt;li&gt;assistentes internos;&lt;/li&gt;
&lt;li&gt;RAG sobre documentação;&lt;/li&gt;
&lt;li&gt;fluxos LLM com um único agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quando usar um agentflow
&lt;/h3&gt;

&lt;p&gt;Use um &lt;strong&gt;agentflow&lt;/strong&gt; quando o fluxo precisa coordenar múltiplos passos ou agentes.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um agente classifica a intenção e outro executa a tarefa;&lt;/li&gt;
&lt;li&gt;o fluxo roteia perguntas para diferentes ferramentas;&lt;/li&gt;
&lt;li&gt;há ramificações condicionais;&lt;/li&gt;
&lt;li&gt;o workflow precisa repetir etapas até alcançar um critério;&lt;/li&gt;
&lt;li&gt;múltiplos agentes passam trabalho uns para os outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O agentflow é a camada indicada para orquestração mais complexa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar um assistente
&lt;/h3&gt;

&lt;p&gt;Use um &lt;strong&gt;assistente&lt;/strong&gt; quando você quer sair do zero rapidamente.&lt;/p&gt;

&lt;p&gt;Você define instruções, adiciona ferramentas e aponta arquivos para recuperação. É a opção mais guiada e com menos decisões de arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como montar um fluxo no Flowise
&lt;/h2&gt;

&lt;p&gt;A construção no Flowise segue um padrão simples.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie um novo chatflow.&lt;/li&gt;
&lt;li&gt;Arraste um nó de modelo de chat para a tela.&lt;/li&gt;
&lt;li&gt;Escolha um provedor, como OpenAI, Anthropic ou um modelo local.&lt;/li&gt;
&lt;li&gt;Se precisar de RAG, adicione um carregador de documentos.&lt;/li&gt;
&lt;li&gt;Adicione um armazenamento de vetores.&lt;/li&gt;
&lt;li&gt;Conecte o carregador ao vector store.&lt;/li&gt;
&lt;li&gt;Adicione um retriever para buscar contexto.&lt;/li&gt;
&lt;li&gt;Conecte o contexto ao modelo.&lt;/li&gt;
&lt;li&gt;Se precisar manter histórico, adicione um nó de memória.&lt;/li&gt;
&lt;li&gt;Salve o fluxo.&lt;/li&gt;
&lt;li&gt;Abra o painel de chat e teste uma pergunta real.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Um fluxo RAG básico pode seguir esta estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pergunta do usuário
        |
        v
Retriever -&amp;gt; Contexto recuperado
        |
        v
Modelo de chat
        |
        v
Resposta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O editor visual também suporta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expressões;&lt;/li&gt;
&lt;li&gt;nós de código personalizados;&lt;/li&gt;
&lt;li&gt;ramificação;&lt;/li&gt;
&lt;li&gt;looping;&lt;/li&gt;
&lt;li&gt;roteamento;&lt;/li&gt;
&lt;li&gt;lógica condicional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando um nó pronto não cobre seu caso, você pode criar uma função personalizada e manter o restante do fluxo visual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implantando o Flowise
&lt;/h2&gt;

&lt;p&gt;O Flowise roda como uma aplicação Node.js e usa a porta &lt;code&gt;3000&lt;/code&gt; por padrão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rodando com npm
&lt;/h3&gt;

&lt;p&gt;Para testar localmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; flowise
npx flowise start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, abra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rodando com Docker
&lt;/h3&gt;

&lt;p&gt;Para uma execução mais repetível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; flowise &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 flowiseai/flowise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique se o container está rodando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acesse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Flowise também suporta implantações auto-hospedadas e air-gapped, úteis quando seus dados não podem sair da sua rede.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chamando o endpoint de previsão REST
&lt;/h2&gt;

&lt;p&gt;Depois que um fluxo é salvo, o Flowise expõe uma API REST para ele. A &lt;a href="https://docs.flowiseai.com/api-reference/prediction" rel="noopener noreferrer"&gt;documentação oficial de previsão&lt;/a&gt; cobre o formato completo da requisição.&lt;/p&gt;

&lt;p&gt;Cada chatflow ou agentflow recebe um endpoint neste formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/prediction/{id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;{id}&lt;/code&gt; é o ID do fluxo.&lt;/p&gt;

&lt;p&gt;Uma chamada mínima com &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/api/v1/prediction/&amp;lt;flow-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"question": "Qual é o horário de funcionamento da sua loja?"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O campo principal é &lt;code&gt;question&lt;/code&gt;, mas o corpo pode incluir outros parâmetros, dependendo do fluxo.&lt;/p&gt;

&lt;p&gt;Exemplo com configurações adicionais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/api/v1/prediction/&amp;lt;flow-id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "question": "Resuma a política de reembolso.",
    "overrideConfig": {
      "temperature": 0.2
    },
    "history": [
      {
        "role": "user",
        "content": "Você pode me ajudar com dúvidas da loja?"
      },
      {
        "role": "assistant",
        "content": "Sim, posso ajudar."
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O corpo da requisição pode suportar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;question&lt;/code&gt;: pergunta enviada ao fluxo;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;streaming&lt;/code&gt;: habilita transmissão de tokens;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;overrideConfig&lt;/code&gt;: sobrescreve configurações por requisição;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;history&lt;/code&gt;: envia histórico anterior;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uploads&lt;/code&gt;: envia imagens ou áudio, quando suportado pelo fluxo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando o streaming está ativado, o Flowise emite eventos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;token&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;metadata&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;end&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse endpoint é o contrato entre o Flowise e o restante da sua aplicação. Por isso, ele deve ser tratado como qualquer outra API crítica: versionado, testado e monitorado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar low-code e quando preferir code-first
&lt;/h2&gt;

&lt;p&gt;Flowise é uma boa escolha quando você precisa de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prototipagem rápida;&lt;/li&gt;
&lt;li&gt;fluxos visuais legíveis pela equipe;&lt;/li&gt;
&lt;li&gt;chatbots internos;&lt;/li&gt;
&lt;li&gt;assistentes RAG;&lt;/li&gt;
&lt;li&gt;demos funcionais;&lt;/li&gt;
&lt;li&gt;colaboração com pessoas não engenheiras.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tela visual ajuda a explicar o comportamento do agente sem exigir que todos leiam arquivos Python.&lt;/p&gt;

&lt;p&gt;Frameworks code-first se destacam quando você precisa de mais controle. Se você está versionando lógica de agente no Git, escrevendo testes unitários detalhados para cada etapa ou criando máquinas de estado específicas, uma biblioteca como LangGraph ou o &lt;a href="https://apidog.com/pt/blog/google-adk?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Google Agent Development Kit&lt;/a&gt; pode ser mais adequada.&lt;/p&gt;

&lt;p&gt;O mesmo vale para o &lt;a href="https://apidog.com/pt/blog/how-to-use-openai-agents-sdk?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;OpenAI Agents SDK&lt;/a&gt; quando seus agentes dependem de chamadas de ferramentas personalizadas.&lt;/p&gt;

&lt;p&gt;Na prática, muitas equipes usam os dois caminhos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;prototipam no Flowise;&lt;/li&gt;
&lt;li&gt;validam o comportamento com usuários;&lt;/li&gt;
&lt;li&gt;estabilizam o design;&lt;/li&gt;
&lt;li&gt;portam partes críticas para código, se necessário.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A decisão não precisa ser binária. O Flowise também oferece API, CLI, SDKs, tracing, avaliação e human-in-the-loop. Ele pode ir além de um protótipo simples. Mas quanto mais sua lógica se parece com software tradicional, mais uma stack code-first tende a recompensar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando o endpoint de previsão e as APIs do fluxo
&lt;/h2&gt;

&lt;p&gt;Um agente no Flowise é tão confiável quanto as APIs por trás dele.&lt;/p&gt;

&lt;p&gt;Normalmente, o fluxo chama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uma API de LLM;&lt;/li&gt;
&lt;li&gt;um banco ou vector store;&lt;/li&gt;
&lt;li&gt;ferramentas externas;&lt;/li&gt;
&lt;li&gt;APIs REST internas;&lt;/li&gt;
&lt;li&gt;serviços de terceiros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses pontos podem falhar em produção. Por isso, teste tanto o endpoint do Flowise quanto as APIs que ele usa.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Teste o endpoint de previsão
&lt;/h3&gt;

&lt;p&gt;Trate este endpoint como qualquer endpoint REST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/prediction/{id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, crie uma requisição com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qual é o horário de funcionamento da sua loja?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, adicione &lt;a href="https://apidog.com/pt/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;asserções de API&lt;/a&gt; para validar o contrato da resposta.&lt;/p&gt;

&lt;p&gt;Exemplos do que verificar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status HTTP esperado;&lt;/li&gt;
&lt;li&gt;presença do campo de resposta;&lt;/li&gt;
&lt;li&gt;tipo dos campos retornados;&lt;/li&gt;
&lt;li&gt;ausência de erro;&lt;/li&gt;
&lt;li&gt;tempo máximo de resposta;&lt;/li&gt;
&lt;li&gt;conteúdo mínimo esperado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de checklist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status é 200
Resposta contém texto
Resposta não contém campo de erro
Tempo de resposta está dentro do limite esperado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ajuda a detectar mudanças no fluxo que quebram o contrato antes que seu app seja afetado.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Teste as APIs que o fluxo chama
&lt;/h3&gt;

&lt;p&gt;Além do endpoint de previsão, teste diretamente cada dependência externa.&lt;/p&gt;

&lt;p&gt;Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoint do provedor LLM;&lt;/li&gt;
&lt;li&gt;API de busca;&lt;/li&gt;
&lt;li&gt;API de CRM;&lt;/li&gt;
&lt;li&gt;API de pedidos;&lt;/li&gt;
&lt;li&gt;API de autenticação;&lt;/li&gt;
&lt;li&gt;ferramenta interna chamada pelo agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você quer desenvolver sem gastar tokens ou bater em rate limits, use uma &lt;a href="https://apidog.com/pt/blog/mock-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API mock&lt;/a&gt; com respostas realistas e previsíveis.&lt;/p&gt;

&lt;p&gt;Esse padrão é útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simular respostas do LLM;&lt;/li&gt;
&lt;li&gt;simular ferramentas de terceiros instáveis;&lt;/li&gt;
&lt;li&gt;testar erros controlados;&lt;/li&gt;
&lt;li&gt;manter testes determinísticos;&lt;/li&gt;
&lt;li&gt;rodar testes em CI sem depender de serviços externos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de resposta mockada para uma ferramenta de pedidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimatedDelivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-12"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, valide se o fluxo interpreta esse formato corretamente.&lt;/p&gt;

&lt;p&gt;Há um guia mais completo em nosso &lt;a href="https://apidog.com/pt/blog/ai-agent-apidog-test-harness?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de harness de teste de agente de IA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Separe ambientes
&lt;/h3&gt;

&lt;p&gt;Também vale configurar ambientes diferentes para desenvolvimento, teste e produção.&lt;/p&gt;

&lt;p&gt;No Apidog, você pode armazenar variáveis como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;base_url
flow_id
llm_api_key
tool_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o mesmo teste pode rodar contra ambientes diferentes sem alterar a requisição.&lt;/p&gt;

&lt;p&gt;Para &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;baixar o Apidog&lt;/a&gt; e configurá-lo, o processo leva poucos minutos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O Flowise é gratuito e de código aberto?
&lt;/h3&gt;

&lt;p&gt;Sim. O Flowise é open source sob a licença Apache 2.0. Você pode executá-lo gratuitamente em uma implantação própria usando npm ou Docker. Também existe uma opção de nuvem hospedada se você preferir não gerenciar infraestrutura.&lt;/p&gt;

&lt;p&gt;Para ambientes privados ou air-gapped, a rota auto-hospedada mantém tudo dentro da sua rede.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Flowise usa LangChain?
&lt;/h3&gt;

&lt;p&gt;O Flowise conecta componentes de LangChain e LlamaIndex. Os nós na tela mapeiam para conceitos familiares desses frameworks, como cadeias, agentes, armazenamentos de vetores, retrievers e motores de consulta.&lt;/p&gt;

&lt;p&gt;Você usa esses blocos sem escrever manualmente todo o código de conexão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual é a diferença entre um chatflow e um agentflow?
&lt;/h3&gt;

&lt;p&gt;Um chatflow é indicado para sistemas de agente único, chatbots e pipelines LLM mais simples.&lt;/p&gt;

&lt;p&gt;Um agentflow é mais amplo. Ele lida com sistemas multiagente e orquestrações com ramificação, looping e roteamento.&lt;/p&gt;

&lt;p&gt;Comece com um chatflow para um assistente direto. Use um agentflow quando múltiplos agentes ou etapas precisarem coordenar trabalho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como eu testo a API de um fluxo do Flowise?
&lt;/h3&gt;

&lt;p&gt;Chame o endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/prediction/{id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Envie um corpo JSON com uma &lt;code&gt;question&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"question"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Como acompanho meu pedido?"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode fazer isso com &lt;code&gt;curl&lt;/code&gt;, SDKs oficiais ou uma ferramenta dedicada.&lt;/p&gt;

&lt;p&gt;No &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, você envia a requisição, valida a resposta, simula as APIs LLM e de ferramentas que o fluxo chama e executa os testes em CI.&lt;/p&gt;

&lt;p&gt;Para detalhes sobre autenticação e streaming em endpoints LLM, veja nosso guia sobre &lt;a href="https://apidog.com/pt/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como testar a API do ChatGPT com o Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Flowise é uma forma low-code de construir aplicativos LLM e agentes de IA. Você monta fluxos em uma tela de nós, escolhe entre chatflows, agentflows e assistentes, e publica um endpoint REST sem escrever toda a orquestração manualmente.&lt;/p&gt;

&lt;p&gt;Ele funciona muito bem para protótipos, chatbots internos, assistentes RAG e fluxos que precisam ser entendidos pela equipe. Frameworks code-first ainda são melhores quando você precisa de controle profundo, testes unitários detalhados e lógica altamente customizada.&lt;/p&gt;

&lt;p&gt;Independentemente da abordagem, o agente depende das APIs que chama. Teste o endpoint de previsão, simule LLMs e ferramentas externas, valide o contrato das respostas e execute esses testes de forma automatizada. Isso aumenta a chance de o agente se comportar em produção da mesma forma que se comportou na tela do Flowise.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cypress Testes de API: Como Testar APIs com cy.request()</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 04:17:42 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/cypress-testes-de-api-como-testar-apis-com-cyrequest-4223</link>
      <guid>https://dev.to/lucas_ferreira/cypress-testes-de-api-como-testar-apis-com-cyrequest-4223</guid>
      <description>&lt;p&gt;Você já usa Cypress para testes end-to-end. Para validar uma API diretamente, você não precisa abrir a UI: use &lt;code&gt;cy.request()&lt;/code&gt; para enviar requisições HTTP reais, verificar status codes e fazer asserções no corpo JSON. O comando roda no processo Node do Cypress, fora do navegador, e funciona bem para testar endpoints isolados ou preparar estado antes de um teste de interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Neste guia, você verá como testar APIs com Cypress na prática: uso básico de &lt;code&gt;cy.request()&lt;/code&gt;, asserções em respostas, encadeamento de chamadas com token de autenticação e stubbing de tráfego do navegador com &lt;code&gt;cy.intercept()&lt;/code&gt;. Também verá quando o Cypress é suficiente e quando uma ferramenta nativa de API faz mais sentido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que testar APIs com Cypress
&lt;/h2&gt;

&lt;p&gt;Grande parte do que você valida na UI depende de uma API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/login&lt;/code&gt; retorna um token.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/users&lt;/code&gt; retorna uma lista no formato esperado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /orders&lt;/code&gt; cria um registro.&lt;/li&gt;
&lt;li&gt;Uma resposta &lt;code&gt;500&lt;/code&gt; exibe uma mensagem de erro na tela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testar esses endpoints diretamente ajuda em dois cenários:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verificações mais rápidas&lt;/strong&gt;: não há renderização, seleção de elementos ou espera por componentes da UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup de dados para testes e2e&lt;/strong&gt;: em vez de clicar em vários formulários para criar dados, você envia requisições HTTP e começa o teste já no estado desejado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se o Cypress já está na sua stack, você pode adicionar testes de API nos mesmos arquivos de spec, com as mesmas asserções &lt;code&gt;expect&lt;/code&gt; e no mesmo pipeline de CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamentos do &lt;code&gt;cy.request()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cy.request()&lt;/code&gt; envia uma requisição HTTP e retorna a resposta. Como ele roda no processo Node do Cypress, não fica sujeito a CORS ou à política de same-origin do navegador.&lt;/p&gt;

&lt;p&gt;Formas comuns de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chamada mais simples usa &lt;code&gt;GET&lt;/code&gt; por padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para controlar método, headers, query params e payload, prefira o objeto de opções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;API test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;created from Cypress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opções úteis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opção&lt;/th&gt;
&lt;th&gt;Uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;method&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verbo HTTP: &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; etc. O padrão é &lt;code&gt;GET&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Endpoint da API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;body&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Payload da requisição. Objetos são serializados como JSON.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cabeçalhos da requisição.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Credenciais para autenticação HTTP Basic.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query string como objeto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failOnStatusCode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;false&lt;/code&gt; para testar respostas &lt;code&gt;4xx&lt;/code&gt; ou &lt;code&gt;5xx&lt;/code&gt; sem falhar automaticamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Exemplo com query string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para testes negativos, desative &lt;code&gt;failOnStatusCode&lt;/code&gt;. Por padrão, o Cypress falha o teste quando a resposta não é &lt;code&gt;2xx&lt;/code&gt; ou &lt;code&gt;3xx&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users/99999&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;failOnStatusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fazendo asserções no status e no corpo
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cy.request()&lt;/code&gt; retorna um objeto de resposta. Encadeie &lt;code&gt;.then()&lt;/code&gt; para acessar os dados.&lt;/p&gt;

&lt;p&gt;Propriedades mais usadas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;status&lt;/code&gt;: código HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;body&lt;/code&gt;: corpo da resposta. Quando o &lt;code&gt;Content-Type&lt;/code&gt; é JSON, o Cypress converte para objeto JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;headers&lt;/code&gt;: headers da resposta.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;duration&lt;/code&gt;: tempo da requisição em milissegundos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Users API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;returns a list of users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;an&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como &lt;code&gt;response.body&lt;/code&gt; já é um objeto JavaScript, você pode usar Chai normalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users/1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nested&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;address.city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/@/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é comum validar headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para estruturar melhor esse tipo de validação, veja também o guia sobre &lt;a href="https://apidog.com/pt/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;asserções de API&lt;/a&gt; e as &lt;a href="https://apidog.com/pt/blog/api-testing-best-practices?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;melhores práticas de teste de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encadeando requisições e reutilizando um token de autenticação
&lt;/h2&gt;

&lt;p&gt;APIs reais geralmente exigem autenticação. O fluxo típico é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fazer login.&lt;/li&gt;
&lt;li&gt;Ler o token da resposta.&lt;/li&gt;
&lt;li&gt;Enviar o token nas próximas requisições.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Com &lt;code&gt;cy.request()&lt;/code&gt;, esse encadeamento fica direto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authenticated API flow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;logs in and fetches a protected resource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;loginResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loginResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;loginResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;

      &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;profileResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profileResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profileResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se vários testes precisam do mesmo token, mova o login para um &lt;code&gt;beforeEach&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Protected API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gets the current user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse padrão de login e reutilização de dados é comum em fluxos de &lt;a href="https://apidog.com/pt/blog/api-integration-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste de integração de API&lt;/a&gt;, onde uma chamada alimenta a próxima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando &lt;code&gt;cy.request()&lt;/code&gt; para preparar estado antes da UI
&lt;/h2&gt;

&lt;p&gt;Um dos usos mais práticos de &lt;code&gt;cy.request()&lt;/code&gt; é reduzir setup via interface.&lt;/p&gt;

&lt;p&gt;Em vez de criar um usuário clicando por várias telas, crie via API e visite diretamente a página que você quer testar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/test/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ada@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shows the created user in the dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Cypress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada Lovelace&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ada@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse padrão deixa seus testes de UI mais focados: a API prepara o estado, e a UI valida o comportamento visual.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;cy.intercept()&lt;/code&gt; para stubbing
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cy.request()&lt;/code&gt; acessa a API real. Quando você quer controlar o que o front-end recebe, use &lt;code&gt;cy.intercept()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A diferença é importante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cy.request()&lt;/code&gt; envia uma requisição HTTP real a partir do Node.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cy.intercept()&lt;/code&gt; intercepta requisições feitas pelo app no navegador.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cy.intercept()&lt;/code&gt; não intercepta chamadas feitas com &lt;code&gt;cy.request()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use &lt;code&gt;cy.intercept()&lt;/code&gt; para testar como a UI reage a respostas específicas da API.&lt;/p&gt;

&lt;p&gt;Exemplo de stub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, qualquer requisição do navegador para &lt;code&gt;/api/users&lt;/code&gt; recebe esse payload fixo.&lt;/p&gt;

&lt;p&gt;Isso é útil para simular cenários como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lista vazia;&lt;/li&gt;
&lt;li&gt;erro &lt;code&gt;500&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;timeout;&lt;/li&gt;
&lt;li&gt;payload incompleto;&lt;/li&gt;
&lt;li&gt;usuário sem permissões.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo testando erro de API na UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shows an error banner when the API fails&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Server error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;getUsers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@getUsers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;its&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response.statusCode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure a interceptação antes da ação que dispara a requisição. Caso contrário, o Cypress pode não capturar nada.&lt;/p&gt;

&lt;p&gt;Você também pode simular uma resposta lenta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;getUsers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Loading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@getUsers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No users found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;be.visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você está decidindo entre falsificar uma resposta ou simular um serviço inteiro, veja os posts sobre &lt;a href="https://apidog.com/pt/blog/api-mocking?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API mocking&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/api-stubbing-vs-mocking?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API stubbing vs API mocking&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando Cypress para API faz sentido
&lt;/h2&gt;

&lt;p&gt;Use Cypress para testes de API quando eles estão próximos da sua suite de UI.&lt;/p&gt;

&lt;p&gt;Bons casos de uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preparar dados antes de um teste e2e;&lt;/li&gt;
&lt;li&gt;validar rapidamente endpoints dos quais a UI depende;&lt;/li&gt;
&lt;li&gt;fazer smoke tests de API no mesmo pipeline do Cypress;&lt;/li&gt;
&lt;li&gt;autenticar via API antes de visitar uma página;&lt;/li&gt;
&lt;li&gt;simular respostas do backend com &lt;code&gt;cy.intercept()&lt;/code&gt; para testar estados da UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de smoke test simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;API smoke checks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;health endpoint is available&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quando uma ferramenta nativa de API faz mais sentido
&lt;/h2&gt;

&lt;p&gt;O Cypress funciona bem para verificações de API dentro de uma suite de navegador. Mas ele não foi projetado como uma plataforma completa de teste de API.&lt;/p&gt;

&lt;p&gt;Em uma suite grande e autônoma de API, algumas limitações aparecem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cada requisição precisa ser escrita em código;&lt;/li&gt;
&lt;li&gt;headers, bodies e query params ficam espalhados pelos arquivos de teste;&lt;/li&gt;
&lt;li&gt;não há um construtor visual de requisições;&lt;/li&gt;
&lt;li&gt;não há uma definição de API compartilhada como fonte central;&lt;/li&gt;
&lt;li&gt;o Cypress ainda inicializa contexto de navegador, mesmo em execuções focadas em API;&lt;/li&gt;
&lt;li&gt;colaboração entre QA, backend e frontend pode ficar menos fluida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É nesse cenário que uma ferramenta nativa de API se encaixa melhor. O &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; é construído em torno da própria API: você define endpoints, ambientes, autenticação, cenários e asserções em um workspace compartilhado. Para casos comuns, é possível montar requisições e validações visualmente, sem escrever tudo como código.&lt;/p&gt;

&lt;p&gt;Para CI, o Apidog CLI executa cenários salvos de forma headless em qualquer etapa que rode Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli

apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenarioOrSuiteId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;environmentId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,html,json,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flags principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: cenário ou suite salvo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ambiente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: formatos de relatório, como &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt; e &lt;code&gt;junit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; ou &lt;code&gt;--iteration-data&lt;/code&gt;: arquivo de dados para execução iterativa.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--upload-report&lt;/code&gt;: envia resultados de volta ao workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A saída JUnit se integra bem à maioria dos dashboards de CI.&lt;/p&gt;

&lt;p&gt;Uma regra prática:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use &lt;code&gt;cy.request()&lt;/code&gt; para verificações de API que suportam seus testes de navegador;&lt;/li&gt;
&lt;li&gt;use uma ferramenta nativa de API quando o teste de API for o trabalho principal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você está comparando opções, veja também as &lt;a href="https://apidog.com/pt/blog/api-test-automation-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ferramentas de automação de testes de API que rodam em CI/CD&lt;/a&gt; e as &lt;a href="https://apidog.com/pt/blog/30-best-api-testing-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;30 melhores ferramentas de teste de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;cy.request()&lt;/code&gt; é executado no navegador?
&lt;/h3&gt;

&lt;p&gt;Não. &lt;code&gt;cy.request()&lt;/code&gt; roda no processo Node do Cypress, fora do navegador. Por isso, ele não é bloqueado por CORS ou pela política de same-origin.&lt;/p&gt;

&lt;p&gt;Também por isso &lt;code&gt;cy.intercept()&lt;/code&gt; não intercepta &lt;code&gt;cy.request()&lt;/code&gt;. Se você precisa capturar uma requisição feita pelo navegador, dispare a chamada através do aplicativo e use &lt;code&gt;cy.intercept()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar uma resposta &lt;code&gt;400&lt;/code&gt; ou &lt;code&gt;404&lt;/code&gt; sem falhar o teste?
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;failOnStatusCode: false&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/users/invalid-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;failOnStatusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem essa opção, o Cypress falha automaticamente em respostas que não sejam &lt;code&gt;2xx&lt;/code&gt; ou &lt;code&gt;3xx&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso usar &lt;code&gt;cy.request()&lt;/code&gt; para fazer login antes de um teste de UI?
&lt;/h3&gt;

&lt;p&gt;Sim. Esse é um padrão comum.&lt;/p&gt;

&lt;p&gt;Você pode enviar um &lt;code&gt;POST&lt;/code&gt; para o endpoint de login, ler o token em &lt;code&gt;response.body&lt;/code&gt; e armazená-lo em &lt;code&gt;Cypress.env()&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt; ou cookie, dependendo de como sua aplicação autentica o usuário.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Qual é a diferença entre &lt;code&gt;cy.request()&lt;/code&gt; e &lt;code&gt;cy.intercept()&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;cy.request()&lt;/code&gt; envia uma requisição HTTP real e retorna a resposta real. Use para testar endpoints ou preparar dados.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cy.intercept()&lt;/code&gt; observa, espera ou simula requisições feitas pelo front-end no navegador. Use para controlar o que a UI recebe da API.&lt;/p&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;Uso principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cy.request()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Testar API real ou preparar estado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cy.intercept()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Espionar ou simular chamadas feitas pela UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Devo usar Cypress ou uma ferramenta dedicada para testes de API?
&lt;/h3&gt;

&lt;p&gt;Use Cypress quando as verificações de API complementam uma suite de testes de navegador que você já executa.&lt;/p&gt;

&lt;p&gt;Para uma suite grande de API, execução focada em CI, colaboração entre times e uma definição compartilhada de endpoints, uma ferramenta nativa de API como o Apidog tende a ser mais adequada.&lt;/p&gt;

&lt;p&gt;Para decidir a estratégia, consulte também as &lt;a href="https://apidog.com/pt/blog/api-testing-best-practices?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;melhores práticas de teste de API&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Economizar na API Claude (Opus 4.8 e Fable 5)</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 04:17:37 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-economizar-na-api-claude-opus-48-e-fable-5-5c4a</link>
      <guid>https://dev.to/lucas_ferreira/como-economizar-na-api-claude-opus-48-e-fable-5-5c4a</guid>
      <description>&lt;p&gt;Sua fatura do Claude é composta principalmente por tokens de entrada, não de saída. A API é sem estado (&lt;em&gt;stateless&lt;/em&gt;), então, a cada turno, você reenvia o histórico completo da conversa: prompt do sistema, definições de ferramentas, documentos colados e mensagens anteriores. Em loops de agente longos ou sessões de Claude Code, esse contexto reenviado cresce rápido — e você paga por ele em cada solicitação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;As alavancas que realmente reduzem custo são as que diminuem o que você envia, reduzem a taxa por token ou evitam reenviar contexto morto. Este guia mostra como aplicar cada uma: primeiro recursos nativos, depois o proxy pxpipe, e por fim onde uma API mock ajuda durante desenvolvimento e testes.&lt;/p&gt;

&lt;p&gt;Se você quer revisar os fundamentos de precificação primeiro — como o medidor funciona, o que é um token, como caching e batching são cobrados — veja nosso &lt;a href="https://apidog.com/pt/blog/claude-api-cost/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;explicador de custos da API Claude&lt;/a&gt;. Aqui o foco é reduzir a fatura na prática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alavanca 1: Cache de prompts
&lt;/h2&gt;

&lt;p&gt;O cache de prompts costuma ser a mudança com maior retorno para cargas de trabalho de agentes. A ideia é simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separe um prefixo estável da solicitação.&lt;/li&gt;
&lt;li&gt;Marque esse prefixo como armazenável em cache.&lt;/li&gt;
&lt;li&gt;Reutilize exatamente os mesmos bytes nas próximas chamadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse prefixo normalmente inclui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompt do sistema;&lt;/li&gt;
&lt;li&gt;definições de ferramentas;&lt;/li&gt;
&lt;li&gt;documentos de referência longos;&lt;/li&gt;
&lt;li&gt;instruções fixas de formato;&lt;/li&gt;
&lt;li&gt;contexto base compartilhado entre turnos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na próxima solicitação que começar com os mesmos bytes, o Claude lê do cache em vez de reprocessar o texto inteiro pelo preço cheio de entrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando o cache compensa
&lt;/h3&gt;

&lt;p&gt;Leituras do cache custam cerca de &lt;code&gt;0.1x&lt;/code&gt; a taxa de entrada base, ou seja, você pode economizar até ~90% na parte cacheada.&lt;/p&gt;

&lt;p&gt;Mas a escrita no cache custa mais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TTL de 5 minutos: &lt;code&gt;1.25x&lt;/code&gt; o token de entrada normal;&lt;/li&gt;
&lt;li&gt;TTL de 1 hora: &lt;code&gt;2x&lt;/code&gt; o token de entrada normal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por isso, cache só vale a pena quando o prefixo é reutilizado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cache de 5 minutos: ponto de equilíbrio em aproximadamente 2 solicitações;&lt;/li&gt;
&lt;li&gt;cache de 1 hora: ponto de equilíbrio em aproximadamente 3 solicitações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você cacheia um prefixo usado uma única vez, ele encarece a chamada. Se reutiliza dezenas de vezes, a parte cacheada fica quase gratuita depois da primeira escrita.&lt;/p&gt;

&lt;h3&gt;
  
  
  Checklist para não invalidar o cache
&lt;/h3&gt;

&lt;p&gt;O cache usa correspondência de prefixo em nível de byte. Qualquer alteração dentro da região cacheada força uma nova escrita.&lt;/p&gt;

&lt;p&gt;Evite colocar no prefixo estável:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamp;&lt;/li&gt;
&lt;li&gt;ID de sessão;&lt;/li&gt;
&lt;li&gt;contador de requisições;&lt;/li&gt;
&lt;li&gt;dados do usuário;&lt;/li&gt;
&lt;li&gt;mensagens recentes;&lt;/li&gt;
&lt;li&gt;ferramentas em ordem variável;&lt;/li&gt;
&lt;li&gt;documentos montados dinamicamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um padrão seguro é estruturar sua solicitação assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[REGIÃO CACHEÁVEL]
- prompt do sistema fixo
- ferramentas em ordem fixa
- documentação estável
- políticas fixas de resposta

[REGIÃO DINÂMICA]
- mensagem atual do usuário
- histórico recente
- dados da sessão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como verificar se está funcionando
&lt;/h3&gt;

&lt;p&gt;Não assuma que o cache está ativo. Leia o campo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage.cache_read_input_tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em chamadas repetidas com o mesmo prefixo, esse valor deve ser grande e diferente de zero.&lt;/p&gt;

&lt;p&gt;Se ele estiver sempre em zero, algum byte do prefixo está mudando entre chamadas. Nesse caso, você está pagando preço cheio enquanto acredita estar usando cache.&lt;/p&gt;

&lt;p&gt;Para a mecânica detalhada, veja &lt;a href="https://apidog.com/pt/blog/what-is-prompt-caching/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é cache de prompt e como funciona&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alavanca 2: Escolha o modelo certo
&lt;/h2&gt;

&lt;p&gt;O gasto excessivo mais comum é usar um modelo maior do que a tarefa exige. Em vez de definir um modelo padrão para tudo, roteie por tipo de tarefa.&lt;/p&gt;

&lt;p&gt;Precificação atual por 1M de tokens:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;ID do Modelo&lt;/th&gt;
&lt;th&gt;Entrada&lt;/th&gt;
&lt;th&gt;Saída&lt;/th&gt;
&lt;th&gt;Janela de contexto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fable 5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-fable-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$3 ($2 intro)&lt;/td&gt;
&lt;td&gt;$15 ($10 intro)&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 4.5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fable 5 custa 2x o Opus 4.8 na entrada e na saída.&lt;/li&gt;
&lt;li&gt;Opus 4.8 tem janela de contexto de 1M sem prêmio adicional para contexto longo.&lt;/li&gt;
&lt;li&gt;Sonnet 5 tem preço introdutório de $2/$10 até 31/08/2026, depois passa para $3/$15.&lt;/li&gt;
&lt;li&gt;Haiku 4.5 é o modelo base a $1/$5, com janela menor de 200K.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Roteamento recomendado
&lt;/h3&gt;

&lt;p&gt;Use uma matriz simples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de tarefa&lt;/th&gt;
&lt;th&gt;Modelo recomendado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raciocínio de longo prazo muito difícil&lt;/td&gt;
&lt;td&gt;Fable 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentes, codificação e uso intenso de ferramentas&lt;/td&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Produção de alto volume com boa qualidade&lt;/td&gt;
&lt;td&gt;Sonnet 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classificação, extração, roteamento e respostas curtas&lt;/td&gt;
&lt;td&gt;Haiku 4.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Na prática:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fable 5&lt;/strong&gt;: use apenas quando a capacidade extra muda o resultado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opus 4.8&lt;/strong&gt;: bom padrão para Claude Code e loops com muitas ferramentas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonnet 5&lt;/strong&gt;: útil para tráfego em volume quando custo por chamada importa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Haiku 4.5&lt;/strong&gt;: ideal para etapas simples do pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de estratégia de roteamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;chooseClaudeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;classification&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;coding&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bulk_summary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hard_reasoning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;classification&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hard_reasoning&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-fable-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;high&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um detalhe de faturamento sobre Fable 5: se um classificador de segurança recusar uma solicitação, o parâmetro beta &lt;code&gt;fallbacks&lt;/code&gt; pode redirecionar essa vez para Opus 4.8. A vez redirecionada é cobrada nas taxas do Opus. Em geral, isso é um desconto, não uma cobrança surpresa.&lt;/p&gt;

&lt;p&gt;Para análises mais detalhadas, veja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/pt/blog/claude-opus-4-8-pricing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precificação do Opus 4.8&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/pt/blog/claude-fable-5-pricing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;precificação do Fable 5&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/pt/blog/claude-fable-5-vs-opus-4-8/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Fable 5 vs Opus 4.8&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/pt/blog/how-to-use-claude-opus-4-8-for-free/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar o Opus 4.8 gratuitamente&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/pt/blog/how-to-use-claude-fable-5-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como chamar a API Fable 5&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alavanca 3: API em lote com 50% de desconto
&lt;/h2&gt;

&lt;p&gt;Se a tarefa não precisa de resposta em tempo real, use a API em Lote (&lt;em&gt;Batch API&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Você envia tarefas para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages/batches
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elas são executadas de forma assíncrona e você busca os resultados depois. A maioria dos lotes termina em uma hora; o limite máximo é de 24 horas.&lt;/p&gt;

&lt;p&gt;O desconto de 50% se aplica a todos os tokens do lote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entrada;&lt;/li&gt;
&lt;li&gt;saída.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bons casos de uso
&lt;/h3&gt;

&lt;p&gt;Use lote para trabalhos que podem esperar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avaliações em conjunto de testes;&lt;/li&gt;
&lt;li&gt;classificação em massa;&lt;/li&gt;
&lt;li&gt;extração em backlog;&lt;/li&gt;
&lt;li&gt;geração de resumos para registros existentes;&lt;/li&gt;
&lt;li&gt;tags e metadados adjacentes a embeddings;&lt;/li&gt;
&lt;li&gt;jobs noturnos;&lt;/li&gt;
&lt;li&gt;reprocessamento offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se metade do seu gasto com Claude vem de processamento noturno via endpoint síncrono, migrar essa metade para lote reduz diretamente 50% desse bloco de custo, sem mudar a qualidade.&lt;/p&gt;

&lt;p&gt;A única troca é latência. Se você não precisava da resposta imediata, é uma economia direta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alavanca 4: Ajuste &lt;code&gt;effort&lt;/code&gt;, &lt;code&gt;max_tokens&lt;/code&gt; e &lt;code&gt;count_tokens&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Três controles ajudam a limitar quanto uma solicitação pode gastar.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Reduza &lt;code&gt;output_config.effort&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O parâmetro &lt;code&gt;output_config.effort&lt;/code&gt; aceita:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;low
medium
high
xhigh
max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele controla quanto o modelo “pensa” antes de responder. Tokens de pensamento são faturados.&lt;/p&gt;

&lt;p&gt;Muitas tarefas executadas em &lt;code&gt;high&lt;/code&gt; por hábito funcionam em &lt;code&gt;medium&lt;/code&gt; ou &lt;code&gt;low&lt;/code&gt; com qualidade suficiente.&lt;/p&gt;

&lt;p&gt;Teste assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escolha uma amostra real de prompts.&lt;/li&gt;
&lt;li&gt;Rode com o esforço atual.&lt;/li&gt;
&lt;li&gt;Rode um nível abaixo.&lt;/li&gt;
&lt;li&gt;Compare qualidade, custo e latência.&lt;/li&gt;
&lt;li&gt;Reduza o padrão se a qualidade se mantiver.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de configuração conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-opus-4-8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output_config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Defina &lt;code&gt;max_tokens&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;max_tokens&lt;/code&gt; é um limite rígido para a saída.&lt;/p&gt;

&lt;p&gt;Ele não reduz o custo de uma resposta que já seria curta, mas evita o pior caso: o modelo gerar 4.000 tokens quando você esperava um JSON pequeno.&lt;/p&gt;

&lt;p&gt;Exemplos de teto por tarefa:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tarefa&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;max_tokens&lt;/code&gt; sugerido&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classificação&lt;/td&gt;
&lt;td&gt;20–100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extração JSON simples&lt;/td&gt;
&lt;td&gt;200–500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumo curto&lt;/td&gt;
&lt;td&gt;300–800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicação técnica&lt;/td&gt;
&lt;td&gt;1.000–2.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geração longa&lt;/td&gt;
&lt;td&gt;limite específico do produto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para respostas estruturadas, combine &lt;code&gt;max_tokens&lt;/code&gt; com instruções explícitas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Responda somente com JSON válido.
Não inclua explicações.
Use no máximo 5 campos.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Use &lt;code&gt;count_tokens&lt;/code&gt; antes de enviar
&lt;/h3&gt;

&lt;p&gt;O endpoint &lt;code&gt;count_tokens&lt;/code&gt; informa quantos tokens de entrada a solicitação cobrará usando o tokenizador do próprio Claude.&lt;/p&gt;

&lt;p&gt;Não use &lt;code&gt;tiktoken&lt;/code&gt; para estimar Claude. &lt;code&gt;tiktoken&lt;/code&gt; é o tokenizador da OpenAI e pode subestimar Claude em aproximadamente 15% a 20%.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;count_tokens&lt;/code&gt; quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;você tem orçamento por solicitação;&lt;/li&gt;
&lt;li&gt;usuários podem colar documentos grandes;&lt;/li&gt;
&lt;li&gt;o histórico cresce dinamicamente;&lt;/li&gt;
&lt;li&gt;o prompt é montado por várias fontes;&lt;/li&gt;
&lt;li&gt;você precisa bloquear chamadas caras antes de enviá-las.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fluxo recomendado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;montar solicitação
→ chamar count_tokens
→ comparar com orçamento
→ resumir/cortar se necessário
→ enviar para /messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alavanca 5: Reduza o contexto reenviado
&lt;/h2&gt;

&lt;p&gt;Como a API é sem estado, loops longos reenviam o histórico completo a cada turno.&lt;/p&gt;

&lt;p&gt;No 30º turno, boa parte disso já é peso morto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resultados de ferramentas já processados;&lt;/li&gt;
&lt;li&gt;explorações abandonadas;&lt;/li&gt;
&lt;li&gt;arquivos lidos uma única vez;&lt;/li&gt;
&lt;li&gt;mensagens antigas que não influenciam mais a próxima decisão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você continua pagando tokens de entrada para reenviar tudo.&lt;/p&gt;

&lt;p&gt;Duas funcionalidades no lado do servidor ajudam a podar esse contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edição de contexto
&lt;/h3&gt;

&lt;p&gt;A edição de contexto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clear_tool_uses_20250919
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;remove resultados de ferramentas obsoletos do contexto reenviado.&lt;/p&gt;

&lt;p&gt;Use quando seu agente chama ferramentas com frequência e os resultados antigos não precisam continuar no prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compactação
&lt;/h3&gt;

&lt;p&gt;A compactação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;compact_20260112
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;resume histórico antigo em uma forma menor.&lt;/p&gt;

&lt;p&gt;Use em conversas longas para evitar reenviar a transcrição bruta inteira.&lt;/p&gt;

&lt;p&gt;Essas duas abordagens rodam no lado do servidor. Você não precisa criar seu próprio sumarizador nem manipular arrays de mensagens manualmente.&lt;/p&gt;

&lt;p&gt;Para sessões longas de Claude Code, essa é a mesma pressão que aparece ao atingir limites de contexto no meio da tarefa. Veja o guia sobre &lt;a href="https://apidog.com/pt/blog/claude-code-token-window-reset/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;a janela de tokens do Claude Code e redefinições&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A regra prática é simples: não pague para reenviar contexto que o modelo não precisa mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indo além: renderizar contexto como imagens com pxpipe
&lt;/h2&gt;

&lt;p&gt;As alavancas anteriores reduzem ou reclassificam tokens enviados. O &lt;a href="https://github.com/teamchong/pxpipe" rel="noopener noreferrer"&gt;pxpipe&lt;/a&gt; tenta atacar o custo de entrada por outro caminho: renderizar contexto volumoso e estável como imagens para que seja tokenizado de forma mais barata.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é
&lt;/h3&gt;

&lt;p&gt;pxpipe é um proxy local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;licenciado MIT;&lt;/li&gt;
&lt;li&gt;escrito em TypeScript;&lt;/li&gt;
&lt;li&gt;executado entre seu cliente e a API da Anthropic;&lt;/li&gt;
&lt;li&gt;ativado apontando &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; para ele.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ele inspeciona a solicitação antes de ela sair da sua máquina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como reduz custo
&lt;/h3&gt;

&lt;p&gt;Texto denso é caro por token. O pxpipe reescreve partes grandes e estáveis da solicitação como imagens PNG compactas, por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompt do sistema;&lt;/li&gt;
&lt;li&gt;documentação de ferramentas;&lt;/li&gt;
&lt;li&gt;histórico antigo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segundo o projeto, conteúdo denso pode ficar em torno de 3.1 caracteres por token de imagem, contra cerca de 1 caractere por token de texto.&lt;/p&gt;

&lt;p&gt;O projeto relata um exemplo em que um prompt de sistema mais documentação de ferramentas com ~48 mil caracteres vira cerca de 2.7 mil tokens de imagem, versus cerca de 25 mil como texto.&lt;/p&gt;

&lt;p&gt;Importante: ele usa portões de lucratividade. Só transforma em imagem o conteúdo em que a matemática de tokens compensa. Prosa esparsa passa como texto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Inicie o proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx pxpipe-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele sobe em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1:47821
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aponte o Claude Code para o proxy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:47821 claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Suporte a modelos
&lt;/h3&gt;

&lt;p&gt;Por padrão, pxpipe transforma em imagem solicitações para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;claude-fable-5&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;GPT 5.6.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Opus 4.7/4.8 e GPT 5.5 são opcionais, porque o projeto relata que eles leem contexto imagístico visivelmente pior.&lt;/p&gt;

&lt;p&gt;Para habilitar outros modelos, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PXPIPE_MODELS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;claude-opus-4-8 npx pxpipe-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou configure pelo painel na URL do proxy.&lt;/p&gt;

&lt;p&gt;Todo o resto passa inalterado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Economias relatadas
&lt;/h3&gt;

&lt;p&gt;Estes números são relatados pelo próprio projeto, não verificados independentemente aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;59% de economia em snapshot de produção;&lt;/li&gt;
&lt;li&gt;fatura de $100 caindo para cerca de $41 em 13.709 solicitações;&lt;/li&gt;
&lt;li&gt;piloto SWE-bench Lite com redução de -65% no tamanho da solicitação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trate como benchmark de fornecedor. Meça no seu tráfego antes de adotar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;p&gt;pxpipe pode ajudar, mas não é dinheiro grátis.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Interage com cache de prompts
&lt;/h4&gt;

&lt;p&gt;A transformação em imagem muda os bytes da solicitação. Como o cache de prompts depende de correspondência exata de prefixo, imagem e cache podem se contrapor.&lt;/p&gt;

&lt;p&gt;Ambos atacam o mesmo custo: tokens de entrada.&lt;/p&gt;

&lt;p&gt;Teste as duas opções no seu prefixo real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cenário A: cache de prompts sem pxpipe
cenário B: pxpipe sem cache
cenário C: ambos, se aplicável
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare custo, qualidade e taxa de acerto do cache.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. O modelo lê imagens via visão
&lt;/h4&gt;

&lt;p&gt;O projeto sinaliza que strings densas podem ser mal interpretadas, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDs hexadecimais longos;&lt;/li&gt;
&lt;li&gt;tokens exatos;&lt;/li&gt;
&lt;li&gt;hashes;&lt;/li&gt;
&lt;li&gt;chaves;&lt;/li&gt;
&lt;li&gt;valores que exigem leitura literal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Falhas podem ser silenciosas. A saída parece válida, mas baseada em uma leitura errada da imagem.&lt;/p&gt;

&lt;p&gt;Valide qualidade em tarefas reais antes de usar em produção.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. É um proxy de terceiros no caminho da solicitação
&lt;/h4&gt;

&lt;p&gt;Mesmo rodando localmente, ele manipula seu tráfego.&lt;/p&gt;

&lt;p&gt;Antes de usar em produção, avalie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dados sensíveis;&lt;/li&gt;
&lt;li&gt;logs;&lt;/li&gt;
&lt;li&gt;política de rede;&lt;/li&gt;
&lt;li&gt;revisão de segurança;&lt;/li&gt;
&lt;li&gt;atualização de dependências;&lt;/li&gt;
&lt;li&gt;comportamento em falhas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;pxpipe vale testar se seu contexto é grande, estável e denso. Para prompts esparsos ou altamente favoráveis a cache, os recursos nativos podem capturar a maior parte da economia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduza tokens desperdiçados em desenvolvimento e teste
&lt;/h2&gt;

&lt;p&gt;Nenhuma das alavancas anteriores muda um ponto: você queima tokens pagos enquanto ainda está construindo a integração.&lt;/p&gt;

&lt;p&gt;Apidog não reduz sua fatura de produção do Claude, e nem pretende. Onde ele ajuda é no ciclo de desenvolvimento e teste.&lt;/p&gt;

&lt;p&gt;Durante desenvolvimento, cada chamada contra a API Anthropic ao vivo custa tokens reais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execução quebrada;&lt;/li&gt;
&lt;li&gt;tentativa de parser;&lt;/li&gt;
&lt;li&gt;ajuste de prompt;&lt;/li&gt;
&lt;li&gt;teste local;&lt;/li&gt;
&lt;li&gt;job de CI em cada push;&lt;/li&gt;
&lt;li&gt;validação de tratamento de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Grande parte disso não precisa de um modelo real. Você só precisa validar se sua aplicação envia e recebe o formato correto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use mock da API durante a construção
&lt;/h3&gt;

&lt;p&gt;Em vez de chamar a API real em todos os testes, simule a resposta da Anthropic no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fluxo prático:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Defina o contrato do endpoint Claude que sua aplicação chama.&lt;/li&gt;
&lt;li&gt;Modele o corpo da requisição esperado.&lt;/li&gt;
&lt;li&gt;Modele a resposta esperada.&lt;/li&gt;
&lt;li&gt;Configure um mock determinístico.&lt;/li&gt;
&lt;li&gt;Aponte testes locais e CI para o mock.&lt;/li&gt;
&lt;li&gt;Use a API real apenas para validações de qualidade do modelo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de resposta mockada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"msg_mock_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;category&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;billing&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"input_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"output_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite testar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serialização da requisição;&lt;/li&gt;
&lt;li&gt;parsing da resposta;&lt;/li&gt;
&lt;li&gt;validação de JSON;&lt;/li&gt;
&lt;li&gt;tratamento de erro;&lt;/li&gt;
&lt;li&gt;timeouts;&lt;/li&gt;
&lt;li&gt;retries;&lt;/li&gt;
&lt;li&gt;integração com CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você também documenta o contrato de request/response no mesmo lugar, para que o time alinhe a interface antes de gastar tokens reais.&lt;/p&gt;

&lt;p&gt;O escopo é honesto: isso reduz tokens de desenvolvimento e teste, não sua fatura de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combine as alavancas
&lt;/h2&gt;

&lt;p&gt;Essas técnicas não são exclusivas. A maior redução vem da combinação.&lt;/p&gt;

&lt;p&gt;Um plano prático:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cacheie o prefixo estável&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prompt do sistema, ferramentas e documentos. Depois confirme que &lt;code&gt;cache_read_input_tokens&lt;/code&gt; é diferente de zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Roteie por tarefa&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use Opus 4.8 como padrão, Fable 5 só quando necessário, Sonnet 5 para volume e Haiku 4.5 para tarefas simples.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mova trabalho offline para lote&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tudo que não é sensível à latência deve ir para &lt;code&gt;/v1/messages/batches&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controle cada solicitação&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ajuste &lt;code&gt;effort&lt;/code&gt;, defina &lt;code&gt;max_tokens&lt;/code&gt; e use &lt;code&gt;count_tokens&lt;/code&gt; para bloquear prompts caros antes do envio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduza reenvio de histórico&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use edição e compactação de contexto para loops longos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Teste pxpipe quando o contexto for denso&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Compare contra cache no seu tráfego real. Não presuma que as economias se somam.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use mocks durante desenvolvimento&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tire testes locais e CI do medidor pago sempre que o modelo real não for necessário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Comece por cache e roteamento de modelos. Esses dois normalmente explicam a maior parte da redução. Depois meça cada mudança separadamente, porque o único número que importa é a sua fatura real.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tokens de entrada ou saída custam mais na fatura do Claude?
&lt;/h3&gt;

&lt;p&gt;Por token, saída custa mais do que entrada em todos os modelos. Mas, em cargas de trabalho de agente e codificação, entrada costuma dominar a fatura porque a API sem estado faz você reenviar o histórico completo a cada turno.&lt;/p&gt;

&lt;p&gt;Por isso, as maiores alavancas miram tokens de entrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache de prompts ou Batch API economiza mais?
&lt;/h3&gt;

&lt;p&gt;Depende da carga de trabalho.&lt;/p&gt;

&lt;p&gt;Cache de prompts economiza até ~90% no prefixo repetido de tráfego interativo. É ideal para chats e loops de agente que reutilizam prompt do sistema e ferramentas.&lt;/p&gt;

&lt;p&gt;Batch API corta 50% de tudo, mas apenas para trabalhos assíncronos.&lt;/p&gt;

&lt;p&gt;Muitas equipes usam ambos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cache no caminho interativo;&lt;/li&gt;
&lt;li&gt;lote para processamento offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Devo usar Fable 5 como padrão?
&lt;/h3&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Fable 5 custa o dobro do Opus 4.8 e é voltado ao raciocínio de longo prazo mais difícil. Para a maioria dos trabalhos de agente e codificação, Opus 4.8 é o padrão mais econômico.&lt;/p&gt;

&lt;p&gt;Usar Fable por padrão quando Opus seria suficiente é uma das formas mais comuns de dobrar a fatura sem necessidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  pxpipe se soma ao cache de prompts?
&lt;/h3&gt;

&lt;p&gt;Não de forma limpa.&lt;/p&gt;

&lt;p&gt;pxpipe altera os bytes da solicitação ao transformar texto em imagem. O cache de prompts depende de correspondência exata de bytes no prefixo.&lt;/p&gt;

&lt;p&gt;Como ambos miram o mesmo custo de entrada, podem se contrapor. Teste no seu prefixo real e compare.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apidog reduz meus custos de produção do Claude?
&lt;/h3&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Apidog permite simular a API da Anthropic para que testes locais e CI usem um mock em vez de gastar tokens pagos durante desenvolvimento.&lt;/p&gt;

&lt;p&gt;Isso reduz gasto de desenvolvimento e teste, não a fatura de produção.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Aprenda a Testar Webhooks: Ferramentas Essenciais e Tutorial Passo a Passo</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Tue, 07 Jul 2026 04:16:47 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/aprenda-a-testar-webhooks-ferramentas-essenciais-e-tutorial-passo-a-passo-fo7</link>
      <guid>https://dev.to/lucas_ferreira/aprenda-a-testar-webhooks-ferramentas-essenciais-e-tutorial-passo-a-passo-fo7</guid>
      <description>&lt;p&gt;Para testar um webhook, você precisa expor uma URL acessível ao provedor, disparar um evento real ou de teste e validar se seu manipulador recebe o payload, verifica a assinatura, responde corretamente e executa o efeito esperado. Como o webhook é enviado pelo provedor para o seu app, o fluxo de teste é diferente de uma chamada REST comum: você precisa capturar requisições de entrada, simular eventos e automatizar asserções.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que webhooks exigem um fluxo de teste diferente
&lt;/h2&gt;

&lt;p&gt;Em uma API REST comum, você controla a requisição: escolhe o método, monta o body, envia e lê a resposta.&lt;/p&gt;

&lt;p&gt;Com webhooks, o provedor controla o envio. Ele decide quando chamar seu endpoint, quais cabeçalhos enviar e qual payload usar. Isso cria alguns desafios práticos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Você nem sempre consegue disparar o evento diretamente.&lt;/strong&gt; Um evento como &lt;code&gt;payment_intent.succeeded&lt;/code&gt; depende do Stripe ou de uma ferramenta de teste do provedor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A entrega é assíncrona.&lt;/strong&gt; Seu teste precisa capturar uma requisição recebida, não apenas aguardar um retorno síncrono.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O payload é definido pelo provedor.&lt;/strong&gt; Seu código precisa aceitar exatamente o formato enviado por Stripe, GitHub, Slack ou outro serviço.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A maioria dos provedores assina as requisições.&lt;/strong&gt; Seu endpoint deve validar a assinatura antes de confiar no body. Veja também o guia sobre &lt;a href="https://apidog.com/pt/blog/webhook-signature-verification/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;verificação de assinatura de webhook&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você ainda está avaliando o padrão arquitetural, estes guias ajudam a comparar alternativas: &lt;a href="https://apidog.com/pt/blog/webhooks-vs-polling/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;webhooks vs polling&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/webhook-vs-websocket/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;webhook vs WebSocket&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ferramentas úteis para testar webhooks
&lt;/h2&gt;

&lt;p&gt;Um fluxo de teste completo normalmente usa quatro tipos de ferramenta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serviço de captura para inspecionar payloads reais;&lt;/li&gt;
&lt;li&gt;túnel local para expor seu &lt;code&gt;localhost&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;ferramenta do provedor para disparar eventos;&lt;/li&gt;
&lt;li&gt;ferramenta de teste para validar resposta e efeitos colaterais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Capture o payload real antes de implementar
&lt;/h2&gt;

&lt;p&gt;Antes de escrever ou ajustar o manipulador, capture um webhook real. Isso evita testar contra um JSON inventado que não representa o payload do provedor.&lt;/p&gt;

&lt;p&gt;Serviços comuns:&lt;/p&gt;

&lt;h3&gt;
  
  
  webhook.site
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;webhook.site&lt;/code&gt; gera uma URL pública temporária. Tudo que for enviado para ela aparece na interface: método, headers, body e query params.&lt;/p&gt;

&lt;p&gt;Use para responder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quais headers o provedor envia?&lt;/li&gt;
&lt;li&gt;qual é o formato real do body?&lt;/li&gt;
&lt;li&gt;onde vem o ID do evento?&lt;/li&gt;
&lt;li&gt;qual header contém a assinatura?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Beeceptor
&lt;/h3&gt;

&lt;p&gt;O Beeceptor fornece um endpoint HTTPS para receber webhooks e inspecionar payloads em tempo real. Também permite configurar mock servers, útil quando você quer capturar e simular usando a mesma ferramenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pipedream RequestBin
&lt;/h3&gt;

&lt;p&gt;O Pipedream RequestBin também permite criar URLs públicas para capturar requisições HTTP. Como limites gratuitos mudam com frequência, verifique a documentação atual do serviço antes de usar em um fluxo recorrente.&lt;/p&gt;

&lt;p&gt;Depois de capturar um evento real, salve uma amostra do payload. Você vai reutilizá-la em testes manuais, automatizados e em CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Exponha seu ambiente local com um túnel
&lt;/h2&gt;

&lt;p&gt;Provedores externos não conseguem acessar &lt;code&gt;localhost:3000&lt;/code&gt; diretamente. Para testar seu manipulador local, use um túnel que gere uma URL HTTPS pública e encaminhe o tráfego para sua máquina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando ngrok
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;ngrok

ngrok config add-authtoken &lt;span class="nv"&gt;$YOUR_TOKEN&lt;/span&gt;

ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando imprime uma URL HTTPS pública. Configure essa URL no provedor, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://abc123.ngrok-free.app/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se seu servidor local estiver escutando em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o provedor enviará o webhook para o ngrok, e o ngrok encaminhará para sua aplicação local.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando cloudflared
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim como o ngrok, o &lt;code&gt;cloudflared&lt;/code&gt; imprime uma URL pública que encaminha tráfego para sua porta local.&lt;/p&gt;

&lt;p&gt;Esse padrão é útil para depurar com breakpoints, logs e ferramentas do seu editor. Para uma explicação mais detalhada, veja &lt;a href="https://apidog.com/pt/blog/test-localhost-apis-webhook-services/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como testar APIs localhost com serviços de webhook&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Dispare eventos reais ou de teste do provedor
&lt;/h2&gt;

&lt;p&gt;Depois de ter uma URL pública, você precisa fazer o provedor enviar um evento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stripe CLI
&lt;/h3&gt;

&lt;p&gt;O Stripe CLI permite encaminhar eventos da sandbox para seu endpoint local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe listen &lt;span class="nt"&gt;--forward-to&lt;/span&gt; localhost:3000/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para filtrar eventos específicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe listen &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--events&lt;/span&gt; payment_intent.succeeded,checkout.session.completed &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--forward-to&lt;/span&gt; localhost:3000/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando também imprime um segredo de assinatura. Configure esse segredo na sua aplicação para validar o header &lt;code&gt;Stripe-Signature&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com o listener ativo, dispare eventos de teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe trigger payment_intent.succeeded

stripe trigger checkout.session.completed

stripe trigger &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atenção: alguns triggers criam objetos de API relacionados e podem gerar eventos em cascata. Por exemplo, &lt;code&gt;payment_intent.succeeded&lt;/code&gt; também pode emitir &lt;code&gt;payment_intent.created&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub
&lt;/h3&gt;

&lt;p&gt;O GitHub permite reentregar webhooks recentes.&lt;/p&gt;

&lt;p&gt;Fluxo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra o repositório.&lt;/li&gt;
&lt;li&gt;Vá em &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Acesse &lt;strong&gt;Webhooks&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clique na URL do webhook.&lt;/li&gt;
&lt;li&gt;Abra &lt;strong&gt;Recent Deliveries&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selecione uma entrega.&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;Redeliver&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Restrições importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;só é possível reentregar eventos dos últimos 3 dias;&lt;/li&gt;
&lt;li&gt;você precisa ter acesso de administrador ao repositório;&lt;/li&gt;
&lt;li&gt;o GitHub não reenvia automaticamente entregas com falha.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Slack
&lt;/h3&gt;

&lt;p&gt;Webhooks de entrada do Slack são simples de testar: basta fazer um &lt;code&gt;POST&lt;/code&gt; com JSON para a URL do webhook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text":"Hello, world."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A URL do webhook do Slack é um segredo. Não coloque essa URL no frontend, em repositórios públicos ou em logs expostos.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Valide seu manipulador com payloads repetíveis
&lt;/h2&gt;

&lt;p&gt;Capturar e disparar eventos confirma que a conexão funciona. Mas você ainda precisa validar se o manipulador está correto.&lt;/p&gt;

&lt;p&gt;Um teste mínimo pode ser feito com &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/webhooks &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Stripe-Signature: t=...,v1=...'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "id": "evt_test",
    "type": "payment_intent.succeeded",
    "data": {
      "object": {
        "id": "pi_123",
        "status": "succeeded"
      }
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse teste é útil para smoke test, mas não escala bem. Para testes repetíveis, salve payloads, headers e asserções em uma ferramenta de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando webhooks com Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; é uma plataforma para projetar, depurar, testar, simular e documentar APIs.&lt;/p&gt;

&lt;p&gt;Ele não funciona como uma “caixa de entrada de webhook” dedicada. O uso mais prático para webhooks é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;montar payloads de exemplo;&lt;/li&gt;
&lt;li&gt;salvar requisições reutilizáveis;&lt;/li&gt;
&lt;li&gt;validar respostas com asserções;&lt;/li&gt;
&lt;li&gt;simular provedores com mock server;&lt;/li&gt;
&lt;li&gt;executar cenários em CI com o Apidog CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Crie uma requisição reutilizável para o webhook
&lt;/h2&gt;

&lt;p&gt;Pegue o payload capturado em uma ferramenta como &lt;code&gt;webhook.site&lt;/code&gt; ou copiado da documentação do provedor.&lt;/p&gt;

&lt;p&gt;No Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie uma nova requisição.&lt;/li&gt;
&lt;li&gt;Defina o método como &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure a URL do seu endpoint, por exemplo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Cole o JSON no body.&lt;/li&gt;
&lt;li&gt;Adicione os headers enviados pelo provedor, por exemplo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: application/json
Stripe-Signature: t=...,v1=...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Salve a requisição.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora você tem um teste repetível para enviar um payload conhecido ao seu manipulador sem reescrever comandos &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Crie variações para cobrir casos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;payload válido;&lt;/li&gt;
&lt;li&gt;campo obrigatório ausente;&lt;/li&gt;
&lt;li&gt;assinatura inválida;&lt;/li&gt;
&lt;li&gt;evento duplicado;&lt;/li&gt;
&lt;li&gt;tipo de evento não suportado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Adicione asserções para validar a resposta
&lt;/h2&gt;

&lt;p&gt;Enviar o payload não basta. Você precisa validar o retorno do endpoint.&lt;/p&gt;

&lt;p&gt;No Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra a requisição ou cenário.&lt;/li&gt;
&lt;li&gt;Vá em &lt;strong&gt;Processadores Pós-execução&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;+ Adicionar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Escolha &lt;strong&gt;Asserção&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure a regra de validação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de asserção:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JSONPath: $.data.status
Condição: Igual a
Valor esperado: succeeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode validar o status HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code == 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cenários de erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code == 400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code == 401
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;quando a assinatura for inválida.&lt;/p&gt;

&lt;p&gt;Asserções visuais comparam valores como strings. Se precisar validar tipos com precisão, como número ou booleano, use script customizado com sintaxe &lt;code&gt;pm.test&lt;/code&gt; compatível com Postman.&lt;/p&gt;

&lt;p&gt;Exemplo conceitual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status deve ser succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use mock server para simular um provedor
&lt;/h2&gt;

&lt;p&gt;Em alguns testes, seu serviço chama uma API externa depois de receber o webhook. Para evitar chamadas reais durante o desenvolvimento, você pode simular essa API com o mock server do Apidog.&lt;/p&gt;

&lt;p&gt;O Apidog oferece três tipos de mock:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock Local&lt;/strong&gt;: roda com o cliente desktop e só funciona enquanto ele estiver aberto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock na Nuvem&lt;/strong&gt;: hospedado pelo Apidog, funciona continuamente e pode ser ativado ou desativado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock Runner&lt;/strong&gt;: executado em infraestrutura auto-hospedada e compartilhado com a equipe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada endpoint HTTP tem um módulo de mock. Copie a URL do mock na aba API em modo Design ou na aba Mock em modo Debug.&lt;/p&gt;

&lt;p&gt;Importante: apenas caminhos que começam com &lt;code&gt;/&lt;/code&gt; roteiam para o ambiente de mock.&lt;/p&gt;

&lt;p&gt;Use essa URL em testes para obter respostas previsíveis sem chamar o provedor real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execute testes de webhook em CI com Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Depois que o cenário passar localmente, execute-o em CI.&lt;/p&gt;

&lt;p&gt;Instale o CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique a instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
apidog &lt;span class="nt"&gt;-v&lt;/span&gt;
which node
which npm
which apidog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Apidog CLI requer Node.js v16 ou superior.&lt;/p&gt;

&lt;p&gt;Execute um cenário salvo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; 637132 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; 358171 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; 3497013 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parâmetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID do cenário de teste;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID do ambiente, obrigatório;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt;: dados de teste, como arquivo CSV/JSON ou ID de dataset;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporters, como &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt; ou &lt;code&gt;junit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para detalhes de uso, veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-test-rest-api-command-line/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial do Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quer montar e validar testes de webhook visualmente? &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Experimente o Apidog gratuitamente, sem necessidade de cartão de crédito.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo recomendado para testar webhooks
&lt;/h2&gt;

&lt;p&gt;Use esta sequência como checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capture um payload real.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Aponte o provedor para uma URL do &lt;code&gt;webhook.site&lt;/code&gt; ou ferramenta similar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analise headers e assinatura.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Identifique &lt;code&gt;Content-Type&lt;/code&gt;, header de assinatura, ID do evento e formato do body.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Suba seu manipulador local.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Execute sua aplicação em uma porta local, por exemplo &lt;code&gt;localhost:3000&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abra um túnel.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;ngrok http 3000&lt;/code&gt; ou &lt;code&gt;cloudflared tunnel --url http://localhost:3000&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure a URL pública no provedor.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Exemplo:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   https://abc123.ngrok-free.app/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dispare um evento real ou de teste.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;stripe trigger&lt;/code&gt;, o botão &lt;strong&gt;Redeliver&lt;/strong&gt; do GitHub ou um &lt;code&gt;POST&lt;/code&gt; do Slack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Teste assinatura válida e inválida.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
O manipulador deve aceitar a requisição válida e rejeitar a adulterada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Valide resposta e efeitos colaterais.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Verifique status HTTP, body, escrita no banco, publicação em fila ou chamada downstream.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatize.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Salve o cenário no Apidog e execute com Apidog CLI no CI.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você está projetando o sistema de webhooks, veja também &lt;a href="https://apidog.com/pt/blog/how-to-design-reliable-webhooks/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como projetar webhooks confiáveis&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/payment-webhook-best-practices/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;melhores práticas de webhook de pagamento&lt;/a&gt;. Para contexto arquitetural, consulte o &lt;a href="https://apidog.com/pt/blog/webhooks-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da API de webhooks&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/comprehensive-guide-to-webhooks-and-eda/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;webhooks e arquitetura orientada a eventos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como testar um webhook?
&lt;/h3&gt;

&lt;p&gt;Forneça ao provedor uma URL acessível, dispare um evento real ou de teste e valide se seu endpoint recebeu o payload, verificou a assinatura, retornou o status correto e executou o efeito esperado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar webhooks localmente?
&lt;/h3&gt;

&lt;p&gt;Execute seu manipulador localmente e exponha a porta com um túnel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, configure a URL HTTPS pública no provedor e dispare um evento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar um webhook com Postman?
&lt;/h3&gt;

&lt;p&gt;Você pode usar o Postman para enviar um &lt;code&gt;POST&lt;/code&gt; com payload e headers personalizados para seu endpoint. Ele é útil para validar resposta, mas não recebe webhooks reais sozinho. Para capturar eventos reais, combine com um serviço de captura ou túnel. O mesmo se aplica ao Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar webhooks do Stripe?
&lt;/h3&gt;

&lt;p&gt;Use o Stripe CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe listen &lt;span class="nt"&gt;--forward-to&lt;/span&gt; localhost:3000/webhooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois dispare um evento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe trigger payment_intent.succeeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use o segredo exibido pelo &lt;code&gt;stripe listen&lt;/code&gt; para validar o header &lt;code&gt;Stripe-Signature&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar um webhook do Slack?
&lt;/h3&gt;

&lt;p&gt;Envie um &lt;code&gt;POST&lt;/code&gt; JSON para a URL de webhook de entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text":"Hello, world."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o teste funcionar, a mensagem aparecerá no canal configurado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como testar uma URL de webhook?
&lt;/h3&gt;

&lt;p&gt;Envie um &lt;code&gt;POST&lt;/code&gt; de amostra e confirme o status HTTP, o body da resposta e os efeitos colaterais. Para um teste mais confiável, use um payload real capturado, teste assinaturas válidas e inválidas e automatize asserções.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Observabilidade de API: O Que É e Como Implementar</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:13:35 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/observabilidade-de-api-o-que-e-e-como-implementar-20mh</link>
      <guid>https://dev.to/lucas_ferreira/observabilidade-de-api-o-que-e-e-como-implementar-20mh</guid>
      <description>&lt;p&gt;A observabilidade de API é a capacidade de entender por que sua API se comporta de determinada forma analisando a telemetria que ela emite: métricas, logs e traces. Na prática, uma API observável permite investigar incidentes, latência, erros e regressões sem precisar publicar uma nova versão apenas para adicionar mais logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a observabilidade de API realmente significa
&lt;/h2&gt;

&lt;p&gt;Na teoria de controle, um sistema é observável quando você consegue inferir seu estado interno a partir de suas saídas externas. Em software, isso significa que a API deve emitir dados suficientes para responder perguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual endpoint ficou lento?&lt;/li&gt;
&lt;li&gt;Qual região foi afetada?&lt;/li&gt;
&lt;li&gt;Qual versão da API gerou mais erros?&lt;/li&gt;
&lt;li&gt;Qual serviço interno adicionou latência?&lt;/li&gt;
&lt;li&gt;Qual requisição específica falhou e por quê?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A diferença prática é esta: se um cliente relata que o checkout ficou lento às 2h da manhã para usuários de uma região específica, você não deveria precisar fazer deploy de novo para adicionar &lt;code&gt;console.log&lt;/code&gt;. A telemetria já coletada deve permitir investigar o incidente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observabilidade vs monitoramento
&lt;/h2&gt;

&lt;p&gt;Monitoramento e observabilidade se complementam, mas não são a mesma coisa.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;monitoramento&lt;/strong&gt; acompanha sinais conhecidos e dispara alertas quando eles passam de um limite definido. Exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;taxa de erro acima de 2%;&lt;/li&gt;
&lt;li&gt;latência p99 acima de 500 ms;&lt;/li&gt;
&lt;li&gt;CPU acima de 80%;&lt;/li&gt;
&lt;li&gt;endpoint &lt;code&gt;/checkout&lt;/code&gt; retornando 5xx.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;observabilidade&lt;/strong&gt; permite fazer perguntas novas durante a investigação. Exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a latência aumentou apenas para &lt;code&gt;POST /v2/checkout&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;o problema acontece só na versão &lt;code&gt;2026-05&lt;/code&gt; da API?&lt;/li&gt;
&lt;li&gt;há correlação com uma região específica?&lt;/li&gt;
&lt;li&gt;qual chamada downstream consumiu mais tempo?&lt;/li&gt;
&lt;li&gt;quais logs compartilham o mesmo &lt;code&gt;trace_id&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo: o monitoramento diz que algo está errado; a observabilidade ajuda a encontrar a causa. Para aprofundar o lado de alertas e verificações, veja o &lt;a href="https://apidog.com/pt/blog/api-monitoring/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de monitoramento de API&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Monitoramento&lt;/th&gt;
&lt;th&gt;Observabilidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pergunta respondida&lt;/td&gt;
&lt;td&gt;Um sinal conhecido está fora da faixa?&lt;/td&gt;
&lt;td&gt;Por que o sistema está se comportando assim?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definido quando&lt;/td&gt;
&lt;td&gt;Antes do incidente&lt;/td&gt;
&lt;td&gt;Durante a investigação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Melhor para&lt;/td&gt;
&lt;td&gt;Falhas conhecidas e violações de SLO&lt;/td&gt;
&lt;td&gt;Problemas novos ou inesperados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saída&lt;/td&gt;
&lt;td&gt;Alertas e dashboards&lt;/td&gt;
&lt;td&gt;Telemetria consultável de alta cardinalidade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Os três pilares: métricas, logs e traces
&lt;/h2&gt;

&lt;p&gt;A observabilidade normalmente combina três tipos de telemetria: métricas, logs e traces. O OpenTelemetry formaliza esses dados como sinais de telemetria, junto com outros recursos como baggage, eventos e perfis em desenvolvimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Métricas
&lt;/h3&gt;

&lt;p&gt;Métricas são medições numéricas agregadas ao longo do tempo. Para APIs, comece com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requisições por segundo;&lt;/li&gt;
&lt;li&gt;taxa de erro;&lt;/li&gt;
&lt;li&gt;latência p50, p95 e p99;&lt;/li&gt;
&lt;li&gt;throughput por endpoint;&lt;/li&gt;
&lt;li&gt;disponibilidade por rota crítica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Evite depender apenas de médias. Uma média de 120 ms pode esconder um p99 de 4 segundos, que é o que usuários reais podem estar sentindo.&lt;/p&gt;

&lt;p&gt;Exemplo de métricas úteis por endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http_requests_total{method="POST", path="/v2/checkout", status="200"}
http_requests_total{method="POST", path="/v2/checkout", status="503"}
http_request_duration_ms_bucket{method="POST", path="/v2/checkout"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Métricas são baratas de armazenar e rápidas de consultar. Use-as para dashboards, alertas e SLOs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Logs
&lt;/h3&gt;

&lt;p&gt;Logs registram eventos discretos com timestamp. Para observabilidade, prefira logs estruturados em JSON em vez de texto livre.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-22T02:14:09Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v2/checkout"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4812&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trace_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8f3a1c9d2e7b4a16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ap-southeast-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"api_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Campos recomendados para logs de API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timestamp
level
trace_id
request_id
method
path
status
duration_ms
user_region
api_version
client_id ou tenant_id, se aplicável
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O campo mais importante para correlacionar dados é o &lt;code&gt;trace_id&lt;/code&gt;. Ele conecta logs individuais ao fluxo completo da requisição.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Traces
&lt;/h3&gt;

&lt;p&gt;Um trace distribuído acompanha uma requisição enquanto ela passa por diferentes serviços. Cada etapa é registrada como um &lt;code&gt;span&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de fluxo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /v2/checkout
├── API Gateway: 20 ms
├── Auth Service: 35 ms
├── Checkout Service: 120 ms
├── Payment Service: 3900 ms
└── Notification Service: 40 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, a causa da lentidão está no serviço de pagamento. Sem traces, você provavelmente começaria a investigar serviço por serviço.&lt;/p&gt;

&lt;p&gt;Os três pilares funcionam melhor juntos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma métrica dispara o alerta: p99 subiu.&lt;/li&gt;
&lt;li&gt;Um trace mostra onde o tempo foi gasto.&lt;/li&gt;
&lt;li&gt;Os logs filtrados por &lt;code&gt;trace_id&lt;/code&gt; explicam o erro específico.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Use RED como ponto de partida
&lt;/h2&gt;

&lt;p&gt;Você não precisa instrumentar tudo no primeiro dia. Para APIs, comece com o método RED:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate&lt;/strong&gt;: quantas requisições por segundo a API processa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errors&lt;/strong&gt;: quantas requisições falham.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration&lt;/strong&gt;: quanto tempo as requisições levam.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rate     = requisições por segundo
Errors   = % de respostas 5xx e 4xx inesperadas
Duration = latência p95 e p99 por endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RED funciona bem para APIs, gateways e service meshes porque é centrado em requisições. Para infraestrutura, complemente com USE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;utilização;&lt;/li&gt;
&lt;li&gt;saturação;&lt;/li&gt;
&lt;li&gt;erros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma abordagem prática:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API      → RED
Servidor → USE
Banco    → RED + USE, dependendo do caso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transforme sinais em metas com SLIs e SLOs
&lt;/h2&gt;

&lt;p&gt;Coletar telemetria é só o começo. Para tornar os dados acionáveis, defina SLIs e SLOs.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;SLI&lt;/strong&gt; é uma métrica que representa a qualidade do serviço. Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SLI de disponibilidade = requisições bem-sucedidas / total de requisições
SLI de latência        = % de requisições abaixo de 300 ms
SLI de erro            = requisições 5xx / total de requisições
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um &lt;strong&gt;SLO&lt;/strong&gt; é a meta para esse indicador. Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;99,9% das requisições devem retornar sem erro em 28 dias.
95% das requisições de checkout devem concluir em menos de 300 ms.
99% das chamadas de autenticação devem concluir em menos de 200 ms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem SLO, um gráfico de latência é apenas uma linha. Com SLO, ele vira um critério objetivo para decidir quando priorizar confiabilidade em vez de novas funcionalidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrumente com OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;Você pode dividir a stack de observabilidade em duas partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Geração de telemetria&lt;/strong&gt;: o que seu código emite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend de análise&lt;/strong&gt;: onde você armazena e consulta os dados.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para geração, OpenTelemetry é o padrão mais importante. Ele é um projeto da CNCF, surgiu da fusão entre OpenTracing e OpenCensus e é independente de fornecedor.&lt;/p&gt;

&lt;p&gt;Com OpenTelemetry, você pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gerar traces, métricas e logs;&lt;/li&gt;
&lt;li&gt;padronizar nomes e atributos com convenções semânticas;&lt;/li&gt;
&lt;li&gt;exportar dados via OTLP;&lt;/li&gt;
&lt;li&gt;usar auto-instrumentação quando disponível;&lt;/li&gt;
&lt;li&gt;enviar telemetria para diferentes backends;&lt;/li&gt;
&lt;li&gt;reduzir dependência de um fornecedor específico.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para armazenamento e análise, você pode usar ferramentas como Prometheus com Grafana para métricas, ou plataformas como Datadog e Honeycomb para traces, métricas e logs. Se você usa Datadog, este &lt;a href="https://apidog.com/pt/blog/datadog-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;passo a passo da API do Datadog&lt;/a&gt; mostra como enviar e consultar dados programaticamente.&lt;/p&gt;

&lt;p&gt;A principal vantagem do OpenTelemetry é instrumentar uma vez e trocar o backend depois sem reescrever toda a instrumentação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inclua testes e verificações sintéticas
&lt;/h2&gt;

&lt;p&gt;Observabilidade não deve começar apenas em produção. Testes também geram sinais úteis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shift left: testes de contrato em CI
&lt;/h3&gt;

&lt;p&gt;Antes do deploy, testes de contrato verificam se a API ainda corresponde à especificação. Isso ajuda a detectar mudanças incompatíveis antes que cheguem aos usuários.&lt;/p&gt;

&lt;p&gt;Cada execução de CI gera dados úteis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit
branch
ambiente
cenário executado
resultado
duração
timestamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Apidog CLI permite executar cenários de teste em pipelines. Ele é construído em Node.js e requer Node v16 ou superior.&lt;/p&gt;

&lt;p&gt;Instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli

&lt;span class="c"&gt;# verificar instalação&lt;/span&gt;
node &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apidog &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executar um cenário de teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 637132 &lt;span class="nt"&gt;-e&lt;/span&gt; 358171 &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-t = ID do cenário de teste
-e = ID do ambiente
-r = formatos de relatório: cli, html, json ou junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executar com dados de iteração em CSV ou JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 637132 &lt;span class="nt"&gt;-e&lt;/span&gt; 358171 &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli &lt;span class="nt"&gt;-d&lt;/span&gt; ./data.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para enviar um resumo do relatório para a nuvem Apidog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 637132 &lt;span class="nt"&gt;-e&lt;/span&gt; 358171 &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli &lt;span class="nt"&gt;--upload-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para um pipeline completo, veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-ci-cd-pipeline/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia do Apidog CLI para CI/CD&lt;/a&gt;. Para todas as flags disponíveis, consulte a &lt;a href="https://apidog.com/pt/blog/apidog-cli-complete-guide/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;referência completa do CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoramento sintético em produção
&lt;/h3&gt;

&lt;p&gt;Monitoramento sintético executa requisições roteirizadas contra sua API em produção, em intervalos definidos, como um usuário real faria.&lt;/p&gt;

&lt;p&gt;Comece simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chamar um endpoint de saúde;&lt;/li&gt;
&lt;li&gt;validar status code;&lt;/li&gt;
&lt;li&gt;medir latência;&lt;/li&gt;
&lt;li&gt;verificar payload mínimo;&lt;/li&gt;
&lt;li&gt;registrar falhas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma &lt;a href="https://apidog.com/pt/blog/api-health-check/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;verificação de saúde da API&lt;/a&gt; é o ponto inicial. O &lt;a href="https://apidog.com/pt/blog/api-synthetic-monitoring/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;monitoramento sintético&lt;/a&gt; expande isso para fluxos de várias etapas, como login, criação de recurso e checkout.&lt;/p&gt;

&lt;p&gt;Essas verificações também são sinais de observabilidade. Uma execução sintética falhando às 02:00 com duração de 4 segundos deve ser correlacionável com logs, métricas e traces.&lt;/p&gt;

&lt;p&gt;Para comparar opções, veja a lista de &lt;a href="https://apidog.com/pt/blog/top-synthetic-testing-tools/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ferramentas de teste sintético&lt;/a&gt; e a lista de &lt;a href="https://apidog.com/pt/blog/api-monitoring-tools/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ferramentas de monitoramento de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerando sinais recorrentes com Tarefas Agendadas do Apidog
&lt;/h2&gt;

&lt;p&gt;O Apidog pode gerar sinais sintéticos recorrentes por meio de Tarefas Agendadas. O recurso executa automaticamente cenários de teste em horários definidos, captura resultados e ajuda em testes de regressão agendados.&lt;/p&gt;

&lt;p&gt;Você encontra o recurso no módulo de &lt;strong&gt;Testes&lt;/strong&gt;, em &lt;strong&gt;Tarefas Agendadas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ao configurar uma tarefa, defina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cenários de Teste&lt;/strong&gt;: um ou mais cenários para executar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modo de Execução&lt;/strong&gt;: por exemplo, todo domingo às 23h ou a cada 6 horas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notificação&lt;/strong&gt;: após cada execução ou apenas em caso de falha.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pontos importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarefas Agendadas estão em Beta.&lt;/li&gt;
&lt;li&gt;O recurso requer um Runner auto-hospedado configurado.&lt;/li&gt;
&lt;li&gt;As opções atuais de “Executar Em” listam Runner auto-hospedado.&lt;/li&gt;
&lt;li&gt;Apidog Cloud aparece como “em breve”.&lt;/li&gt;
&lt;li&gt;O número de execuções depende do plano de assinatura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para uma configuração prática, veja o &lt;a href="https://apidog.com/pt/blog/schedules-tasks-advanced/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;passo a passo das Tarefas Agendadas do Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O benefício é fechar o ciclo: você projeta e testa a API, depois executa os mesmos cenários periodicamente para gerar sinais de aprovação, falha e latência.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um caminho prático para tornar sua API observável
&lt;/h2&gt;

&lt;p&gt;Se você está começando do zero, siga esta ordem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Padronize logs estruturados&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use JSON.&lt;/li&gt;
&lt;li&gt;Inclua &lt;code&gt;trace_id&lt;/code&gt;, &lt;code&gt;request_id&lt;/code&gt;, método, rota, status e duração.&lt;/li&gt;
&lt;li&gt;Evite logs de texto livre para eventos importantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adicione correlação por requisição&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gere ou propague um &lt;code&gt;trace_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inclua o mesmo ID em logs, traces e respostas de erro quando fizer sentido.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instrumente com OpenTelemetry&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comece pelos endpoints críticos.&lt;/li&gt;
&lt;li&gt;Exporte traces e métricas via OTLP.&lt;/li&gt;
&lt;li&gt;Mantenha atributos consistentes, como &lt;code&gt;http.method&lt;/code&gt;, &lt;code&gt;http.route&lt;/code&gt; e &lt;code&gt;http.status_code&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitore RED&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rate.&lt;/li&gt;
&lt;li&gt;Errors.&lt;/li&gt;
&lt;li&gt;Duration com p95 e p99.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Defina SLIs e SLOs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disponibilidade.&lt;/li&gt;
&lt;li&gt;Latência.&lt;/li&gt;
&lt;li&gt;Taxa de erro.&lt;/li&gt;
&lt;li&gt;Janelas de medição, como 7, 14 ou 28 dias.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adicione testes de contrato ao CI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute cenários em cada pull request ou antes do deploy.&lt;/li&gt;
&lt;li&gt;Exporte relatórios em &lt;code&gt;junit&lt;/code&gt; ou &lt;code&gt;json&lt;/code&gt; quando precisar integrar com outras ferramentas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Execute verificações sintéticas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comece com health checks.&lt;/li&gt;
&lt;li&gt;Evolua para fluxos críticos.&lt;/li&gt;
&lt;li&gt;Agende execuções recorrentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Correlacione tudo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Métrica aponta o sintoma.&lt;/li&gt;
&lt;li&gt;Trace mostra o caminho.&lt;/li&gt;
&lt;li&gt;Log explica o evento.&lt;/li&gt;
&lt;li&gt;Teste sintético confirma impacto externo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você não precisa implementar tudo de uma vez. Só migrar de logs de texto livre para logs JSON com &lt;code&gt;trace_id&lt;/code&gt; já melhora bastante sua capacidade de investigação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist rápido
&lt;/h2&gt;

&lt;p&gt;Use este checklist para revisar sua API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Logs são estruturados em JSON
[ ] Cada requisição tem trace_id ou request_id
[ ] Erros incluem contexto suficiente para debug
[ ] Latência é medida por percentis, não apenas média
[ ] Métricas RED existem por endpoint crítico
[ ] Há SLOs definidos para disponibilidade e latência
[ ] Traces mostram chamadas entre serviços
[ ] Testes de contrato rodam em CI
[ ] Verificações sintéticas rodam em produção
[ ] Alertas apontam para sintomas acionáveis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é observabilidade de API?
&lt;/h3&gt;

&lt;p&gt;Observabilidade de API é a capacidade de entender o estado interno de uma API a partir da telemetria que ela emite: métricas, logs e traces. Uma API observável permite investigar por que ela se comporta de certa maneira sem adicionar nova instrumentação primeiro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observabilidade de API e monitoramento são a mesma coisa?
&lt;/h3&gt;

&lt;p&gt;Não. Monitoramento acompanha sinais predefinidos e alerta quando eles cruzam limites. Observabilidade permite fazer perguntas novas durante a investigação. O monitoramento informa que algo está errado; a observabilidade ajuda a descobrir por quê.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são os três pilares da observabilidade?
&lt;/h3&gt;

&lt;p&gt;Os três pilares são métricas, logs e traces. Métricas mostram números agregados, logs registram eventos discretos e traces acompanham uma requisição entre serviços.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como tornar uma API observável?
&lt;/h3&gt;

&lt;p&gt;Comece com logs estruturados e &lt;code&gt;trace_id&lt;/code&gt; em cada requisição. Depois, adicione OpenTelemetry, métricas RED, SLIs, SLOs, testes de contrato em CI e verificações sintéticas em produção.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenTelemetry é obrigatório?
&lt;/h3&gt;

&lt;p&gt;Não. Observabilidade é uma propriedade do sistema, não uma ferramenta específica. Mas OpenTelemetry é um padrão CNCF independente de fornecedor e facilita instrumentar uma vez para enviar dados a diferentes backends, como Prometheus, Datadog ou Honeycomb.&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Como Usar a CLI do Apidog no Hermes Agent</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:12:20 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/como-usar-a-cli-do-apidog-no-hermes-agent-5e6b</link>
      <guid>https://dev.to/lucas_ferreira/como-usar-a-cli-do-apidog-no-hermes-agent-5e6b</guid>
      <description>&lt;p&gt;O Hermes Agent roda no seu terminal, mantém contexto entre sessões e executa comandos de shell reais. Isso permite usar o Hermes como parte do seu loop de testes de API: se ele consegue executar um comando, ele consegue executar seus cenários do Apidog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;O executor é a CLI do Apidog, o pacote npm &lt;code&gt;apidog-cli&lt;/code&gt;. Ela executa, direto do terminal, os cenários de teste criados visualmente no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; e retorna um código de saída que o Hermes pode interpretar.&lt;/p&gt;

&lt;p&gt;Neste guia, você vai configurar o Hermes para:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ler instruções de teste a partir de &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Executar &lt;code&gt;apidog run&lt;/code&gt; usando a ferramenta &lt;code&gt;terminal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Validar o resultado pelo código de saída.&lt;/li&gt;
&lt;li&gt;Opcionalmente, conectar o servidor Apidog MCP para que o Hermes também leia a especificação da API enquanto codifica.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se a CLI ainda não estiver instalada, siga primeiro o guia &lt;a href="https://apidog.com/pt/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como instalar a CLI do Apidog com um agente de codificação de IA&lt;/a&gt;. Volte quando este comando imprimir uma versão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também precisa de uma conta Apidog com pelo menos um cenário de teste salvo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que significa usar a CLI do Apidog no Hermes
&lt;/h2&gt;

&lt;p&gt;O Hermes Agent, construído pela Nous Research, roda no terminal e executa ações por meio de ferramentas integradas. Para este fluxo, a ferramenta importante é &lt;code&gt;terminal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na prática, usar a CLI do Apidog no Hermes significa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Registrar o fluxo de trabalho em um arquivo de contexto&lt;/strong&gt;, como &lt;code&gt;AGENTS.md&lt;/code&gt;, para que o Hermes saiba qual comando executar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executar &lt;code&gt;apidog run&lt;/code&gt; pela ferramenta &lt;code&gt;terminal&lt;/code&gt;&lt;/strong&gt;, como qualquer outro comando de shell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tratar o código de saída como fonte da verdade&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt;: todas as asserções passaram.&lt;/li&gt;
&lt;li&gt;diferente de &lt;code&gt;0&lt;/code&gt;: houve falha.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opcionalmente, conectar o servidor Apidog MCP&lt;/strong&gt;, para expor a especificação da API ao Hermes durante a implementação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Não é necessário instalar um plugin específico do Apidog no Hermes. O Hermes só precisa saber qual comando executar e como interpretar o resultado.&lt;/p&gt;

&lt;h2&gt;
  
  
  O mecanismo: arquivo de contexto em vez de lembrete no chat
&lt;/h2&gt;

&lt;p&gt;O Hermes carrega contexto do projeto no início da sessão. Ele procura arquivos de instrução no diretório de trabalho, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses arquivos são injetados no prompt do sistema. Portanto, se o seu repositório já usa &lt;code&gt;AGENTS.md&lt;/code&gt;, o Hermes também consegue ler essas instruções.&lt;/p&gt;

&lt;p&gt;Colocar o comando no chat funciona apenas para a sessão atual. Colocar o comando em &lt;code&gt;AGENTS.md&lt;/code&gt; torna o fluxo reutilizável por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;você;&lt;/li&gt;
&lt;li&gt;outros membros do time;&lt;/li&gt;
&lt;li&gt;futuras sessões do Hermes;&lt;/li&gt;
&lt;li&gt;automações locais baseadas no mesmo repositório.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Hermes também lê &lt;code&gt;SOUL.md&lt;/code&gt;, mas esse arquivo é voltado à persona do agente. Mantenha instruções de teste no &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: adicione um bloco Apidog ao &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Na raiz do repositório, abra ou crie o arquivo &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione um bloco com o comando real que o Hermes deve executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## API testing with the Apidog CLI&lt;/span&gt;

This repo uses the Apidog CLI (&lt;span class="sb"&gt;`apidog-cli`&lt;/span&gt;, the &lt;span class="sb"&gt;`apidog`&lt;/span&gt; command) to run API
test scenarios. The scenarios live in our Apidog project, not in this repo.

When you change an API handler, route, or response shape, run the relevant
Apidog scenario through the terminal tool before considering the change done:&lt;span class="sb"&gt;

    apidog run -t 605067 -e 1629989 -n 1 -r cli

&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`-t 605067`&lt;/span&gt; is the checkout-flow test scenario.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`-e 1629989`&lt;/span&gt; is the staging environment.
&lt;span class="p"&gt;-&lt;/span&gt; The machine is already authenticated via &lt;span class="sb"&gt;`apidog login`&lt;/span&gt;, so do NOT pass
  an access token and do NOT print one.

Treat the exit code as the source of truth: &lt;span class="sb"&gt;`0`&lt;/span&gt; means every assertion passed,
non-zero means a failure. If it exits non-zero, read the failing assertion in
the report and fix the code, then re-run. Do not report a pass on a non-zero
exit.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;605067&lt;/code&gt; pelo ID real do cenário;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1629989&lt;/code&gt; pelo ID real do ambiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use normalmente um ambiente de staging ou desenvolvimento local. Evite apontar o Hermes para produção.&lt;/p&gt;

&lt;p&gt;Esse bloco é importante por dois motivos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ele fornece o comando exato, evitando que o Hermes invente flags.&lt;/li&gt;
&lt;li&gt;Ele define que o código de saída tem prioridade sobre qualquer resumo textual.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso reduz a chance de o agente declarar “testes passaram” quando a execução falhou.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 2: copie o comando gerado pelo Apidog
&lt;/h2&gt;

&lt;p&gt;Antes de pedir ao Hermes para executar o teste, obtenha um comando válido no Apidog.&lt;/p&gt;

&lt;p&gt;No Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra o cenário de teste.&lt;/li&gt;
&lt;li&gt;Vá para a aba CI/CD.&lt;/li&gt;
&lt;li&gt;Escolha a opção de linha de comando.&lt;/li&gt;
&lt;li&gt;Copie o comando &lt;code&gt;apidog run&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O comando gerado terá este formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; YOUR_ACCESS_TOKEN &lt;span class="nt"&gt;-t&lt;/span&gt; 605067 &lt;span class="nt"&gt;-e&lt;/span&gt; 1629989 &lt;span class="nt"&gt;-n&lt;/span&gt; 1 &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;605067&lt;/code&gt; é o ID do cenário;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1629989&lt;/code&gt; é o ID do ambiente;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;YOUR_ACCESS_TOKEN&lt;/code&gt; é o token de acesso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como a máquina já deve estar autenticada via &lt;code&gt;apidog login&lt;/code&gt;, remova &lt;code&gt;--access-token YOUR_ACCESS_TOKEN&lt;/code&gt; antes de colocar o comando no &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Use este formato no contexto do Hermes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;-t&lt;/span&gt; 605067 &lt;span class="nt"&gt;-e&lt;/span&gt; 1629989 &lt;span class="nt"&gt;-n&lt;/span&gt; 1 &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 3: peça ao Hermes para executar o teste
&lt;/h2&gt;

&lt;p&gt;Inicie o Hermes na raiz do repositório e peça para executar o cenário de acordo com o &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Execute nosso cenário de teste de API do Apidog da maneira que &lt;a href="http://AGENTS.md" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt; descreve. Já estou autenticado, então não passe um token de acesso. Use &lt;code&gt;apidog run -t 605067 -e 1629989 -n 1 -r cli&lt;/code&gt;. Mostre-me a saída completa e diga-me o código de saída.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O Hermes deve chamar a ferramenta &lt;code&gt;terminal&lt;/code&gt; e executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;-t&lt;/span&gt; 605067 &lt;span class="nt"&gt;-e&lt;/span&gt; 1629989 &lt;span class="nt"&gt;-n&lt;/span&gt; 1 &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O reporter &lt;code&gt;-r cli&lt;/code&gt; mostra a execução passo a passo no terminal, incluindo requisições, respostas e asserções.&lt;/p&gt;

&lt;p&gt;Dependendo da configuração do Hermes, você pode ver um prompt de aprovação antes da execução. Para um cenário somente leitura contra staging, esse é um comando normalmente seguro para permitir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 4: valide pelo código de saída
&lt;/h2&gt;

&lt;p&gt;Não valide apenas pelo texto do resumo. Valide pelo código de saída.&lt;/p&gt;

&lt;p&gt;A regra é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exit code 0     =&amp;gt; todas as asserções passaram
exit code != 0  =&amp;gt; houve falha
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o Hermes disser que os testes passaram, mas o código de saída for diferente de &lt;code&gt;0&lt;/code&gt;, considere a execução falha.&lt;/p&gt;

&lt;p&gt;Esse comportamento torna o &lt;code&gt;apidog run&lt;/code&gt; útil tanto para o loop local do Hermes quanto para CI/CD.&lt;/p&gt;

&lt;p&gt;Para consultar flags disponíveis, peça ao Hermes para executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;a href="https://apidog.com/pt/blog/apidog-cli-complete-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia completo da CLI do Apidog&lt;/a&gt; documenta os principais flags, incluindo reporters como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cli&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;junit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Passo 5: integre o teste ao loop de edição do Hermes
&lt;/h2&gt;

&lt;p&gt;O objetivo é fazer o Hermes executar o teste sem você precisar repetir o comando toda vez.&lt;/p&gt;

&lt;p&gt;Um fluxo prático fica assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O Hermes altera um handler, rota ou formato de resposta.&lt;/li&gt;
&lt;li&gt;Ele identifica, via &lt;code&gt;AGENTS.md&lt;/code&gt;, que deve executar o cenário do Apidog.&lt;/li&gt;
&lt;li&gt;Ele roda:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;-t&lt;/span&gt; 605067 &lt;span class="nt"&gt;-e&lt;/span&gt; 1629989 &lt;span class="nt"&gt;-n&lt;/span&gt; 1 &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Ele lê o código de saída.&lt;/li&gt;
&lt;li&gt;Se for &lt;code&gt;0&lt;/code&gt;, continua.&lt;/li&gt;
&lt;li&gt;Se for diferente de &lt;code&gt;0&lt;/code&gt;, lê a asserção com falha, corrige o código e executa novamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso transforma o cenário de API em parte do mesmo ciclo de desenvolvimento que testes unitários:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;editar código -&amp;gt; executar teste -&amp;gt; ler falha -&amp;gt; corrigir -&amp;gt; executar novamente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é o modelo de “delegar e verificar”: o Hermes executa o comando, mas você mantém a regra objetiva de validação pelo código de saída.&lt;/p&gt;

&lt;p&gt;Para execuções longas, pastas grandes ou múltiplas iterações, a ferramenta &lt;code&gt;terminal&lt;/code&gt; do Hermes aceita &lt;code&gt;background=true&lt;/code&gt;. Assim, o Hermes pode iniciar a execução em segundo plano, continuar trabalhando e consultar o resultado depois.&lt;/p&gt;

&lt;p&gt;Para padrões mais amplos, veja também:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/pt/blog/ai-agents-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar agentes de IA para teste de API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/pt/blog/ai-agent-apidog-test-harness?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o harness de teste de IA do Apidog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Opcional: conecte o servidor Apidog MCP
&lt;/h2&gt;

&lt;p&gt;A CLI permite ao Hermes &lt;strong&gt;executar&lt;/strong&gt; testes. O servidor Apidog MCP permite que ele &lt;strong&gt;leia&lt;/strong&gt; a especificação da API enquanto escreve código.&lt;/p&gt;

&lt;p&gt;Os dois recursos se complementam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP fornece o contrato da API ao Hermes.&lt;/li&gt;
&lt;li&gt;CLI valida a implementação contra cenários reais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Hermes suporta o Model Context Protocol, ou MCP, nativamente.&lt;/p&gt;

&lt;p&gt;Edite o arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.hermes/config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione uma entrada em &lt;code&gt;mcp_servers&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;apidog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npx"&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apidog-mcp-server@latest"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--project=YOUR_PROJECT_ID"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ACCESS_TOKEN"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de salvar, dentro do Hermes, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/reload-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou reinicie o Hermes.&lt;/p&gt;

&lt;p&gt;Na inicialização, o Hermes descobre os servidores MCP e registra suas ferramentas com namespace, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mcp_apidog_&amp;lt;tool&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o agente pode consultar a especificação da API durante o raciocínio normal.&lt;/p&gt;

&lt;p&gt;Para a configuração completa, incluindo ID do projeto e token, consulte o &lt;a href="https://apidog.com/pt/blog/apidog-mcp-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia do servidor Apidog MCP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para uma versão empacotada desse loop, veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-claude-skills-api-test-automation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia da CLI do Apidog com Habilidades Claude&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do loop local para a CI
&lt;/h2&gt;

&lt;p&gt;Depois que o Hermes executa o cenário localmente e valida pelo código de saída, você tem o mesmo comando que pode ser usado na pipeline.&lt;/p&gt;

&lt;p&gt;A diferença é a autenticação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;localmente: login já armazenado via &lt;code&gt;apidog login&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;na CI: token passado como segredo mascarado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode pedir ao Hermes para criar o passo de CI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Escreva um passo do GitHub Actions que instale o apidog-cli e execute &lt;code&gt;apidog run -t 605067 -e 1629989 -r junit&lt;/code&gt;, lendo o token de acesso de um segredo do repositório chamado APIDOG_ACCESS_TOKEN.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Um exemplo de estrutura seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Apidog CLI&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g apidog-cli&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Apidog API tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apidog run --access-token "$APIDOG_ACCESS_TOKEN" -t 605067 -e 1629989 -r junit&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_ACCESS_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os detalhes de segredos, reporters e validação por código de saída estão em &lt;a href="https://apidog.com/pt/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CLI do Apidog no GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com isso, o mesmo comando passa a existir em três lugares:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;no seu terminal;&lt;/li&gt;
&lt;li&gt;no loop do Hermes;&lt;/li&gt;
&lt;li&gt;na CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Todos usando o mesmo critério objetivo: o código de saída.&lt;/p&gt;

&lt;h2&gt;
  
  
  Armadilhas comuns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O Hermes ignora o bloco de contexto
&lt;/h3&gt;

&lt;p&gt;Verifique se o arquivo está com o nome correto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também confirme que ele está no diretório onde o Hermes foi iniciado.&lt;/p&gt;

&lt;p&gt;Se necessário, reinicie a sessão para forçar uma nova leitura do contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Hermes apenas sugere o comando, mas não executa
&lt;/h3&gt;

&lt;p&gt;O Hermes executa comandos pela ferramenta &lt;code&gt;terminal&lt;/code&gt;, geralmente atrás de uma camada de aprovação.&lt;/p&gt;

&lt;p&gt;Se houver uma execução pendente, aprove-a. Se a configuração estiver bloqueando comandos de terminal, permita pelo menos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;apidog whoami&lt;/code&gt; mostra que você não está autenticado
&lt;/h3&gt;

&lt;p&gt;O login é armazenado na máquina, não no Hermes.&lt;/p&gt;

&lt;p&gt;Faça login manualmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois peça ao Hermes para confirmar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog &lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não cole tokens no chat se isso puder expô-los em logs ou histórico.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Hermes inventa um flag
&lt;/h3&gt;

&lt;p&gt;Se você vir erro de opção desconhecida, o Hermes provavelmente inferiu um flag inexistente.&lt;/p&gt;

&lt;p&gt;Peça para ele consultar a ajuda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois atualize o &lt;code&gt;AGENTS.md&lt;/code&gt; com o flag correto.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Hermes relata sucesso em uma execução com falha
&lt;/h3&gt;

&lt;p&gt;Essa é a falha mais importante a evitar.&lt;/p&gt;

&lt;p&gt;Sempre peça o código de saída e compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0    =&amp;gt; sucesso
!= 0 =&amp;gt; falha
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o resumo textual e o código de saída discordarem, confie no código de saída.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A configuração prática é simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adicione um bloco no &lt;code&gt;AGENTS.md&lt;/code&gt; com o comando &lt;code&gt;apidog run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remova tokens do arquivo de contexto.&lt;/li&gt;
&lt;li&gt;Instrua o Hermes a executar o comando pela ferramenta &lt;code&gt;terminal&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Valide sempre pelo código de saída.&lt;/li&gt;
&lt;li&gt;Opcionalmente, conecte o servidor Apidog MCP em &lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você continua criando cenários visualmente no &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;. O Hermes apenas executa esses cenários e usa o resultado para orientar o loop de implementação.&lt;/p&gt;

&lt;p&gt;A partir daqui, você pode levar o mesmo comando para sua pipeline com a &lt;a href="https://apidog.com/pt/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;CLI do Apidog no GitHub Actions&lt;/a&gt; ou consultar todos os flags no &lt;a href="https://apidog.com/pt/blog/apidog-cli-complete-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia completo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preciso de um plugin Hermes para usar a CLI do Apidog?
&lt;/h3&gt;

&lt;p&gt;Não. O Hermes executa comandos de shell pela ferramenta &lt;code&gt;terminal&lt;/code&gt;, então ele pode chamar &lt;code&gt;apidog run&lt;/code&gt; diretamente.&lt;/p&gt;

&lt;p&gt;A configuração específica do Hermes é o bloco em &lt;code&gt;AGENTS.md&lt;/code&gt;. O servidor MCP é opcional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde coloco as instruções que ensinam o fluxo de trabalho ao Hermes?
&lt;/h3&gt;

&lt;p&gt;Coloque em um arquivo de contexto que o Hermes carrega na inicialização, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENTS.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O local recomendado é a raiz do repositório.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como garanto que o Hermes não simule um teste aprovado?
&lt;/h3&gt;

&lt;p&gt;Peça sempre o código de saída.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apidog run&lt;/code&gt; retorna &lt;code&gt;0&lt;/code&gt; somente quando todas as asserções passam. Se o texto do Hermes disser “passou”, mas o código de saída for diferente de &lt;code&gt;0&lt;/code&gt;, considere falha.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como conecto o servidor Apidog MCP ao Hermes?
&lt;/h3&gt;

&lt;p&gt;Adicione uma entrada &lt;code&gt;mcp_servers&lt;/code&gt; em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.hermes/config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use o comando &lt;code&gt;apidog-mcp-server&lt;/code&gt; com o ID do projeto e o token. Depois execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/reload-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou reinicie o Hermes.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://apidog.com/pt/blog/apidog-mcp-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia do servidor Apidog MCP&lt;/a&gt; cobre os detalhes de projeto e autenticação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Isso funciona da mesma forma em outros agentes de codificação de IA?
&lt;/h3&gt;

&lt;p&gt;A CLI é a mesma. O que muda é como você instrui o agente.&lt;/p&gt;

&lt;p&gt;No Hermes, use &lt;code&gt;AGENTS.md&lt;/code&gt; e a ferramenta &lt;code&gt;terminal&lt;/code&gt;. Outros agentes podem usar outros arquivos de instrução ou mecanismos de contexto.&lt;/p&gt;

&lt;p&gt;A instalação e autenticação continuam iguais, então o &lt;a href="https://apidog.com/pt/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de instalação&lt;/a&gt; também se aplica.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Vegeta Teste de Carga: Tutorial de HTTP com Taxa Constante</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:08:46 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/vegeta-teste-de-carga-tutorial-de-http-com-taxa-constante-27eo</link>
      <guid>https://dev.to/lucas_ferreira/vegeta-teste-de-carga-tutorial-de-http-com-taxa-constante-27eo</guid>
      <description>&lt;p&gt;Você quer medir como sua API se comporta exatamente a &lt;strong&gt;500 requisições por segundo&lt;/strong&gt;, não “o mais rápido que N threads conseguirem enviar”. A maioria das ferramentas de carga fixa a concorrência e deixa a taxa variar. O Vegeta faz o inverso: você define a taxa, e ele tenta enviar esse volume de requisições por segundo independentemente da velocidade de resposta do servidor. Isso importa quando você precisa validar throughput, latência e SLOs sob uma carga-alvo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Vegeta
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/tsenart/vegeta" rel="noopener noreferrer"&gt;Vegeta&lt;/a&gt; é uma ferramenta de teste de carga HTTP via linha de comando, escrita em Go. Também pode ser usada como biblioteca Go, mas este guia foca na CLI.&lt;/p&gt;

&lt;p&gt;A ideia principal é simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;você define uma taxa constante de requisições, e o Vegeta tenta manter esse ritmo durante todo o teste.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exemplo: “envie 100 requisições por segundo por 30 segundos”. Se o servidor ficar lento, o Vegeta continua emitindo novas requisições conforme o cronograma, em vez de esperar as anteriores terminarem.&lt;/p&gt;

&lt;p&gt;Isso cria um modelo de carga aberto, mais próximo de tráfego real: usuários chegam em seu próprio ritmo; eles não esperam seu endpoint lento terminar para que o próximo usuário apareça.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carga baseada em taxa vs. baseada em concorrência
&lt;/h2&gt;

&lt;p&gt;A diferença prática é esta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ferramentas baseadas em &lt;strong&gt;concorrência&lt;/strong&gt; fixam usuários virtuais, threads ou workers;&lt;/li&gt;
&lt;li&gt;ferramentas baseadas em &lt;strong&gt;taxa&lt;/strong&gt; fixam a quantidade de requisições por segundo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em um modelo baseado em concorrência, cada worker geralmente executa um loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enviar requisição -&amp;gt; aguardar resposta -&amp;gt; enviar próxima requisição
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o servidor fica lento, o loop demora mais. Como consequência, a taxa real de requisições cai. A ferramenta “recua” sem você perceber.&lt;/p&gt;

&lt;p&gt;Em um modelo baseado em taxa, como no Vegeta, você fixa a taxa de chegada. Se o servidor não acompanha, as requisições começam a se acumular, a latência sobe e os erros aparecem no relatório.&lt;/p&gt;

&lt;p&gt;Use cada modelo para perguntas diferentes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;Modelo mais adequado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quantos usuários simultâneos minha API suporta?&lt;/td&gt;
&lt;td&gt;Concorrência&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O que acontece com 2.000 requisições por segundo?&lt;/td&gt;
&lt;td&gt;Taxa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Em qual RPS a latência começa a degradar?&lt;/td&gt;
&lt;td&gt;Taxa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Como duas builds se comportam sob a mesma carga?&lt;/td&gt;
&lt;td&gt;Taxa&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para uma visão mais ampla do ecossistema, veja &lt;a href="https://apidog.com/pt/blog/api-load-testing-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;as principais ferramentas de teste de carga de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalar Vegeta
&lt;/h2&gt;

&lt;p&gt;Escolha a opção adequada para seu ambiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS com Homebrew
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install &lt;/span&gt;vegeta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Outros gerenciadores de pacotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# MacPorts&lt;/span&gt;
port &lt;span class="nb"&gt;install &lt;/span&gt;vegeta

&lt;span class="c"&gt;# Arch Linux&lt;/span&gt;
pacman &lt;span class="nt"&gt;-S&lt;/span&gt; vegeta

&lt;span class="c"&gt;# FreeBSD&lt;/span&gt;
pkg &lt;span class="nb"&gt;install &lt;/span&gt;vegeta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compilar a partir do código-fonte
&lt;/h3&gt;

&lt;p&gt;Com Go instalado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tsenart/vegeta
&lt;span class="nb"&gt;cd &lt;/span&gt;vegeta
make vegeta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode baixar um binário pré-compilado pela página de releases do GitHub.&lt;/p&gt;

&lt;p&gt;Confirme a instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O pipeline principal
&lt;/h2&gt;

&lt;p&gt;O Vegeta foi desenhado para funcionar bem com pipes Unix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GET http://localhost:8080/"&lt;/span&gt; | vegeta attack &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5s &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leia o comando da esquerda para a direita:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;echo&lt;/code&gt; escreve um alvo HTTP: método e URL.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vegeta attack&lt;/code&gt; lê o alvo pela entrada padrão e dispara &lt;code&gt;100&lt;/code&gt; requisições por segundo por &lt;code&gt;5s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vegeta report&lt;/code&gt; lê os resultados e imprime um resumo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse teste gera aproximadamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 req/s * 5s = 500 requisições
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A flag &lt;code&gt;-rate&lt;/code&gt; aceita requisições por unidade de tempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100       &lt;span class="c"&gt;# 100 requisições por segundo&lt;/span&gt;
&lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100/1s    &lt;span class="c"&gt;# equivalente&lt;/span&gt;
&lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50/500ms  &lt;span class="c"&gt;# 50 requisições a cada 500 ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;-rate=0&lt;/code&gt; apenas quando quiser remover o limite e enviar o máximo possível. Isso muda o tipo de teste: deixa de ser uma carga constante controlada e vira um teste de throughput máximo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como ler o relatório
&lt;/h2&gt;

&lt;p&gt;Um relatório de texto se parece com isto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requests      [total, rate, throughput]  500, 100.20, 100.18
Duration      [total, attack, wait]      4.991s, 4.990s, 1.2ms
Latencies     [min, mean, 50, 90, 95, 99, max]  412us, 1.3ms, 1.1ms, 1.9ms, 2.4ms, 5.1ms, 12ms
Bytes In      [total, mean]              128500, 257.00
Bytes Out     [total, mean]              0, 0.00
Success       [ratio]                    100.00%
Status Codes  [code:count]               200:500
Error Set:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na prática, avalie nesta ordem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Latencies&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;50&lt;/code&gt;: mediana.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;95&lt;/code&gt;: 95º percentil.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;99&lt;/code&gt;: cauda lenta. Se esse valor está alto, usuários reais sentirão o problema.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Success [ratio]&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Deve estar próximo de 100% para uma carga suportada.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status Codes&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Verifique se há &lt;code&gt;5xx&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt; ou outros códigos inesperados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Set&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Deve estar vazio em uma execução saudável.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Uma média boa não compensa um percentil 99 ruim. Em APIs, a cauda costuma ser onde os incidentes começam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Salve os resultados antes de gerar relatórios
&lt;/h2&gt;

&lt;p&gt;Para testes rápidos, enviar direto para &lt;code&gt;vegeta report&lt;/code&gt; é suficiente. Para qualquer execução que você queira comparar, versionar ou anexar ao CI, salve o arquivo binário de resultados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GET http://localhost:8080/"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  vegeta attack &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10s &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;200 &lt;span class="nt"&gt;-output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;results.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois gere relatórios a partir do arquivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relatório de texto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta report results.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JSON para dashboard ou automação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta report &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json results.bin &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; metrics.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Histograma de latência
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta report &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'hist[0,2ms,5ms,10ms,25ms,100ms]'&lt;/span&gt; results.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O histograma mostra quantas requisições caíram em cada faixa de latência. É útil para identificar se a maioria das respostas está concentrada em uma faixa pequena ou se há dispersão significativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criar um arquivo de alvos
&lt;/h2&gt;

&lt;p&gt;APIs reais raramente são testadas com um único &lt;code&gt;GET&lt;/code&gt;. Coloque seus endpoints em um arquivo e passe-o com &lt;code&gt;-targets&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Crie &lt;code&gt;targets.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:8080/api/users

POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json

GET http://localhost:8080/api/users/42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o corpo da requisição em &lt;code&gt;payload.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engineer"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regras do formato:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a primeira linha de cada alvo é &lt;code&gt;MÉTODO URL&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;cabeçalhos vêm logo abaixo, no formato &lt;code&gt;Chave: Valor&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;uma linha iniciada com &lt;code&gt;@&lt;/code&gt; referencia um arquivo usado como corpo da requisição;&lt;/li&gt;
&lt;li&gt;uma linha em branco separa um alvo do próximo;&lt;/li&gt;
&lt;li&gt;linhas iniciadas com &lt;code&gt;#&lt;/code&gt; são comentários.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Vegeta percorre os alvos em ordem e repete a lista até a duração terminar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adicionar autenticação
&lt;/h2&gt;

&lt;p&gt;Para adicionar cabeçalhos globais, use &lt;code&gt;-header&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo com Bearer Token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-header&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode adicionar outros cabeçalhos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-header&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-header&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"X-Request-Source: load-test"&lt;/span&gt; | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usar formato JSON para alvos
&lt;/h2&gt;

&lt;p&gt;Para geração programática, o Vegeta também aceita alvos em JSON. Cada linha é um objeto JSON.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/api/users"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/api/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"header"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJuYW1lIjoiQWRhIn0="&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute com &lt;code&gt;-format=json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.json &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O campo &lt;code&gt;body&lt;/code&gt; deve estar em base64.&lt;/p&gt;

&lt;p&gt;Esse formato funciona bem quando você gera alvos em tempo real. Para reduzir uso de memória em streams grandes, use &lt;code&gt;-lazy&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;generate-targets | vegeta attack &lt;span class="nt"&gt;-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="nt"&gt;-lazy&lt;/span&gt; &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s | vegeta report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gerar gráficos e comparar execuções
&lt;/h2&gt;

&lt;p&gt;Um único número pode esconder degradações no meio do teste. Para visualizar latência ao longo do tempo, use &lt;code&gt;vegeta plot&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60s | &lt;span class="se"&gt;\&lt;/span&gt;
  vegeta plot &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; plot.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra &lt;code&gt;plot.html&lt;/code&gt; no navegador. Você verá uma série temporal da latência durante a execução.&lt;/p&gt;

&lt;p&gt;Para comparar diferentes níveis de carga:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50  &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50qps.bin
vegeta attack &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="nt"&gt;-output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100qps.bin

vegeta plot 50qps.bin 100qps.bin &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; compare.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em ambientes sem interface gráfica, exporte CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta encode &lt;span class="nt"&gt;-to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv results.bin &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; results.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encontrar o limite de capacidade
&lt;/h2&gt;

&lt;p&gt;Um fluxo simples para encontrar o ponto de degradação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;rate &lt;span class="k"&gt;in &lt;/span&gt;50 100 200 400 800&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Executando teste com &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rate&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; req/s"&lt;/span&gt;

  vegeta attack &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rate&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"results-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rate&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.bin"&lt;/span&gt;

  vegeta report &lt;span class="s2"&gt;"results-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rate&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.bin"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"report-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rate&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.txt"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"Requests|Latencies|Success|Status Codes"&lt;/span&gt; report-&lt;span class="k"&gt;*&lt;/span&gt;.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Procure o primeiro ponto em que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o percentil 95 ou 99 sobe de forma relevante;&lt;/li&gt;
&lt;li&gt;a taxa de sucesso cai;&lt;/li&gt;
&lt;li&gt;aparecem códigos &lt;code&gt;5xx&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt; ou timeouts;&lt;/li&gt;
&lt;li&gt;o throughput fica abaixo da taxa solicitada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse ponto indica que a API começou a não acompanhar a carga desejada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar o Vegeta
&lt;/h2&gt;

&lt;p&gt;Use Vegeta quando a pergunta for sobre &lt;strong&gt;taxa, latência e capacidade&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;medir throughput e latência em um RPS específico;&lt;/li&gt;
&lt;li&gt;descobrir em qual taxa a latência começa a subir;&lt;/li&gt;
&lt;li&gt;comparar duas builds sob carga idêntica;&lt;/li&gt;
&lt;li&gt;comparar duas configurações de infraestrutura;&lt;/li&gt;
&lt;li&gt;automatizar testes de carga em shell ou CI;&lt;/li&gt;
&lt;li&gt;gerar relatórios simples sem depender de GUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ele é uma ferramenta focada. Envia requisições HTTP em uma taxa definida e mede como o servidor responde.&lt;/p&gt;

&lt;p&gt;Ele não é ideal para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jornadas complexas com múltiplos passos e ramificações;&lt;/li&gt;
&lt;li&gt;simular navegação realista de usuários;&lt;/li&gt;
&lt;li&gt;validar regras de negócio;&lt;/li&gt;
&lt;li&gt;verificar schemas ou campos específicos no corpo da resposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse foco é positivo: mantém os testes repetíveis, scriptáveis e fáceis de interpretar.&lt;/p&gt;

&lt;p&gt;Se estiver comparando alternativas, veja também os guias sobre &lt;a href="https://apidog.com/pt/blog/k6-load-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste de carga k6&lt;/a&gt; e &lt;a href="https://apidog.com/pt/blog/jmeter-load-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste de carga JMeter&lt;/a&gt;. Para conceitos e métricas, comece pelo &lt;a href="https://apidog.com/pt/blog/api-performance-testing-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial de teste de desempenho de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde o teste funcional entra
&lt;/h2&gt;

&lt;p&gt;Teste de carga responde:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A API é rápida o suficiente sob esta carga?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ele não responde:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A API está retornando os dados corretos?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma execução do Vegeta pode mostrar 100% de respostas &lt;code&gt;200&lt;/code&gt; enquanto o endpoint retorna o usuário errado, um preço desatualizado ou um JSON inválido. Para uma ferramenta de carga, isso ainda pode parecer sucesso.&lt;/p&gt;

&lt;p&gt;Correção exige outro tipo de validação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status esperado;&lt;/li&gt;
&lt;li&gt;cabeçalhos esperados;&lt;/li&gt;
&lt;li&gt;campos JSON;&lt;/li&gt;
&lt;li&gt;schema;&lt;/li&gt;
&lt;li&gt;regras de negócio;&lt;/li&gt;
&lt;li&gt;encadeamento entre requisições.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é &lt;a href="https://apidog.com/pt/blog/api-functional-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;teste funcional&lt;/a&gt;, e deve acontecer antes ou junto dos testes de carga.&lt;/p&gt;

&lt;p&gt;É aqui que o &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; complementa o Vegeta. No Apidog, você cria cenários funcionais com asserções sobre status, cabeçalhos e campos JSON, encadeia requisições e usa dados externos. Depois, o Vegeta mede se os caminhos já validados continuam rápidos sob centenas ou milhares de requisições por segundo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executar testes funcionais no CI com Apidog CLI
&lt;/h2&gt;

&lt;p&gt;O Apidog oferece uma CLI headless para executar cenários funcionais em pipelines.&lt;/p&gt;

&lt;p&gt;Instale com Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute um cenário, pasta ou suíte salvo por ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenarioOrSuiteId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;environmentId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,html,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parâmetros principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID do cenário, pasta ou suíte;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID do ambiente;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: formatos de relatório, como &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt; e &lt;code&gt;junit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A saída &lt;code&gt;junit&lt;/code&gt; funciona bem em dashboards de CI.&lt;/p&gt;

&lt;p&gt;Veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-test-rest-api-command-line?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial da linha de comando da CLI do Apidog&lt;/a&gt; e o &lt;a href="https://apidog.com/pt/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guia de pipeline CI/CD&lt;/a&gt; para um fluxo passo a passo.&lt;/p&gt;

&lt;p&gt;Um pipeline saudável fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Executar testes funcionais
2. Bloquear o pipeline se asserções falharem
3. Executar Vegeta nos endpoints aprovados
4. Publicar relatórios de carga
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vegeta suporta requisições POST com corpo?
&lt;/h3&gt;

&lt;p&gt;Sim. No arquivo de alvos HTTP, defina o método e a URL na primeira linha, adicione &lt;code&gt;Content-Type&lt;/code&gt; e referencie o corpo com &lt;code&gt;@./payload.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No formato JSON, use &lt;code&gt;method&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt; e &lt;code&gt;body&lt;/code&gt; em base64.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que &lt;code&gt;-rate=0&lt;/code&gt; faz?
&lt;/h3&gt;

&lt;p&gt;Remove o limite de taxa e envia requisições tão rápido quanto workers e conexões permitirem.&lt;/p&gt;

&lt;p&gt;Isso é útil para medir throughput máximo, mas não para um teste controlado de taxa constante. Para medições repetíveis, defina uma taxa explícita, como &lt;code&gt;-rate=100&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como leio os percentis de latência?
&lt;/h3&gt;

&lt;p&gt;A linha &lt;code&gt;Latencies&lt;/code&gt; mostra mínimo, média, mediana, percentis 90, 95, 99 e máximo.&lt;/p&gt;

&lt;p&gt;Priorize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;95&lt;/code&gt;: comportamento lento para uma parte relevante dos usuários;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;99&lt;/code&gt;: cauda extrema;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;max&lt;/code&gt;: pior caso observado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A média pode esconder problemas, então não use apenas &lt;code&gt;mean&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vegeta valida se minha API retorna dados corretos?
&lt;/h3&gt;

&lt;p&gt;Não. Vegeta mede throughput, latência, códigos de status e erros de transporte. Ele não valida corpo da resposta, schema ou regras de negócio.&lt;/p&gt;

&lt;p&gt;Combine Vegeta com uma ferramenta de teste funcional para validar correção antes de medir performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como executo Vegeta em CI?
&lt;/h3&gt;

&lt;p&gt;Como ele é um binário de linha de comando, basta adicionar uma etapa shell.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vegeta attack &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;targets.txt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30s &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;results.bin

vegeta report results.bin
vegeta report &lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json results.bin &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; metrics.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Publique &lt;code&gt;results.bin&lt;/code&gt;, &lt;code&gt;metrics.json&lt;/code&gt; e o relatório textual como artefatos do build.&lt;/p&gt;

&lt;p&gt;Para evitar medir endpoints quebrados, rode primeiro um gate funcional, como a CLI do Apidog, e só depois execute a etapa de carga.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Claude Fable 5 Sem Restrições</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 06 Jul 2026 08:21:25 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/claude-fable-5-sem-restricoes-3f4k</link>
      <guid>https://dev.to/lucas_ferreira/claude-fable-5-sem-restricoes-3f4k</guid>
      <description>&lt;p&gt;Se você pesquisou por “Claude Fable 5 sem restrições”, provavelmente está tentando resolver um destes dois cenários: confirmar se o modelo voltou após a suspensão ou encontrar uma versão “sem censura” com filtros desativados. A resposta curta: o acesso ao Fable 5 voltou, mas o classificador de segurança continua ativo e não pode ser desligado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;A restrição que impedia o uso do &lt;code&gt;claude-fable-5&lt;/code&gt; foi removida. O modelo ficou suspenso por 19 dias sob controles de exportação dos EUA. Esses controles foram suspensos em 30 de junho de 2026, e o Fable 5 voltou em 1º de julho. Hoje, ele pode ser usado novamente via API, aplicativos Claude e principais plataformas de nuvem.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que “Fable 5 sem restrições” realmente significa
&lt;/h2&gt;

&lt;p&gt;Existem duas “restrições” diferentes sendo confundidas.&lt;/p&gt;

&lt;p&gt;A primeira foi a &lt;strong&gt;suspensão por controle de exportação&lt;/strong&gt;. Em 12 de junho de 2026, o Departamento de Comércio dos EUA restringiu o Fable 5 e o Mythos 5 após os modelos serem associados a abusos de cibersegurança impulsionados por jailbreaks. O acesso global foi interrompido. Essa foi a restrição que tornou o modelo inutilizável — e essa foi suspensa.&lt;/p&gt;

&lt;p&gt;Para a linha do tempo completa, veja: &lt;a href="https://apidog.com/pt/blog/fable-5-down-government-suspension?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;por que o Fable 5 foi desativado&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxhy78o0bgqahnvsx2l2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxhy78o0bgqahnvsx2l2i.png" alt="Imagem sobre o Fable 5" width="800" height="883"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A segunda é o &lt;strong&gt;classificador de segurança&lt;/strong&gt; do modelo reimplantado. Ele não é um bloqueio regional, uma configuração de conta ou um cabeçalho de API. É parte do comportamento atual do Fable 5.&lt;/p&gt;

&lt;p&gt;Na prática:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você pode usar o Fable 5 novamente.&lt;/li&gt;
&lt;li&gt;Você pode integrá-lo via API e nuvens compatíveis.&lt;/li&gt;
&lt;li&gt;Você pode configurar limites, créditos e fallbacks.&lt;/li&gt;
&lt;li&gt;Você não pode desativar o classificador de segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você quer entender o retorno do modelo em mais detalhes, veja: &lt;a href="https://apidog.com/pt/blog/claude-fable-5-is-back?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Fable 5 está de volta&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A restrição que foi removida: suspensão de exportação
&lt;/h2&gt;

&lt;p&gt;Linha do tempo operacional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;12 de junho de 2026&lt;/strong&gt;: Fable 5 e Mythos 5 são suspensos. O acesso global é interrompido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30 de junho de 2026&lt;/strong&gt;: os controles de exportação são suspensos após reforço das salvaguardas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1º de julho de 2026&lt;/strong&gt;: Fable 5 volta a ficar disponível globalmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A partir de 6 de julho de 2026, o Fable 5 está novamente disponível em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aplicativos Claude;&lt;/li&gt;
&lt;li&gt;Claude Code;&lt;/li&gt;
&lt;li&gt;API da Anthropic;&lt;/li&gt;
&lt;li&gt;AWS Bedrock;&lt;/li&gt;
&lt;li&gt;Google Vertex AI;&lt;/li&gt;
&lt;li&gt;Microsoft Foundry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A disponibilidade pode variar por conta e região. Antes de migrar produção, valide se o modelo aparece no catálogo da sua plataforma.&lt;/p&gt;

&lt;p&gt;Se você mudou suas cargas de trabalho para um modelo alternativo durante a suspensão, não volte apenas trocando o nome do modelo. Faça uma migração controlada. Veja o guia: &lt;a href="https://apidog.com/pt/blog/switch-back-to-fable-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como voltar para o Fable 5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que continua ativo: classificador de segurança
&lt;/h2&gt;

&lt;p&gt;O Fable 5 que voltou não é o mesmo binário que foi suspenso. A Anthropic o reimplantou com um novo classificador de segurança.&lt;/p&gt;

&lt;p&gt;Quando uma requisição aciona esse classificador — por exemplo, padrões ligados a operações cibernéticas ofensivas, biologia adjacente a armas biológicas ou extração estilo destilação — o modelo não retorna apenas um erro rígido. Ele pode &lt;strong&gt;redirecionar&lt;/strong&gt; a chamada para o Opus 4.8, que responde no lugar do Fable 5.&lt;/p&gt;

&lt;p&gt;Segundo a Anthropic, o classificador detecta o jailbreak sinalizado em mais de 99% dos casos. Para entender a mecânica de roteamento, veja: &lt;a href="https://apidog.com/pt/blog/claude-fable-5-safety-safeguards?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como funcionam as salvaguardas de segurança do Fable 5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O ponto importante para desenvolvedores:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trate o redirecionamento como comportamento esperado da API, não como falha inesperada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como usar o Fable 5 com o mínimo de atrito legítimo
&lt;/h2&gt;

&lt;p&gt;Você não pode remover a camada de segurança. Mas pode reduzir outros gargalos: acesso, limites, faturamento, fallbacks e prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use a API para controle total da integração
&lt;/h3&gt;

&lt;p&gt;A API é a rota mais direta para usar o Fable 5 em aplicações próprias. Ela evita limites de sessão típicos dos aplicativos e permite controlar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modelo;&lt;/li&gt;
&lt;li&gt;tokens máximos;&lt;/li&gt;
&lt;li&gt;mensagens;&lt;/li&gt;
&lt;li&gt;fallback;&lt;/li&gt;
&lt;li&gt;tratamento de resposta;&lt;/li&gt;
&lt;li&gt;observabilidade;&lt;/li&gt;
&lt;li&gt;custos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo simplificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-fable-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resuma esta especificação de API em tópicos técnicos.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para um fluxo completo de requisição, veja: &lt;a href="https://apidog.com/pt/blog/how-to-use-claude-fable-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como usar a API do Claude Fable 5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para comparar API, aplicativos Claude e planos, veja: &lt;a href="https://apidog.com/pt/blog/how-to-access-claude-fable-5?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como acessar o Fable 5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Planeje limites de taxa
&lt;/h3&gt;

&lt;p&gt;Na prática, muitos times não batem no classificador de segurança; batem em &lt;strong&gt;rate limits&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se sua aplicação faz chamadas em lote, análise de documentos, geração de código ou automações internas, valide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requisições por minuto;&lt;/li&gt;
&lt;li&gt;tokens de entrada por minuto;&lt;/li&gt;
&lt;li&gt;tokens de saída por minuto;&lt;/li&gt;
&lt;li&gt;concorrência;&lt;/li&gt;
&lt;li&gt;comportamento de retry;&lt;/li&gt;
&lt;li&gt;filas e backoff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de retry com backoff simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os níveis e limites são explicados em: &lt;a href="https://apidog.com/pt/blog/claude-fable-5-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Limites de taxa do Fable 5 explicados&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se o limite está nos aplicativos Claude, não na API, veja: &lt;a href="https://apidog.com/pt/blog/how-to-extend-fable-5-usage-perfect-prompt?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;abordagem de prompt perfeito para estender seu uso&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prepare-se para créditos de uso em 7 de julho
&lt;/h3&gt;

&lt;p&gt;Até 7 de julho, o Fable 5 está incluído em até 50% dos limites semanais de uso nos planos Pro, Max, Team e Enterprise selecionados.&lt;/p&gt;

&lt;p&gt;Depois de 7 de julho, o uso contínuo passa para um modelo de créditos. Assentos Standard Enterprise não recebem a cota incluída e vão direto para créditos.&lt;/p&gt;

&lt;p&gt;Taxas relatadas após 7 de julho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;US$ 10 por milhão de tokens de entrada&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;US$ 50 por milhão de tokens de saída&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Confirme os valores na sua página de faturamento antes de planejar custos de produção.&lt;/p&gt;

&lt;p&gt;Para workloads com alto volume, monitore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;custo_estimado = tokens_entrada * taxa_entrada + tokens_saida * taxa_saida
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E registre por chamada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modelo usado;&lt;/li&gt;
&lt;li&gt;tokens de entrada;&lt;/li&gt;
&lt;li&gt;tokens de saída;&lt;/li&gt;
&lt;li&gt;se houve fallback;&lt;/li&gt;
&lt;li&gt;custo estimado;&lt;/li&gt;
&lt;li&gt;endpoint/plataforma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Detalhes: &lt;a href="https://apidog.com/pt/blog/fable-5-usage-credits-july-7?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;a mudança de créditos de uso de 7 de julho explicada&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Trate fallbacks explicitamente
&lt;/h3&gt;

&lt;p&gt;Como o classificador pode redirecionar chamadas para o Opus 4.8, sua integração deve estar pronta para receber uma resposta de outro modelo.&lt;/p&gt;

&lt;p&gt;Na API da Anthropic, use o parâmetro beta &lt;code&gt;fallbacks&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-fable-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;betas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server-side-fallback-2026-06-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fallbacks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this API spec.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A string beta deve ser exatamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server-side-fallback-2026-06-01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de colocar em produção, valide na documentação atual do Claude, pois parâmetros beta podem mudar.&lt;/p&gt;

&lt;p&gt;Também considere que uma resposta redirecionada é faturada com as taxas do Opus 4.8, não do Fable 5.&lt;/p&gt;

&lt;p&gt;Checklist para implementação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] detectar qual modelo respondeu;&lt;/li&gt;
&lt;li&gt;[ ] registrar fallback em logs;&lt;/li&gt;
&lt;li&gt;[ ] calcular custo com base no modelo real;&lt;/li&gt;
&lt;li&gt;[ ] testar respostas normais e redirecionadas;&lt;/li&gt;
&lt;li&gt;[ ] garantir que parsers e validações aceitem ambos os caminhos;&lt;/li&gt;
&lt;li&gt;[ ] adicionar alertas para aumento incomum de fallbacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disponibilidade do parâmetro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API da Anthropic: suporte via &lt;code&gt;fallbacks&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Plataforma Claude na AWS: suporte via &lt;code&gt;fallbacks&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Bedrock, Vertex e Foundry: tratamento via middleware do lado do cliente;&lt;/li&gt;
&lt;li&gt;API de Lotes de Mensagens: tratamento via middleware do lado do cliente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Guia completo: &lt;a href="https://apidog.com/pt/blog/claude-fable-5-fallbacks-parameter?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como lidar com as recusas do Fable 5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Escreva prompts claros e compatíveis com política
&lt;/h3&gt;

&lt;p&gt;Prompts ambíguos perto de temas sensíveis podem aumentar falsos positivos.&lt;/p&gt;

&lt;p&gt;Prefira prompts com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objetivo explícito;&lt;/li&gt;
&lt;li&gt;contexto legítimo;&lt;/li&gt;
&lt;li&gt;escopo técnico claro;&lt;/li&gt;
&lt;li&gt;restrições de segurança;&lt;/li&gt;
&lt;li&gt;formato esperado de saída.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo ruim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analise este exploit e melhore.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo melhor para um caso legítimo de defesa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Estou revisando um relatório interno de segurança defensiva.
Explique, em alto nível, quais classes de vulnerabilidade aparecem no texto abaixo,
sem fornecer instruções exploráveis, payloads ou passos ofensivos.
Retorne a resposta em tópicos para priorização de correção.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso não contorna política. Apenas reduz ambiguidade quando a tarefa real é benigna.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuidado com “Fable 5 sem censura” ou “com jailbreak”
&lt;/h2&gt;

&lt;p&gt;Se você encontrar um site, Discord, extensão ou revendedor anunciando Fable 5 “sem censura”, “com jailbreak” ou “sem limites”, não use.&lt;/p&gt;

&lt;p&gt;Não existe produto legítimo com o classificador desativado.&lt;/p&gt;

&lt;p&gt;Normalmente, essas ofertas caem em uma destas categorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;revenda enganosa&lt;/strong&gt;: acesso normal ao Fable 5 com marketing falso;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;modelo diferente&lt;/strong&gt;: outro modelo sendo vendido como se fosse Fable 5;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;proxy irregular&lt;/strong&gt;: chamadas feitas por chaves roubadas, compartilhadas ou em violação de termos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Riscos práticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vazamento de prompts;&lt;/li&gt;
&lt;li&gt;exposição de dados internos;&lt;/li&gt;
&lt;li&gt;banimento de conta;&lt;/li&gt;
&lt;li&gt;cobrança indevida;&lt;/li&gt;
&lt;li&gt;respostas de modelo diferente do anunciado;&lt;/li&gt;
&lt;li&gt;ausência de garantias de privacidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As formas legítimas de reduzir atrito são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usar a API;&lt;/li&gt;
&lt;li&gt;subir níveis de rate limit;&lt;/li&gt;
&lt;li&gt;planejar créditos;&lt;/li&gt;
&lt;li&gt;configurar fallbacks;&lt;/li&gt;
&lt;li&gt;testar regressões;&lt;/li&gt;
&lt;li&gt;escrever prompts claros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não há uma “quarta porta” confiável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teste de regressão na integração reativada
&lt;/h2&gt;

&lt;p&gt;Se você está voltando workloads para o Fable 5, trate isso como mudança de contrato.&lt;/p&gt;

&lt;p&gt;Antes da suspensão, uma chamada podia sempre retornar do Fable 5. Agora, dependendo da entrada, ela pode retornar via Opus 4.8.&lt;/p&gt;

&lt;p&gt;Teste perguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meu parser assume um único modelo?&lt;/li&gt;
&lt;li&gt;Meu sistema registra o modelo real da resposta?&lt;/li&gt;
&lt;li&gt;O cálculo de custo considera fallback?&lt;/li&gt;
&lt;li&gt;O fluxo de streaming continua funcionando?&lt;/li&gt;
&lt;li&gt;O frontend mostra erro quando não deveria?&lt;/li&gt;
&lt;li&gt;O retry duplica chamadas redirecionadas?&lt;/li&gt;
&lt;li&gt;O pipeline de CI cobre o caminho de fallback?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, você pode modelar o contrato da requisição do Fable 5, simular resposta normal e resposta redirecionada para Opus, e validar se sua integração lida com ambos os cenários.&lt;/p&gt;

&lt;p&gt;Exemplo de cenários de teste:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cenário 1: resposta normal do Fable 5
- model: claude-fable-5
- status: 200
- tokens: dentro do esperado
- parser: sucesso

Cenário 2: fallback para Opus 4.8
- model: claude-opus-4-8
- status: 200
- custo: calculado como Opus
- parser: sucesso
- log: fallback=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; permite executar a mesma suíte em CI, garantindo que cada deploy valide o contrato antes de chegar à produção.&lt;/p&gt;

&lt;p&gt;Importante: o Apidog não remove restrições do Fable 5, não altera o classificador e não desbloqueia nada. Ele ajuda a testar o comportamento da API que você já usa, incluindo redirecionamento e fallback.&lt;/p&gt;

&lt;p&gt;Para uma lista mais ampla do que validar, veja: &lt;a href="https://apidog.com/pt/blog/claude-fable-5-mythos-api-changes?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mudanças na API do Fable 5 e Mythos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perguntas Frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Posso usar o Claude Fable 5 novamente a partir de julho de 2026?
&lt;/h3&gt;

&lt;p&gt;Sim. A suspensão do controle de exportação foi suspensa em 30 de junho de 2026, e o modelo retornou em 1º de julho. Ele está disponível na API, nos aplicativos Claude, Claude Code e nas principais nuvens, sujeito à implantação por conta e região.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existe uma versão sem censura do Fable 5?
&lt;/h3&gt;

&lt;p&gt;Não. O classificador de segurança é integrado ao modelo reimplantado e não pode ser desativado. Qualquer Fable 5 “sem censura” ou “com jailbreak” sendo vendido é acesso normal mal rotulado, outro modelo ou um proxy que viola termos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que o filtro de segurança não pode ser desativado?
&lt;/h3&gt;

&lt;p&gt;Porque o uso indevido que ele impede foi o motivo da suspensão. O classificador é a condição que permitiu o retorno do Fable 5. Removê-lo recriaria o problema original.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que acontece depois de 7 de julho de 2026?
&lt;/h3&gt;

&lt;p&gt;A cota incluída do Fable 5, de até 50% dos limites semanais em planos selecionados, termina. Depois disso, o uso contínuo passa a funcionar com créditos. Confirme as taxas exatas na sua página de faturamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como faço meu aplicativo continuar funcionando quando o Fable 5 redireciona uma requisição?
&lt;/h3&gt;

&lt;p&gt;Trate o redirecionamento explicitamente. Na API da Anthropic, use o parâmetro beta &lt;code&gt;fallbacks&lt;/code&gt; com &lt;code&gt;server-side-fallback-2026-06-01&lt;/code&gt; e configure &lt;code&gt;claude-opus-4-8&lt;/code&gt; como fallback. Em Bedrock, Vertex e Foundry, implemente middleware do lado do cliente. Depois, rode testes de regressão para os dois caminhos: resposta normal e resposta redirecionada.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O Que É ConnectRPC? O Protocolo Connect</title>
      <dc:creator>Lucas</dc:creator>
      <pubDate>Mon, 06 Jul 2026 08:12:26 +0000</pubDate>
      <link>https://dev.to/lucas_ferreira/o-que-e-connectrpc-o-protocolo-connect-idh</link>
      <guid>https://dev.to/lucas_ferreira/o-que-e-connectrpc-o-protocolo-connect-idh</guid>
      <description>&lt;p&gt;Se você já tentou chamar um serviço gRPC diretamente de um navegador, encontrou a limitação principal: navegadores não conseguem controlar “trailers” HTTP, então não conseguem falar gRPC puro. O caminho tradicional é colocar um proxy, como Envoy, entre o navegador e o backend. O ConnectRPC remove essa etapa ao permitir APIs baseadas em Protobuf que podem ser chamadas por navegadores, por &lt;code&gt;curl&lt;/code&gt; e por clientes gRPC.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Experimente o Apidog hoje&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Neste guia, você verá o que é o ConnectRPC, qual problema ele resolve, como ele se compara a gRPC, gRPC-Web e REST, como uma requisição Connect funciona via HTTP e como testar endpoints Connect e gRPC com ferramentas comuns de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o ConnectRPC
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://connectrpc.com/" rel="noopener noreferrer"&gt;ConnectRPC&lt;/a&gt; é uma família de bibliotecas para criar APIs HTTP compatíveis com navegadores e com gRPC usando Protocol Buffers.&lt;/p&gt;

&lt;p&gt;O fluxo básico é:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Definir o contrato em um arquivo &lt;code&gt;.proto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gerar código com &lt;code&gt;buf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementar os handlers do serviço.&lt;/li&gt;
&lt;li&gt;Expor o serviço como handlers HTTP.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O Connect cuida de roteamento, serialização, compressão e geração de clientes.&lt;/p&gt;

&lt;p&gt;O projeto foi criado pela &lt;a href="https://buf.build" rel="noopener noreferrer"&gt;Buf&lt;/a&gt;, a empresa por trás das ferramentas &lt;code&gt;buf&lt;/code&gt; para Protobuf, e hoje é um projeto sandbox da Cloud Native Computing Foundation (CNCF). Isso faz com que o Connect se encaixe bem em fluxos “schema-first” já usados por equipes que trabalham com Protobuf.&lt;/p&gt;

&lt;p&gt;Um servidor ConnectRPC pode falar três protocolos ao mesmo tempo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;gRPC&lt;/strong&gt;: compatibilidade com clientes gRPC, incluindo streaming e trailers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC-Web&lt;/strong&gt;: suporte para clientes gRPC-Web sem exigir um proxy separado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect&lt;/strong&gt;: protocolo HTTP próprio, mais simples de chamar de navegadores e ferramentas HTTP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na prática, isso significa que o mesmo backend pode atender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um frontend TypeScript no navegador;&lt;/li&gt;
&lt;li&gt;um serviço Go usando gRPC;&lt;/li&gt;
&lt;li&gt;uma chamada manual com &lt;code&gt;curl&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;uma ferramenta de teste de API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O problema que o Connect resolve
&lt;/h2&gt;

&lt;p&gt;gRPC é eficiente e fortemente tipado, mas depende de características que não são expostas diretamente ao JavaScript no navegador, especialmente os &lt;strong&gt;HTTP trailers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por isso, um navegador não consegue atuar como cliente gRPC nativo. A solução comum é usar gRPC-Web junto com um proxy de tradução, como Envoy, entre o frontend e o backend gRPC.&lt;/p&gt;

&lt;p&gt;Essa arquitetura funciona, mas adiciona complexidade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mais um componente para configurar;&lt;/li&gt;
&lt;li&gt;mais um ponto de falha;&lt;/li&gt;
&lt;li&gt;mais um salto de rede para depurar;&lt;/li&gt;
&lt;li&gt;mais configuração para ambientes locais, staging e produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Connect usa outra abordagem. O protocolo Connect roda sobre HTTP padrão, então chamadas unárias podem ser feitas diretamente pelo navegador ou por qualquer cliente HTTP.&lt;/p&gt;

&lt;p&gt;Você mantém:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contrato Protobuf;&lt;/li&gt;
&lt;li&gt;geração de código;&lt;/li&gt;
&lt;li&gt;tipagem forte;&lt;/li&gt;
&lt;li&gt;interoperabilidade com gRPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas remove a necessidade de proxy apenas para permitir chamadas do navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect vs gRPC vs gRPC-Web vs REST
&lt;/h2&gt;

&lt;p&gt;As quatro abordagens resolvem problemas parecidos, mas com trade-offs diferentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  gRPC
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; usa Protobuf sobre HTTP/2, com framing binário e trailers HTTP. É eficiente e suporta os quatro modos de streaming, mas não é simples de chamar diretamente de um navegador ou de um terminal.&lt;/p&gt;

&lt;p&gt;Se quiser revisar a camada de transporte, veja &lt;a href="https://apidog.com/pt/blog/grpc-http2?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como gRPC e HTTP/2 funcionam juntos&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  gRPC-Web
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;gRPC-Web&lt;/strong&gt; adapta gRPC para navegadores. Ele continua baseado em Protobuf e normalmente é usado com um proxy que traduz o tráfego para um backend gRPC nativo.&lt;/p&gt;

&lt;p&gt;Veja também: &lt;a href="https://apidog.com/pt/blog/grpc-web?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que é gRPC-Web&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connect
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Connect&lt;/strong&gt; mantém o modelo de serviço do gRPC e o contrato Protobuf, mas usa um protocolo HTTP mais simples para chamadas unárias.&lt;/p&gt;

&lt;p&gt;Uma chamada Connect pode usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP/1.1, HTTP/2 ou HTTP/3;&lt;/li&gt;
&lt;li&gt;corpo JSON ou Protobuf;&lt;/li&gt;
&lt;li&gt;status HTTP real;&lt;/li&gt;
&lt;li&gt;caminhos derivados diretamente do schema Protobuf.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso torna uma chamada Connect tão fácil de inspecionar quanto uma chamada REST.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt; é orientado a recursos e amplamente suportado. É simples de chamar, depurar e integrar, mas não exige tipagem forte nem geração de código por padrão.&lt;/p&gt;

&lt;p&gt;Se você está avaliando os dois modelos, veja &lt;a href="https://apidog.com/pt/blog/grpc-vs-rest?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;gRPC vs REST&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Resumo prático:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;gRPC&lt;/strong&gt; quando precisar de alto desempenho, streaming completo e controle entre serviços.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;gRPC-Web&lt;/strong&gt; quando já tiver um backend gRPC e precisar expô-lo para navegadores.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Connect&lt;/strong&gt; quando quiser Protobuf, geração de código e chamadas HTTP fáceis de testar.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;REST&lt;/strong&gt; quando compatibilidade universal e simplicidade forem mais importantes que contratos Protobuf.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Connect se apoia no &lt;a href="https://apidog.com/pt/blog/grpc-protobuf?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;modelo de método do Protobuf e do gRPC&lt;/a&gt;, mas evita partes que navegadores e shells não conseguem lidar bem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como uma requisição Connect funciona via HTTP
&lt;/h2&gt;

&lt;p&gt;Uma chamada unária Connect é um &lt;code&gt;POST&lt;/code&gt; HTTP comum.&lt;/p&gt;

&lt;p&gt;O caminho da URL vem do schema Protobuf no formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/&amp;lt;pacote&amp;gt;.&amp;lt;Serviço&amp;gt;/&amp;lt;Método&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por exemplo, se você tiver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pacote: &lt;code&gt;greet.v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;serviço: &lt;code&gt;GreetService&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;método: &lt;code&gt;Greet&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O endpoint será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/greet.v1.GreetService/Greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode chamar esse método com &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "Jane"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:8080/greet.v1.GreetService/Greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"greeting"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello, Jane!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não há cliente especial, proxy ou decodificação manual. Para chamadas unárias, o corpo pode ser JSON simples.&lt;/p&gt;

&lt;p&gt;O Connect suporta dois tipos de conteúdo para requisições unárias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;application/json&lt;/code&gt;: útil durante desenvolvimento e depuração.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;application/proto&lt;/code&gt;: útil quando você quer payloads binários menores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo usando Protobuf binário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/proto"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @request.bin &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:8080/greet.v1.GreetService/Greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chamadas de streaming usam tipos de conteúdo diferentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/connect+proto
application/connect+json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesses casos, cada mensagem é encapsulada em um envelope com:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;um byte de sinalização;&lt;/li&gt;
&lt;li&gt;quatro bytes de comprimento em big-endian;&lt;/li&gt;
&lt;li&gt;a mensagem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Chamadas unárias não usam esse envelope, por isso mapeiam tão bem para HTTP comum.&lt;/p&gt;

&lt;p&gt;Se estiver escolhendo entre formatos de payload, veja &lt;a href="https://apidog.com/pt/blog/protobuf-vs-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Protobuf vs JSON&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo de contrato Protobuf
&lt;/h2&gt;

&lt;p&gt;Um serviço Connect começa com um arquivo &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight protobuf"&gt;&lt;code&gt;&lt;span class="na"&gt;syntax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"proto3"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;service&lt;/span&gt; &lt;span class="n"&gt;GreetService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;rpc&lt;/span&gt; &lt;span class="n"&gt;Greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GreetRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GreetResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;GreetRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;message&lt;/span&gt; &lt;span class="nc"&gt;GreetResponse&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="na"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir desse contrato, você gera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tipos Protobuf;&lt;/li&gt;
&lt;li&gt;interfaces de servidor;&lt;/li&gt;
&lt;li&gt;clientes;&lt;/li&gt;
&lt;li&gt;handlers Connect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Geração de código com buf
&lt;/h2&gt;

&lt;p&gt;O ConnectRPC oferece implementações em várias linguagens. Go e TypeScript, para navegador e Node.js, são estáveis e prontas para produção. Swift está disponível para plataformas Apple, Kotlin para JVM e Android, e Python está em beta.&lt;/p&gt;

&lt;p&gt;A geração de código é feita com a cadeia de ferramentas &lt;code&gt;buf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em um projeto Go, você normalmente usa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;protoc-gen-go&lt;/code&gt; para mensagens Protobuf;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;protoc-gen-connect-go&lt;/code&gt; para handlers e clientes Connect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um arquivo &lt;code&gt;buf.gen.yaml&lt;/code&gt; lista os plugins usados na geração.&lt;/p&gt;

&lt;p&gt;Depois, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;buf generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado inclui estruturas tipadas e código de servidor/cliente.&lt;/p&gt;

&lt;p&gt;Em Go, o código gerado integra com &lt;code&gt;net/http&lt;/code&gt;, então um handler Connect é um handler HTTP comum. Isso permite montar endpoints Connect ao lado de rotas HTTP existentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando endpoints Connect com curl
&lt;/h2&gt;

&lt;p&gt;Como chamadas unárias Connect são HTTP simples, comece testando com &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo com JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "Jane"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:8080/greet.v1.GreetService/Greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status HTTP;&lt;/li&gt;
&lt;li&gt;corpo da resposta;&lt;/li&gt;
&lt;li&gt;headers;&lt;/li&gt;
&lt;li&gt;formato do JSON;&lt;/li&gt;
&lt;li&gt;mensagens de erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa etapa é útil para validar se o endpoint está acessível antes de integrar o cliente gerado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando e depurando Connect e gRPC com Apidog
&lt;/h2&gt;

&lt;p&gt;No &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, você pode testar uma chamada unária Connect como uma requisição HTTP.&lt;/p&gt;

&lt;p&gt;Configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;método: &lt;code&gt;POST&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;http://localhost:8080/greet.v1.GreetService/Greet&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;header: &lt;code&gt;Content-Type: application/json&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;body:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você recebe a resposta JSON e o status HTTP real, da mesma forma que faria com &lt;code&gt;curl&lt;/code&gt;, mas com interface visual, histórico e requisições salvas.&lt;/p&gt;

&lt;p&gt;Para revisar os verbos HTTP usados nesse tipo de teste, veja &lt;a href="https://apidog.com/pt/blog/http-methods?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;o que são métodos HTTP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como um servidor Connect também fala gRPC, você pode testar o lado gRPC do mesmo serviço. O Apidog suporta endpoints gRPC: importe o arquivo &lt;code&gt;.proto&lt;/code&gt;, navegue pelos métodos disponíveis e envie uma requisição tipada.&lt;/p&gt;

&lt;p&gt;Assim, uma única ferramenta cobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chamadas Connect via HTTP;&lt;/li&gt;
&lt;li&gt;chamadas gRPC nativas;&lt;/li&gt;
&lt;li&gt;depuração manual;&lt;/li&gt;
&lt;li&gt;cenários de teste salvos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se o foco for gRPC, veja &lt;a href="https://apidog.com/pt/blog/test-grpc-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;como testar APIs gRPC de forma eficiente&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatizando testes em CI
&lt;/h2&gt;

&lt;p&gt;Depois que as chamadas estiverem funcionando, mova os testes para execução automatizada.&lt;/p&gt;

&lt;p&gt;Instale o Apidog CLI com Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute um cenário ou suíte salvo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenarioOrSuiteId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;environmentId&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; cli,html,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O CLI roda em modo headless e pode ser usado em pipelines de CI que executam Node.&lt;/p&gt;

&lt;p&gt;Use esse fluxo para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validar regressões em endpoints Connect;&lt;/li&gt;
&lt;li&gt;testar métodos gRPC;&lt;/li&gt;
&lt;li&gt;gerar relatórios em HTML ou JUnit;&lt;/li&gt;
&lt;li&gt;bloquear deploys quando cenários críticos falharem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para um passo a passo completo, veja o &lt;a href="https://apidog.com/pt/blog/apidog-cli-test-rest-api-command-line?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial do Apidog CLI para testar uma API pela linha de comando&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist de implementação
&lt;/h2&gt;

&lt;p&gt;Use este roteiro ao adotar ConnectRPC em um serviço:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Defina o contrato em &lt;code&gt;.proto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;buf&lt;/code&gt; e os plugins da linguagem usada.&lt;/li&gt;
&lt;li&gt;Rode &lt;code&gt;buf generate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implemente os handlers gerados.&lt;/li&gt;
&lt;li&gt;Registre os handlers no servidor HTTP.&lt;/li&gt;
&lt;li&gt;Teste uma chamada unária com &lt;code&gt;curl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Teste a mesma chamada em uma ferramenta de API.&lt;/li&gt;
&lt;li&gt;Se necessário, valide também o lado gRPC importando o &lt;code&gt;.proto&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Salve cenários de teste.&lt;/li&gt;
&lt;li&gt;Execute os testes em CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ConnectRPC é o mesmo que gRPC?
&lt;/h3&gt;

&lt;p&gt;Não. ConnectRPC é um framework que implementa três protocolos: gRPC, gRPC-Web e Connect.&lt;/p&gt;

&lt;p&gt;Um servidor Connect pode interoperar com clientes e servidores gRPC, mas o protocolo Connect é um protocolo HTTP separado, projetado para ser chamado diretamente por navegadores e ferramentas HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ainda preciso de um proxy como Envoy para alcançar um navegador?
&lt;/h3&gt;

&lt;p&gt;Não para o protocolo Connect.&lt;/p&gt;

&lt;p&gt;O Connect funciona sobre HTTP padrão, então um navegador pode chamar um servidor Connect sem proxy de tradução. Você só precisa de um proxy como Envoy se estiver fazendo a ponte entre tráfego de navegador e um backend que fala apenas gRPC nativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais linguagens o ConnectRPC suporta?
&lt;/h3&gt;

&lt;p&gt;Go e TypeScript, para navegador e Node.js, são estáveis e prontas para produção. Swift, Kotlin e Python também estão disponíveis, com Python em beta.&lt;/p&gt;

&lt;p&gt;Todas elas geram código a partir do mesmo schema Protobuf.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual é a relação entre Connect e buf?
&lt;/h3&gt;

&lt;p&gt;ConnectRPC foi criado pela Buf e usa a cadeia de ferramentas &lt;code&gt;buf&lt;/code&gt; para geração de código.&lt;/p&gt;

&lt;p&gt;Você executa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;buf generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;com plugins como &lt;code&gt;protoc-gen-connect-go&lt;/code&gt; para gerar handlers e clientes a partir dos arquivos &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Posso testar um endpoint Connect com um cliente de API normal?
&lt;/h3&gt;

&lt;p&gt;Sim. Chamadas unárias Connect são requisições HTTP &lt;code&gt;POST&lt;/code&gt; com corpo JSON ou Protobuf e status HTTP real.&lt;/p&gt;

&lt;p&gt;Você pode usar &lt;code&gt;curl&lt;/code&gt;, Apidog ou qualquer cliente HTTP. O Apidog também pode testar o lado gRPC do mesmo servidor importando o arquivo &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
