This guide covers fundamental troubleshooting techniques for ZenRows. Whether you’re just getting started, encountering unexpected errors or noticing the success rate dropping, these tips will help you resolve common issues quickly.
When a target website returns an error, ZenRows handles it and returns a successful response by default. However, you can retrieve the original status code for debugging purposes:
This helps you identify if the target site is returning errors like 403 Forbidden or 429 Too Many Requests.
original_status
parameter in the Original HTTP Code documentation.You can allow specific HTTP status codes to pass as successful responses. It helps examine error pages or handle specific status codes in your application.
With this parameter, even if the target returns a 404 Not Found or 500 Server Error, ZenRows will process the response and return it as a 200 OK. This is particularly useful when:
The allowed_status_codes
parameter accepts a comma-separated list of HTTP status codes that should be processed and returned as successful responses.
allowed_status_codes
parameter in the Return content on error documentation.The wait_for
parameter is critical when scraping dynamic content, but it can be tricky to use correctly, especially with edge cases like empty results. You can specify multiple CSS selectors using standard CSS syntax:
This ensures your request completes when the expected content appears OR when a “no results” indicator is displayed, avoiding unnecessary timeouts.
Before using CSS selectors in your scraping code, test them directly in the browser console to verify they work across different page states:
This simple check can save hours of debugging complex scraping issues.
This error status code indicates you’ve reached your concurrency limit. Solutions include:
concurrency-remaining
response headerThis happens when the response exceeds your plan’s size limits. Solutions include:
css_extractor
json_response
option can increase payload size, especially when internal API calls are captured. Disable it if not needed.This typically means anti-bot protection is blocking access. Solutions include:
js_render: true
to mimic real browser behavior.premium_proxy: true
to route traffic through residential IPs.'proxy_country': 'us'
or another region where the website is accessible.wait_for
or wait
parameters to ensure dynamic content has fully rendered, especially on slower sites.referer: 'https://www.google.com/'
to mimic typical browser behavior.js_render
, switching proxy regions, or using premium_proxy: true
typically resolves this.If you’re still encountering issues after applying the steps above, ZenRows’ support team is ready to help.
Prepare Request Details
Include Debug Information
x-request-id
response headerContact Support
The ZenRows team will help you optimize your scraping strategy and resolve any technical challenges you’re facing.
This guide covers fundamental troubleshooting techniques for ZenRows. Whether you’re just getting started, encountering unexpected errors or noticing the success rate dropping, these tips will help you resolve common issues quickly.
When a target website returns an error, ZenRows handles it and returns a successful response by default. However, you can retrieve the original status code for debugging purposes:
This helps you identify if the target site is returning errors like 403 Forbidden or 429 Too Many Requests.
original_status
parameter in the Original HTTP Code documentation.You can allow specific HTTP status codes to pass as successful responses. It helps examine error pages or handle specific status codes in your application.
With this parameter, even if the target returns a 404 Not Found or 500 Server Error, ZenRows will process the response and return it as a 200 OK. This is particularly useful when:
The allowed_status_codes
parameter accepts a comma-separated list of HTTP status codes that should be processed and returned as successful responses.
allowed_status_codes
parameter in the Return content on error documentation.The wait_for
parameter is critical when scraping dynamic content, but it can be tricky to use correctly, especially with edge cases like empty results. You can specify multiple CSS selectors using standard CSS syntax:
This ensures your request completes when the expected content appears OR when a “no results” indicator is displayed, avoiding unnecessary timeouts.
Before using CSS selectors in your scraping code, test them directly in the browser console to verify they work across different page states:
This simple check can save hours of debugging complex scraping issues.
This error status code indicates you’ve reached your concurrency limit. Solutions include:
concurrency-remaining
response headerThis happens when the response exceeds your plan’s size limits. Solutions include:
css_extractor
json_response
option can increase payload size, especially when internal API calls are captured. Disable it if not needed.This typically means anti-bot protection is blocking access. Solutions include:
js_render: true
to mimic real browser behavior.premium_proxy: true
to route traffic through residential IPs.'proxy_country': 'us'
or another region where the website is accessible.wait_for
or wait
parameters to ensure dynamic content has fully rendered, especially on slower sites.referer: 'https://www.google.com/'
to mimic typical browser behavior.js_render
, switching proxy regions, or using premium_proxy: true
typically resolves this.If you’re still encountering issues after applying the steps above, ZenRows’ support team is ready to help.
Prepare Request Details
Include Debug Information
x-request-id
response headerContact Support
The ZenRows team will help you optimize your scraping strategy and resolve any technical challenges you’re facing.