<?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: Angel Hadjiev</title>
    <description>The latest articles on DEV Community by Angel Hadjiev (@angel_hadjiev_4a).</description>
    <link>https://dev.to/angel_hadjiev_4a</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%2F4015049%2Fe6f2f234-4788-45b1-b63b-70dd399f89b0.jpg</url>
      <title>DEV Community: Angel Hadjiev</title>
      <link>https://dev.to/angel_hadjiev_4a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/angel_hadjiev_4a"/>
    <language>en</language>
    <item>
      <title>Cloudflare's Precursor</title>
      <dc:creator>Angel Hadjiev</dc:creator>
      <pubDate>Wed, 15 Jul 2026 13:54:52 +0000</pubDate>
      <link>https://dev.to/angel_hadjiev_4a/cloudflares-precursor-2g3p</link>
      <guid>https://dev.to/angel_hadjiev_4a/cloudflares-precursor-2g3p</guid>
      <description>&lt;p&gt;Cloudflare just shipped Precursor, and it effectively kills the oldest trick in web scraping.&lt;/p&gt;

&lt;p&gt;It stops judging just the landing request and starts scoring the whole session behaviourally like mouse arcs, keystroke timing, human hand tremors.&lt;/p&gt;

&lt;p&gt;The bot score now follows the session. Refreshing, rotating identity, and starting over doesn't reset a thing.&lt;/p&gt;

&lt;p&gt;Proxy rotation and header fuzzing were built for a world where the unit of detection was a single request. Whereas now, the defenders are looking at 5-minute behavioural coherence.&lt;/p&gt;

&lt;p&gt;The real question isn't whether detection evolves. It's whether your stack is still thinking in requests.&lt;/p&gt;

</description>
      <category>webdata</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Not being charged for 403s</title>
      <dc:creator>Angel Hadjiev</dc:creator>
      <pubDate>Mon, 06 Jul 2026 13:25:49 +0000</pubDate>
      <link>https://dev.to/angel_hadjiev_4a/not-being-charged-for-403s-15ld</link>
      <guid>https://dev.to/angel_hadjiev_4a/not-being-charged-for-403s-15ld</guid>
      <description>&lt;p&gt;&lt;strong&gt;Starting off with a full disclosure&lt;/strong&gt;: I’m not an engineer. Together with my friend - Chapa - we run FourA, a data harvesting infrastructure via a single API. This is a founder’s post; if you wanted a deep dive into code — ping the one, wearing the CTO hat ;]. I ramble on about a pricing bottleneck developers kept complaining to me about, so I wanted to share how we dealt with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The thing that bugged us&lt;/strong&gt;&lt;br&gt;
Almost every scraping and data API bills you per request. You send a request, you pay for it. What actually comes back doesn't seem to matter to the invoice. &lt;/p&gt;

&lt;p&gt;That means you pay for the 403 Forbidden. You pay for the Cloudflare challenge page. You pay for the empty body when a target site quietly serves you absolutely nothing. You even pay for the proxy that echoes your own request back as a fake response. Okay, maybe you're just the dev guy and the CDO/CTO pushes the invoice to the CFO, but that's beyond the point.&lt;/p&gt;

&lt;p&gt;At low volumes, you don't really notice. At scale, a massive chunk of your bill is just dead weight—money spent on requests that yielded zero data. Ironically, the harder a target site fights back, the more you end up paying the scraping vendor to get blocked. The pricing model literally rewards the vendor when the product fails you.&lt;/p&gt;

&lt;p&gt;That felt completely backwards to us. So we decided to change it: you should only pay when you get what you actually asked for. A failed request shouldn't be your financial problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why "just don't bill failures" is a trap&lt;/strong&gt;&lt;br&gt;
It sounds incredibly simple on a landing page; as a slogan. In production, it’s a nightmare because "success" is highly subjective.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The naive assumption is that success equals an HTTP 200 OK. It doesn't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plenty of scraping pipelines legitimately need to record a 404 or 410 to know a product or page is gone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some APIs return a 202 or a redirect that contains the actual data you want.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversely, plenty of anti-bot walls will happily return a 200 OK status code while serving you a page that just says "Please prove you are human." Technically it's a success; actually, it's garbage.&lt;/p&gt;

&lt;p&gt;If we just threw a naive status &lt;code&gt;== 200 ? bill : don't_bill&lt;/code&gt; rule into our system, we’d penalise people who need non-200 responses, while still charging users for 200-coded junk.&lt;/p&gt;

&lt;p&gt;Our fix: We shifted the definition of success to the user. Now, you send validation rules right along with your request—the status codes you accept, strings that must be present in the HTML, etc. If the response matches your criteria, it’s a success and it bills. If it doesn’t, it’s a failure and it’s free.&lt;/p&gt;

&lt;p&gt;Now, a 404 you asked for counts, and a 200 CAPTCHA wall you didn't ask for doesn't. You draw the line, and the bill follows it.&lt;/p&gt;

&lt;p&gt;As the non-technical person in the room, I walked away with two main takeaways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The honest version of a feature is always the hardest one to build. &lt;em&gt;"We don't charge for failures"&lt;/em&gt; is a great hook. But making it true meant building a validation engine so customers could define failure themselves. It’s way more complex than a clean marketing slogan, but the simple version would have been an accidental lie for half our users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop guessing, start looking at the logs. Instead of guessing what developers wanted, we shipped the validation feature, looked at our actual internal billing feeds, and iterated based on how data was flowing. (Spoiler: our first version missed a ton of edge cases, which is the part nobody puts on a launch page).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Would love to engage the audience, that can speak from experience. If you run data pipelines at scale: how much of your current scraping bill is spent on responses your parsers just throw away? &lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>startup</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Our scraping API is free for everyone through July (no card, no catch - rate limits apply)</title>
      <dc:creator>Angel Hadjiev</dc:creator>
      <pubDate>Sat, 04 Jul 2026 12:42:21 +0000</pubDate>
      <link>https://dev.to/angel_hadjiev_4a/our-scraping-api-is-free-for-everyone-through-july-no-card-no-catch-rate-limits-apply-3425</link>
      <guid>https://dev.to/angel_hadjiev_4a/our-scraping-api-is-free-for-everyone-through-july-no-card-no-catch-rate-limits-apply-3425</guid>
      <description>&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%2Fsoer7rot6wd63wf6a7av.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%2Fsoer7rot6wd63wf6a7av.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today America turns 250. We're a two-person web-scraping infrastructure company from the EU called 4A — and with a name like that, the promo wrote itself:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The FourA API is free for everyone through July 31.&lt;/strong&gt; Sign up, grab an API key, use it. No card, no invoice, nothing to cancel in August.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;One API call, any website: smart proxy rotation, anti-bot/TLS handling (curl-impersonate under the hood), and full browser rendering when a page needs JavaScript. Normally credits only burn on &lt;em&gt;successful&lt;/em&gt; requests — failed fetches cost nothing. This month they don't burn at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch, stated plainly
&lt;/h2&gt;

&lt;p&gt;Rate limits and concurrency caps stay on — unlimited credits, not unlimited parallelism. That's the whole catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why free
&lt;/h2&gt;

&lt;p&gt;We'd rather spend July's marketing budget on your bandwidth than on ads. If the API earns a place in your stack, paid plans exist when the month's over; if not, you got a month of free scraping and we got feedback.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://foura.ai/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=america250" rel="noopener noreferrer"&gt;Get a key (~2 min)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy 4th to our American friends! Questions about targets, anti-bot, or scale — ask in the comments or directly here: &lt;a href="mailto:support@foura.ai"&gt;support@foura.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdata</category>
      <category>webscraping</category>
      <category>proxy</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
