Skip to main content
The ZenRows SDKs are lightweight, official clients for the Universal Scraper API. Each one wraps the same https://api.zenrows.com/v1 endpoint, adding authentication, retries, and concurrency control so you write less boilerplate and spend more time on what you’re actually building.
All three SDKs are open source and MIT licensed. You can inspect the source, report bugs, or contribute on GitHub.

Pick your language

Python

Built on requests. Returns requests.Response. Supports async/await via asyncio. GET, POST, and PUT.

Node.js

Built on native fetch. Returns a standard Response. Every method is already a Promise. GET and POST.

Go

Built on net/http via go-resty. Typed RequestParameters struct. Takes context.Context. GET, POST, and PUT.

What every SDK gives you

All three SDKs share the same core behavior. You set your API key once in the client constructor, and every call handles the rest.
Your API key is passed once to the client constructor. Every subsequent request is authenticated automatically; you never repeat it per call.
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
Retries are off by default (0). Set a retry count in the constructor and the SDK retries failed requests with exponential backoff automatically. Only successful responses are billed; failed retries are free.
client = ZenRowsClient("YOUR_ZENROWS_API_KEY", retries=2)
Retries on: 422, 429, 500, 502, 503, 504
The retry status code list differs between SDKs. If you need consistent retry behavior across languages, check each SDK’s Error Handling and Retries page for the exact list.
All three SDKs cap parallel requests via an internal queue or semaphore. The default concurrency limit is 5. Set it to match your ZenRows plan.
client = ZenRowsClient("YOUR_ZENROWS_API_KEY", concurrency=5)
Each client instance enforces its own concurrency limit. Two scripts using the same API key don’t share limits, so running both at once can trigger 429 Too Many Requests errors. See the Concurrency guide for plan-level limits.
Every Universal Scraper API parameter (js_render, premium_proxy, css_extractor, and so on) is available through each SDK. Only the syntax differs.
response = client.get(url, params={
    "js_render": True,
    "premium_proxy": True,
    "proxy_country": "us",
})
For the full parameter list, see the Universal Scraper API setup guide.
Every response includes ZenRows monitoring headers. The two most useful for tracking usage are:
HeaderContains
X-Request-CostDollar cost of the request (e.g. 0.001)
X-Request-CreditsNumber of credits consumed
X-Request-IdUnique request ID. Include this when contacting support
Concurrency-RemainingConcurrency slots remaining on your plan
Zr-Final-UrlFinal URL after any redirects
Headers from the target website are prefixed with Zr- to avoid collisions with ZenRows’ own headers.

SDK comparison

All SDKs target the same Universal Scraper API endpoint. The differences below are language-level constraints, not API-level ones.
FeaturePythonNode.jsGo
Installpip install zenrowsnpm install zenrowsgo get github.com/zenrows/zenrows-go-sdk/service/api
Min versionPython 3.6+Node.js 20+Go 1.23+
Response typerequests.ResponseFetch Response*scraperapi.Response
GETYesYesYes
POSTYesYesYes
PUTYesNo (use raw fetch)Yes
Async / parallelget_async + asyncioEvery method is a PromiseGoroutines + semaphore
Default concurrency555
Retried status codes422, 429, 500, 502, 503, 504422, 503, 504422, 429, 500
Typed parametersNo (dict / object)No (dict / object)Yes (RequestParameters struct)
GitHubzenrows-python-sdkzenrows-node-sdkzenrows-go-sdk

Pricing

Cost is determined by the parameters you send per request, not by which SDK you use. Retried attempts that fail are not billed.
ConfigurationCost multiplier vs. basic
Basic request1x
js_render=True / js_render: true / JSRender: true5x
premium_proxy=True / premium_proxy: true / UsePremiumProxies: true10x
JS render + Premium Proxy25x
See ZenRows Pricing for plan-specific rates and concurrency limits.

Get started

1

Pick your SDK

Choose the SDK that matches your language. All three share the same API key and request parameters.
2

Install it

Follow the installation guide for your language: Python, Node.js, or Go.
3

Make your first request

Each SDK has a quickstart that gets you to a working response in under 10 lines of code: Python, Node.js, Go.
4

Scale up

Once the basics work, add retries and concurrency to match your production requirements. Each SDK’s Error Handling and Concurrency pages walk through the options.

Need help?

Check the API Error Codes reference for error details, or contact support with your X-Request-Id header value for faster triage.