# createScrapeClient (https://www.scrape-sdk.com/docs/api-reference/create-scrape-client)

Canonical: https://www.scrape-sdk.com/docs/api-reference/create-scrape-client
Markdown: https://www.scrape-sdk.com/docs/api-reference/create-scrape-client.md



```ts
createScrapeClient({
  providers?: ScrapeProvider[];
  provider?: ScrapeProvider;          // alias for a single primary
  fallback?: ScrapeProvider | ScrapeProvider[];
  timeoutMs?: number;                 // default 30000, abortable
  retries?: number;                   // extra attempts per provider on retryable errors; default 1
  strategy?: "priority" | "cost";
  cache?: boolean | { ttlMs?: number; maxEntries?: number };
  onFailover?: (error: Error, from: string, to: string) => void;
})
```

```ts
fromEnv() // builds providers from process.env keys, always ends with jina + local
scrape(url) // same chain, no client. Also search/map/crawl/extract/scrapeMany
```

### Methods [#methods]

* `scrape(url, options?)` — `maxChars` truncates markdown and sets `truncated` / `charCount`. Site/docs roots try `/llms.txt` first (`preferLlmsTxt`, default true). `failedOverFrom` lists providers that died before the winner.
* `scrapeMany(urls, { concurrency?, ...scrapeOptions })`
* `search(query, { limit?, includeAnswer?, includeRawContent? })`
* `map(url, { limit?, search? })` — URL list without page bodies (Firecrawl)
* `crawl(url, { limit?, maxDepth?, pollIntervalMs?, maxChars?, ... })`
* `extract(url, { schema, prompt? })`
* `supports(capability)` — `"scrape" | "search" | "crawl" | "extract" | "js" | "map"`
* `listProviders()`