---
title: "Fetch page content"
method: GET
path: "/v1/fetch"
tags: ["Fetch"]
---

# Fetch page content

`GET /v1/fetch`

## Request

- Base URL: `https://api.keenable.ai`
- URL: `https://api.keenable.ai/v1/fetch`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Extract clean content (markdown) from a web page URL.

## Query parameters

- `url` string, uri, required
- `max_chars` integer
- `live` boolean
- `prompt` string

## Response `200`

Extracted page content

- FetchResponse
  - `url` string, required: Fetched URL (may differ from input after redirects)
  - `title` string: Page title
  - `content` string, required: Extracted content in markdown
  - `description` string: Always empty. Deprecated.
  - `author` string: Author name
  - `published_at` string: Publish date (ISO 8601)
  - `usage` Usage: What this request was billed. Present when the request is billed in credits, that is made with an API key or a signed-in session; absent on keyless, x402 and ZeroClick requests. A request that fails (any non-2xx status) is never billed, and its error body carries no usage.
    - `sku` string, required: What was billed: search.<mode> for a search, named after the mode it ran in (search.pro by default, search.time_machine for a Time Machine search), and fetch, fetch.live or fetch.time_machine for a fetch. A search whose query is a URL is billed as the fetch it was answered with.
    - `amount` integer, required: Billed units, 1 for a search or a fetch.
    - `credits` number, required: Credits charged to the organization for this request.
    - `paid` boolean, required: true when the credits came from the purchased balance, false when they came from the plan's free credits.

## Other responses

- `400`: Invalid request parameters, or a request the organization's zero data retention policy does not allow (error zdr_wizards_unsupported, zdr_unsupported_profile or zdr_prompt_unsupported)
- `401`: Missing or invalid API key – update your API key or contact support
- `402`: No credits left — the free monthly allowance and purchased credits are used up; top up in the console
- `403`: Tell the cases apart by `error`. "Upstream forbidden": the target server refused the fetch (responded 401, 403, or a vendor block code such as LinkedIn's 999), a bot-wall or access restriction on the target rather than a problem with your credentials. Deterministic: retrying will not help. "Forbidden": your API key was revoked; see `message`.
- `404`: The target page does not exist — the target server responded 404.
- `409`: The signed-in caller has no active organization, so there is nothing to bill. Only reachable with bearer authentication. Create or join an organization, then retry.
- `422`: The page was reached but contains no extractable content, or the target server answered with an HTTP error that no other status here covers, such as 410 or 451 — see `message`.
- `429`: Rate limited. Either your own quota, or the target server throttled the fetch — see `message`. Honour `Retry-After`.
- `500`: Internal server error, including a failure inside our own fetcher infrastructure. Not caused by the requested URL; retrying the same URL later is reasonable.
- `502`: The fetcher could not get the target page: a DNS/TLS/connection failure, an unreachable host, or the target answered with a 5xx error. Unlike 422, no page content came back; unlike 403, the target did not refuse the fetch. Often transient; a retry is reasonable.
- `504`: The upstream fetch to the target page timed out.

---

[API](https://skmtc.dev/keenable/apis/keenable-api.md) - [All operations](https://skmtc.dev/keenable/apis/keenable-api/llms.txt) - [OpenAPI document](https://skmtc.dev/keenable/apis/keenable-api/revisions/583d5cf92ed5?raw)
