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

# Prerender plugin

> Prerender service API for recaching pages, searching the cache, submitting sitemaps and tuning the render queue.

Use **Prerender** through Corsair: one client, typed API calls.

Prerender.io serves pre-rendered HTML to crawlers so a JavaScript-heavy site stays indexable, and its REST API controls that cache. Find the token under Security and Access, Prerender Token, and paste it in; it travels in the `X-Prerender-Token` header, and in the path on the status route, which takes it no other way.

What to know before you recache:

* **Recache spends renders.** `recache` caches a URL for the first time or refreshes one already cached, and each URL counts as one render against the plan (paid plans bill renders past the included amount). Refreshing only the pages that changed is how a longer global cache expiration stays affordable. One call takes either a single `url` or up to 1000 `urls`.
* **Mobile is a separate entry.** Add `adaptiveType: 'mobile'` to act on the mobile rendering rather than the desktop one, and the same filter on `search` to read one of the two.
* **Search pages by 200.** `search` matches a substring with `query` or a whole URL with `exactMatch` (with neither, it lists the whole cache), at 200 results per page, and takes `start` for the next page. It allows 50 requests a minute and answers 429 past that.
* **A sitemap adds only new URLs.** `sitemap` renders and caches what is not cached yet, one render per new URL, and leaves existing entries alone, so use `recache` to refresh them.
* **Clearing is a job.** `cacheClear` takes a SQL-like pattern where `%` matches any run, schedules a job, and only one job runs at a time. Check it with `cacheClearStatus`, whose `inProgress` is true while a job runs.
* **Recache speed affects your origin.** `changeSpeed` sets how many URLs the queue renders per hour, from 3600 up to 36000, or 0 to restore the automatic delay. A faster rate can overload the origin, so confirm the stack can take it first.

**What you get:**

* 6 typed API operations

## Setup

**1. Install**

```bash npm theme={null}
npm install corsair @corsair-dev/prerender better-sqlite3
npm install --save-dev @types/better-sqlite3
```

```bash yarn theme={null}
yarn add corsair @corsair-dev/prerender better-sqlite3
yarn add --dev @types/better-sqlite3
```

```bash pnpm theme={null}
pnpm install corsair @corsair-dev/prerender better-sqlite3
pnpm install --save-dev @types/better-sqlite3
```

```bash bun theme={null}
bun add corsair @corsair-dev/prerender better-sqlite3
bun add --dev @types/better-sqlite3
```

**2. Add the plugin**

```ts corsair.ts theme={null}
import Database from 'better-sqlite3';
import { createCorsair } from 'corsair';
import { prerender } from '@corsair-dev/prerender';

export const corsair = createCorsair({
	plugins: [
		prerender(),
	],
	database: new Database('corsair.db'),
	kek: process.env.CORSAIR_KEK!,
	multiTenancy: true,
	hub: {
		projectApiKey: process.env.CORSAIR_API_KEY!,
		signingSecret: process.env.CORSAIR_SIGNING_SECRET!,
	},
});
```

With `multiTenancy: true`, scope calls with `corsair.withTenant(id)`. See [Quick start](https://docs.corsair.dev/quick-start.md) for KEK + Hub keys, and [Multi-tenancy](https://docs.corsair.dev/concepts/multi-tenancy.md) for account isolation.

**3. Choose authentication**

> [tab] API Key (Recommended)
>
> Store the Prerender API key before the first call: `pnpm corsair setup --plugin=prerender --tenant=acme api_key=<your-key>` (leave out `--tenant` without `multiTenancy`), or pass it as `key` in the plugin options. With Hub, each tenant enters their own key on the connect page. See [API key auth](https://docs.corsair.dev/concepts/api-key).
>
> ```ts theme={null}
> prerender()
> ```
>
> More: [API Key](https://docs.corsair.dev/concepts/api-key)

**4. Connect a tenant**

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see [Connect / OAuth](https://docs.corsair.dev/management/connect).

```ts theme={null}
const { connectUrl } = await corsair.manage.connect.createLink({
	plugin: 'prerender',
	tenantId: 'acme',
});
// redirect the user's browser to connectUrl
```

## Example API calls

**Search the cache for a path**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.prerender.api.cache.search({ query: 'example.com/path', start: 0 });
```

**Recache one page**

```ts theme={null}
const tenant = corsair.withTenant('acme');
await tenant.prerender.api.cache.recache({ url: 'https://example.com/pricing' });
```

See the full list on the [API](https://docs.corsair.dev/plugins/prerender/api.md) page.

## What's next

> [card] [API reference](https://docs.corsair.dev/plugins/prerender/api.md)
>
> Every `prerender.api.*` operation with input and output types.

> [card] [Connect / OAuth](https://docs.corsair.dev/management/connect)
>
> createLink, Hub delivery, and tenant connect flows.

> [card] [Use with agents](https://docs.corsair.dev/mcp-adapters/mcp-adapters)
>
> Expose this plugin's operations as MCP tools.


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