> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zenrows.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Frequently Asked Questions

> Answers to common questions about the ZenRows Node.js SDK.

### Setup and compatibility

<AccordionGroup>
  <Accordion title="What Node.js versions does the SDK support?">
    Node.js 20 and later, per the package's `engines` field. The SDK has two dependencies, `fastq` and `fetch-retry`, installed automatically with `npm install zenrows`.
  </Accordion>

  <Accordion title="Does the SDK work with both CommonJS and ES modules?">
    Yes. `package.json` exposes both a CommonJS build (`require("zenrows")`) and an ES module build (`import { ZenRows } from "zenrows"`), plus TypeScript types.
  </Accordion>

  <Accordion title="Does the SDK support Proxy Mode?">
    No. The SDK talks to the Universal Scraper API's endpoint directly (API Mode). If you want to use ZenRows as a proxy in your own HTTP client instead, see the [Proxy Mode documentation](/universal-scraper-api/universal-scraper-api-setup#connection-modes) rather than the SDK.
  </Accordion>
</AccordionGroup>

### Requests, errors, and concurrency

<AccordionGroup>
  <Accordion title="Does the SDK support PUT or DELETE requests?">
    No. Only `get()` and `post()` are exposed. See [Sending a PUT request](/universal-scraper-api/sdk/nodejs/post-put-requests#sending-a-put-request) for a workaround using native `fetch`.
  </Accordion>

  <Accordion title="Why isn't my request throwing an exception on failure?">
    By design, the SDK resolves with the `Response` object even for non-2xx status codes, matching native `fetch` behavior. Check `response.ok` or `response.status` yourself. See [Error Handling and Retries](/universal-scraper-api/sdk/nodejs/error-handling-and-retries).
  </Accordion>

  <Accordion title="Why doesn't a 429 get retried automatically?">
    The Node.js SDK's built-in retry logic only covers `422`, `503`, `504`, and network errors, not `429` or `500`/`502`. Lower your `concurrency` or add your own backoff for rate-limit errors. See [Concurrency](/universal-scraper-api/sdk/nodejs/async-concurrency).
  </Accordion>

  <Accordion title="Can two scripts share the same concurrency limit?">
    No. Each `ZenRows` instance enforces its own `concurrency` setting independently. Running two scripts (or two client instances) at the same time can exceed your plan's actual limit and trigger `429 Too Many Requests` errors. Coordinate concurrency across processes yourself if you run multiple scripts against the same ZenRows plan.
  </Accordion>
</AccordionGroup>

### Project and support

<AccordionGroup>
  <Accordion title="Is there a Python version of the SDK?">
    Yes. See the <a href="https://pypi.org/project/zenrows/" target="_blank" rel="noopener noreferrer nofollow">ZenRows Python SDK</a> on PyPI, which additionally supports `put()` and explicit async methods.
  </Accordion>

  <Accordion title="Where can I see the SDK's source code or report a bug?">
    The SDK is open source on <a href="https://github.com/ZenRows/zenrows-node-sdk" target="_blank" rel="noopener noreferrer nofollow">GitHub</a>. Open an issue there for bugs, or a pull request if you'd like to contribute.
  </Accordion>

  <Accordion title="What license is the SDK released under?">
    MIT. You can use, modify, and distribute it freely; see the <a href="https://github.com/ZenRows/zenrows-node-sdk/blob/main/LICENSE" target="_blank" rel="noopener noreferrer nofollow">LICENSE</a> file in the repository.
  </Accordion>
</AccordionGroup>

<Card title="Still stuck?" href="mailto:success@zenrows.com">
  Check the [API Error Codes](/api-error-codes) reference, or contact support directly.
</Card>
