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

# Introducing Fetch

> Turn up to 20 URLs into LLM-ready Markdown in one call. Fetch returns one result per URL, keyed by the URL you sent.

*Released: September 4, 2026*

**Fetch** turns a URL into LLM-ready Markdown. Send up to 20 URLs to [`POST /v1/fetch`](/api-reference/fetch) in one call and get back one result per URL: the extracted content when the page could be fetched, an error code when it could not, and what was observed on the way — where redirects landed, what status code the origin returned.

## Highlights

* **Up to 20 URLs per call** — URLs are fetched concurrently, so a batch takes about as long as its slowest page.
* **Markdown by default** — `formats` resolves to `["markdown"]` when omitted, returning the page's main content with navigation, footers and ads removed.
* **Keyed by the URL you sent** — Results arrive in the requested order, and `requested_url` is echoed back byte for byte as the correlation key. Two identical URLs in one request are rejected, because a repeated key is ambiguous.
* **A failed page is not a failed call** — A page that could not be fetched arrives inside the `200` with `status = "error"` and an `error.code`. Only the request is rejected with a non-200, and then nothing is fetched and nothing is billed.
* **Per-URL time budget** — `timeout_ms` applies to one URL, not to the batch. 75 seconds is the maximum and the default; higher values are clamped, not rejected.
* **One tier** — `tier` selects the price. `"pro"` is the only value and an omitted `tier` resolves to it.

## Quick Start

<CodeGroup>
  ```python Python theme={null}
  from seltz import FetchStatus, Seltz

  client = Seltz(api_key="your-api-key")

  response = client.fetch(["https://example.com/"])

  for result in response.results:
      if result.status == FetchStatus.FETCH_STATUS_OK:
          print(result.markdown)
  ```

  ```typescript TypeScript theme={null}
  import { FetchStatus, Seltz } from "seltz";

  const client = new Seltz({ apiKey: "your-api-key" });

  const response = await client.fetch({ urls: ["https://example.com/"] });

  for (const result of response.results) {
    if (result.status === FetchStatus.OK) {
      console.log(result.markdown);
    }
  }
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.seltz.ai/v1/fetch \
    -H "x-api-key: $SELTZ_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"urls": ["https://example.com/"]}'
  ```
</CodeGroup>

## Good to Know

Branch on `status`, not on whether `markdown` is set: a format the page could not produce is unset on an otherwise successful result. Treat an unrecognized `error.code` as a generic failure — the set grows.

<CardGroup cols={2}>
  <Card title="Concepts" icon="book" href="/fetch/concepts?utm_source=changelog&utm_medium=changelog&utm_campaign=fetch">
    Requests, results and formats
  </Card>

  <Card title="Quickstart" icon="arrow-right" href="/fetch/quickstart?utm_source=changelog&utm_medium=changelog&utm_campaign=fetch">
    Fetch your first page
  </Card>
</CardGroup>
