<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Mehmetcan Şahin - flaresolverr</title>
      <link>https://mehmetcansahin.com</link>
      <description>Software engineering notes by Mehmetcan Şahin on web, mobile, DevOps, and practical development workflows.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://mehmetcansahin.com/tags/flaresolverr/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 08 Oct 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Camouflare: Moving from FlareSolverr to Camoufox</title>
          <pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate>
          <author>Mehmetcan Şahin</author>
          <link>https://mehmetcansahin.com/blog/camouflare-moving-from-flaresolverr-to-camoufox/</link>
          <guid>https://mehmetcansahin.com/blog/camouflare-moving-from-flaresolverr-to-camoufox/</guid>
          <description xml:base="https://mehmetcansahin.com/blog/camouflare-moving-from-flaresolverr-to-camoufox/">&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;camouflare-cover.png&quot; alt=&quot;Camouflare: Moving from FlareSolverr to Camoufox&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When I started collecting data from the web, I tried FlareSolverr, one of the more popular options. I developed Camouflare to address the speed and stability problems I ran into.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-camoufox&quot;&gt;Why Camoufox?&lt;&#x2F;h2&gt;
&lt;p&gt;First, let&#x27;s look at how FlareSolverr works. It runs Chrome&#x2F;Chromium using Selenium and &lt;code&gt;undetected-chromedriver&lt;&#x2F;code&gt;. Without a persistent session, each request starts a new browser. Sending several requests at once increases memory usage, and you also have to wait for the browser to start each time. The project&#x27;s documentation recommends limiting concurrent requests on machines with little RAM. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FlareSolverr&#x2F;FlareSolverr#how-it-works&quot;&gt;FlareSolverr documentation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Besides resource usage, requests can get stuck on verification steps and time out. Users have reported these problems in the project&#x27;s issues. Those reports relate to specific versions and setups, but they show some of the problems that lead people to look for alternatives. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;FlareSolverr&#x2F;FlareSolverr&#x2F;issues&#x2F;1741&quot;&gt;Example issue&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Camoufox is a Firefox-based browser built for web scraping. It removes unnecessary components to optimize memory usage and startup time. It also makes changes at the browser level to handle fingerprinting and automation detection. These features were a better fit for what I needed. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;daijro&#x2F;camoufox#introduction&quot;&gt;Camoufox&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Byparr was another project built for this purpose, but it didn&#x27;t work reliably in my setup either. So I started building my own solution that keeps the FlareSolverr API and uses Camoufox underneath.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-does-camouflare-work&quot;&gt;How does Camouflare work?&lt;&#x2F;h2&gt;
&lt;p&gt;Like FlareSolverr, Camouflare accepts requests through &lt;code&gt;&#x2F;v1&lt;&#x2F;code&gt;. It supports GET, POST, and commands to create, list, and delete sessions. You can retrieve a page&#x27;s HTML and cookies for use in your own application. Extracting the data you need from that HTML is still your responsibility.&lt;&#x2F;p&gt;
&lt;p&gt;On the browser side, a small pool keeps browsers ready to use. Requests use these browsers instead of starting a new one every time. With the default configuration, the pool can grow to two browsers, each running one browser context at a time.&lt;&#x2F;p&gt;
&lt;p&gt;Requests without a session run in separate contexts. If you want to reuse a session across requests, you can create a persistent session. Its cookies and browser state are then preserved.&lt;&#x2F;p&gt;
&lt;p&gt;When the pool is full, new requests wait for an available slot within a configured timeout. Browsers are also replaced when they reach their usage or age limits. You can adjust the number of browsers and the waiting times to suit your workload. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mehmetcansahin&#x2F;camouflare&#x2F;blob&#x2F;main&#x2F;docs&#x2F;deployment.md&quot;&gt;Configuration details&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You can watch the Camouflare introduction video below:&lt;&#x2F;p&gt;
&lt;div style=&quot;aspect-ratio: 16 &#x2F; 9; width: 100%;&quot;&gt;
  &lt;iframe
    src=&quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&#x2F;embed&#x2F;oEZkk81Et4w&quot;
    title=&quot;Camouflare introduction video&quot;
    style=&quot;width: 100%; height: 100%; border: 0;&quot;
    loading=&quot;lazy&quot;
    allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
    referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
    allowfullscreen&gt;
  &lt;&#x2F;iframe&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;installation-and-usage&quot;&gt;Installation and usage&lt;&#x2F;h2&gt;
&lt;p&gt;You can run Camouflare directly using its Docker image. First, create an API token and start the service:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span&gt; CAMOUFLARE_API_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rand&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 32&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-detach&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; camouflare&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 127.0.0.1:8191:8191&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; CAMOUFLARE_API_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-shm-size&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 2g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-stop-timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 45&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  mehmetcansahin&#x2F;camouflare:2.0.2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You need to send this token with your requests. You can check whether the service is ready through &lt;code&gt;&#x2F;ready&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-fail&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;127.0.0.1:8191&#x2F;ready&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Authorization: Bearer &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;CAMOUFLARE_API_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once the service is ready, let&#x27;s send an example GET request:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-request&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; POST&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;127.0.0.1:8191&#x2F;v1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Content-Type: application&#x2F;json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Authorization: Bearer &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;CAMOUFLARE_API_TOKEN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;cmd&amp;quot;: &amp;quot;request.get&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;url&amp;quot;: &amp;quot;https:&#x2F;&#x2F;example.com&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;maxTimeout&amp;quot;: 60000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this example, &lt;code&gt;request.get&lt;&#x2F;code&gt; opens the specified page. &lt;code&gt;maxTimeout&lt;&#x2F;code&gt; sets the overall time budget for the request to 60 seconds. If the request succeeds, you can read the HTML from &lt;code&gt;solution.response&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;captcha-support&quot;&gt;CAPTCHA support&lt;&#x2F;h2&gt;
&lt;p&gt;Camouflare also includes an integrated solver that uses the ClickSolver component from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;playwright-captcha&#x2F;&quot;&gt;playwright-captcha&lt;&#x2F;a&gt;. It attempts to complete the click steps on Cloudflare verification pages opened in the browser. Success depends on the challenge and the target site.&lt;&#x2F;p&gt;
&lt;p&gt;This feature is disabled by default. To enable it, add the following option to the &lt;code&gt;docker run&lt;&#x2F;code&gt; command above:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;--env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; CHALLENGE_SOLVER=click&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;moving-from-flaresolverr&quot;&gt;Moving from FlareSolverr&lt;&#x2F;h2&gt;
&lt;p&gt;If your application already uses the FlareSolverr API, you can continue using the commands Camouflare supports. Your client needs to be able to send the API token.&lt;&#x2F;p&gt;
&lt;p&gt;There are some compatibility differences. For example, &lt;code&gt;download&lt;&#x2F;code&gt;, &lt;code&gt;returnRawHtml&lt;&#x2F;code&gt;, and &lt;code&gt;tabs_till_verify&lt;&#x2F;code&gt; are accepted but ignored. If you use these fields, I recommend reading the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mehmetcansahin&#x2F;camouflare#flaresolverr-compatibility&quot;&gt;compatibility section&lt;&#x2F;a&gt; before switching.&lt;&#x2F;p&gt;
&lt;p&gt;I designed Camouflare to run with a single trusted user and one application worker. This is a design choice. Sessions and the browser pool are kept within the process and aren&#x27;t shared between workers. If you want to support multiple users or run multiple instances, you need to use separate containers and manage request routing yourself. Requests belonging to the same session also need to reach the same instance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;monitoring-the-service&quot;&gt;Monitoring the service&lt;&#x2F;h2&gt;
&lt;p&gt;A running service doesn&#x27;t necessarily mean its browsers are ready to handle requests. &lt;code&gt;&#x2F;health&lt;&#x2F;code&gt; checks whether the application is running, while &lt;code&gt;&#x2F;ready&lt;&#x2F;code&gt; checks whether the browser infrastructure is ready.&lt;&#x2F;p&gt;
&lt;p&gt;You can use &lt;code&gt;&#x2F;diagnostics&lt;&#x2F;code&gt; to inspect the pool and session state. Prometheus metrics are also available. Error responses help you distinguish between insufficient capacity, timeouts, and closed browser connections.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
