Skip to content
Proxy · Use case

Replace rotating proxies with an API that picks the route

A rotating proxy API sells you exits; you still have to run the browser, notice the block, choose the next IP and decide when a site deserves a residential one. A scraping API with built-in proxies moves those decisions to the other side of the request. On Pro plans, Microlink routes blocked requests through its proxy tiers automatically and learns per domain which route works, so your code asks for a page and gets the page.

The problem

A rotating proxy gives you IP addresses, not pages

Proxy rotation for scraping starts simple: point the HTTP client at a gateway and let it hand out a new exit per request. Then a target serves a challenge on a 200, another only lets residential traffic through, a third works on datacenter IPs and does not need the slower route at all. The rotation layer cannot see any of that, because it moves bytes and never looks at the page.

So the logic lands in your scraper: detect the block, pick a pool, retry, remember which domains needed what, and keep a headless browser running for the sites that render in JavaScript. Every new target is a small research project, and the knowledge of what works where lives in code you maintain or in someone’s head.

Microlink puts the proxy behind the request instead of in front of it. On Pro plans, a request that hits a 403 antibot wall escalates through the proxy tiers, with residential IPs as the last one: the slowest, and the one that usually gets through. The tier that worked is cached per domain, so later requests go straight to it. Browser rendering, retries and caching come in the same call.

How it works

How to scrape without managing proxy rotation

Drop the proxy gateway from your client and call the API with a Pro key. What remains is reading which domains took the proxy route, and pinning a country where it matters. The proxy guide lists the headers involved.

1 · Fetch a list of targets, no proxy config
import createClient from 'microlink.io'

const microlink = createClient({
  apiKey: process.env.MICROLINK_API_KEY
})

const urls = [
  'https://news.example.com/story',
  'https://shop.example.com/item/42',
  'https://docs.example.com/guide'
]

for (const url of urls) {
  const markdown = await microlink.markdown(url, { ttl: '1d' })
  const mode = microlink.last.response.headers.get('x-fetch-mode')
  console.log(new URL(url).hostname, mode, markdown.length)
}

Each call resolves to the page as Markdown. x-fetch-mode ends in -proxy for the domains that needed the proxy route and not for the rest, so the log shows which targets are protected without any detection code on your side.

2 · Pin a country only where it matters
import createClient from 'microlink.io'

const microlink = createClient({
  apiKey: process.env.MICROLINK_API_KEY
})

const markdown = await microlink.markdown('https://shop.example.co.uk/item/42', {
  proxy: { location: 'gb' }
})

proxy.location is the one routing decision left to you: a two-letter country code for sites that serve regional content. Everything else about the route stays automatic.

3 · The same request as a URL
curl 'https://pro.microlink.io/?url=https%3A%2F%2Fshop.example.com%2Fitem%2F42&data.markdown.attr=markdown&meta=false&ttl=1d' \
  -H 'x-api-key: $MICROLINK_API_KEY'

Call the Pro endpoint with your x-api-key header. There is no proxy parameter and no gateway URL: automatic resolution is the default on Pro.

Parameters used
  • proxy Automatic on Pro. Set it only to pin a country or to use your own proxy server.
  • proxy.location ISO 3166-1 alpha-2 country code for the exit, case-insensitive. Default us.
  • ttl Caches each page from 1 minute to 31 days so repeat reads skip the fetch. Pro plans.
  • retry Server-side retries with exponential backoff. Default 2.

x-fetch-mode is informational: a value like prerender-proxy needs no change to your request. If you already pay for a provider you must keep, bring your own proxy with proxy.url instead.

Why it works

Why built-in proxy tiers beat a rotating proxy pool

Rotation is a means. What a scraper needs is the right route for each site, found once and reused. That takes a system that sees the response, not just the connection.

01 · Escalates on evidence
Residential only when a site demands it.
Requests start on the fast route and climb the proxy tiers only when an antibot wall answers with a 403. Sites that never block you never pay the latency of the slowest tier.

Detection is one of the first checks in the request flow, as the antibot feature page describes.

02 · Memory per domain
The second request skips the search.
Once a tier works for a domain, that choice is cached, so later requests to the same site go straight to the route that works instead of rediscovering it on every call.

Combined with the response cache, where hits never count toward your quota, a crawler that revisits a site pays for neither the search nor the fetch.

03 · Priced by request
No bandwidth meter, no separate proxy bill.
Plans are sold as requests per month, starting with Pro at €39 for 46,000, and automatic proxy resolution is included in every paid plan. There are no gigabytes to track per pool.

When not to: if a contract requires a specific proxy provider, or you only need raw HTTP through many IPs with no browser at all, a proxy service fits better. For the first case, route through your own proxy. Plans are on the pricing page.

FAQ

What is a good alternative to a rotating proxy API for scraping?

A scraping API with built-in proxies, where the service decides when a request needs a proxy and which kind. On Microlink Pro plans that decision is automatic: blocked requests escalate through proxy tiers up to residential IPs, and the result comes back as a screenshot, PDF, Markdown or extracted data.

Does the scraping API use residential proxies?

Yes, as the last tier. A request that hits a 403 antibot wall escalates through the proxy tiers and ends on residential IPs, the slowest route and the one that usually gets through. Faster tiers are tried first.

How do I see which domains needed the proxy route?

Read the x-fetch-mode response header. Values that end in -proxy, such as prerender-proxy or fetch-proxy, mean the request went through the proxy; the SDK exposes it on microlink.last.response.headers. Logging it per hostname gives you a map of your protected targets.

Can I still choose the exit country without a proxy pool?

Yes. Pass proxy.location with a two-letter ISO country code; 181 countries are supported and the default is us. The rest of the routing stays automatic.

Do I need to enable the proxy on every scraping request?

No. On Pro plans automatic proxy resolution is on by default, so requests only take the proxy route when a site blocks them. The proxy parameter is only for pinning a country or passing your own proxy URL.
Related use cases

Solve the next problem with the same API

Scrape Cloudflare-protected websites

Get the real page instead of “Just a moment”: on Pro plans, blocked requests escalate through proxy tiers up to residential IPs.

Bring your own proxy

Pass your authenticated proxy URL per request and every redirect, asset and fetch of the page goes through it.

Fix 403 and 429 scraping errors

Tell an antibot 403, a throttling 429 and your own quota apart, then route, cache or wait accordingly.

Fetch geo-blocked websites

Route any request through one of 181 countries with a two-letter code, and verify the exit before you trust the page.

Screenshot blocked websites

When a site blocks headless browsers, a Pro key escalates the capture through proxy tiers automatically.

Markdown from bot-protected pages

Convert pages behind Cloudflare, DataDome or Akamai: on a Pro key the built-in proxy resolves automatically.

Ready to retire your proxy rotation code?

Ask for the page, get the page. Proxy tiers, residential escalation and per-domain memory are included in Pro.