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

> ## Agent Instructions
> Keenable search and fetch work without an API key. To add them to code, use the official SDK for the project's language: https://docs.keenable.ai/sdks.md
> Read an API key from the KEENABLE_API_KEY environment variable. Never ask a user to paste a key into chat; send them to https://docs.keenable.ai/api-keys.md
> On 402 with an API key (code insufficient_credits), stop and ask a human to add credits; don't retry. On the pay-per-request paths a 402 is the payment offer: pay it and retry, see https://docs.keenable.ai/pay-per-request.md. On 429, wait the number of seconds in Retry-After, then retry.
> Every error, with its cause and fix: https://docs.keenable.ai/errors.md

# FAQ

> Short answers to common questions about Keenable: keyless use, API keys, search modes, live fetch, cards, credits, 402 and 429, SDK gaps and where to get help. Each answer links to the page with the detail.

Find a short answer to a common question about Keenable, then follow its link to the page with the detail.

## Getting started

### Account and API key

You need no account and no API key to search or fetch. If you send an API key, your organization gets its own limit of 10 requests per second with no hourly cap, and 100,000 free requests a month. Responses to keyed calls also report what each call cost in a `usage` object. To add a key, see [API keys](https://docs.keenable.ai/api-keys.md).

### Keyless billing and limits

Keyless requests use no credits. If you don't send an API key, Keenable allows 1,000 requests per hour and 10 per second per IP address, counted separately for search and for fetch. All traffic from your IP address shares that pool, so other callers on your network reduce your headroom. See [Rate limits](https://docs.keenable.ai/rate-limits.md).

### The index behind the results

Search and fetch run on Keenable's own index. Each search result carries `acquired_at`, the time Keenable indexed the page, so you can judge how fresh its `snippet` is. See the [Search response](https://docs.keenable.ai/api-reference/search.md#response).

### Search, Fetch and SELECT

Search returns ranked web pages about a topic, each with text from the page in `snippet`. Fetch returns one page as markdown when you already have its URL. SELECT is a separate MCP server that needs a Keenable account: your agent writes one read-only SQL `SELECT`, and the server returns a table built from live web pages. Start with [Search](https://docs.keenable.ai/products/search.md), [Fetch](https://docs.keenable.ai/products/fetch.md) or [SELECT](https://docs.keenable.ai/select.md).

## Search and fetch

### Search modes

Search has two modes. `pro` does deeper retrieval and is the mode a search runs in if you set none and your organization has no other default. `realtime` returns the fastest response, for latency-sensitive agent loops. Each mode is billed as its own SKU, and the response names the mode that served the call in `mode`. See the [Search request](https://docs.keenable.ai/api-reference/search.md#request).

### Recent results and `query_time`

To get recent results, set `published_after` to a date, a timestamp or a relative delta such as `7d`. The results then leave out pages with no known publish date. `query_time` isn't a recency filter: it searches the index as it stood at that moment and sets no lower bound. See [Date and time filters](https://docs.keenable.ai/api-reference/search.md#date-and-time-filters).

### Card results

A card is a result that Keenable writes for queries such as prices, exchange rates or facts about a company. Its `url` starts with `https://cards.keenable.ai/w/`. To get ordinary web pages in place of cards, send `disable_cards: true`. You still get the same number of results. See the [Search request](https://docs.keenable.ai/api-reference/search.md#request).

### Empty `description` field

The `description` field is deprecated and always an empty string. Read the page text from `snippet` on a search result and from `content` on a fetch response. See [Versioning and deprecation](https://docs.keenable.ai/versioning.md#deprecated-now).

### Pages with no indexed copy, and `live=true`

By default, Fetch returns Keenable's indexed copy of a page. If Keenable has no indexed copy, it fetches the page live from the source and bills the call as `fetch.live`, even if you didn't send `live=true`. Send `live=true` when you need the current version of a page that changes often. See [Fetch](https://docs.keenable.ai/products/fetch.md#gotchas).

## Keys, credits and limits

### Cost of a call

Search and fetch each cost one credit, and every organization gets 100,000 free requests a month. Prices are set per organization, so read `credits` in the `usage` object of each keyed response to see what the call cost. Keyless calls and failed calls report no `usage`. See [Pricing](https://docs.keenable.ai/pricing.md) and [Credits](https://docs.keenable.ai/credits.md#reading-usage-per-call).

### Out of credits

If you've spent the monthly allowance and have no purchased credits left, `/v1/search` and `/v1/fetch` return `402` with the code `insufficient_credits`. The body's `billing_url` links to where you buy credits. Buy a credit package in the console, or wait for the allowance to reset. See [Credits](https://docs.keenable.ai/credits.md#when-credits-run-out).

### Purchased credits and auto top-up

Keenable uses your free requests first, so your purchased balance goes down only once the monthly allowance is spent. Auto top-up is off until you turn it on in the console. Once it is on, Keenable charges your saved card the amount you set whenever the purchased balance falls below your threshold, up to your monthly limit. See [Auto top-up](https://docs.keenable.ai/auto-top-up.md).

### `429` and `402`

Retry a `429`, and don't retry a `402`. A `429` means you sent requests faster than your rate limit allows: wait for the time in the `Retry-After` header, then send the request again. A `402` means your organization is out of credits, and every retry returns the same `402` until someone adds credits or the allowance resets. See [Errors](https://docs.keenable.ai/errors.md#429).

## Connecting

### SDK, MCP server, REST API or CLI

| You want to | Use |
| - | - |
| Call search and fetch from Python, TypeScript or Go code | The [SDKs](https://docs.keenable.ai/sdks.md) |
| Give an agent in an MCP client, such as Claude Code or Cursor, search and fetch tools | The [MCP server](https://docs.keenable.ai/mcp-server.md) |
| Search from a terminal, or add Keenable to the MCP clients on your machine | The [CLI](https://docs.keenable.ai/cli.md) |
| Call from another language, or send a parameter the SDKs don't send yet | The [REST API](https://docs.keenable.ai/api-reference.md) |

All four work without an API key. For a first search with each, see the [Quickstart](https://docs.keenable.ai/index.md).

### Parameters the SDKs don't send yet

SDK 0.1.x has three gaps. In Python and TypeScript, `mode` accepts only `pro`. No SDK sends `disable_cards` or `session_id`. `fetch` takes only a URL, so it sends no `live`, `prompt` or `max_chars`. To use any of these, call the HTTP API. See [SDK methods](https://docs.keenable.ai/sdks.md#methods).

### A client that keeps using its own web search

If your client has its own web tools, such as `WebSearch` and `WebFetch` in Claude Code, turn them off in the client settings. With both sets active, the agent picks between them inconsistently from one call to the next. `keenable configure-mcp` turns the client's own web search off for you in Claude Code and OpenCode. See [MCP setup in the CLI](https://docs.keenable.ai/cli.md#mcp-setup).

### Paying per request without an account

An agent with a wallet can call search and fetch with no account and no API key on the `/v1/x402/*` paths. Each search or fetch costs \$0.01 in USDC on Base, paid over the x402 protocol. If you call Keenable regularly, an API key costs less. See [Pay per request](https://docs.keenable.ai/pay-per-request.md).

## Help and changes

### Report a problem

Email [support@keenable.ai](mailto:support@keenable.ai) about your account, credits or the API. Include the `X-Request-Id` header value from the response so Keenable can find your request in its logs. For a bug in an SDK or the CLI, open a GitHub issue in its repository. See [Get help](https://docs.keenable.ai/help.md).

### Breaking changes

Within `/v1`, Keenable ships only backward-compatible changes and announces them in the changelog. A deprecated endpoint, parameter, response field or MCP tool is announced in the changelog and by email to organization owners, and keeps working for at least 90 days after the announcement. Anything the docs mark as experimental can change without that notice. See [Versioning and deprecation](https://docs.keenable.ai/versioning.md#deprecation-policy).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.