---
title: "Re-crawl a single page"
method: POST
path: "/api/v2/projects/{slug}/recrawl/"
tags: ["Sync"]
---

# Re-crawl a single page

`POST /api/v2/projects/{slug}/recrawl/`

## Request

- Base URL: `https://app.biel.ai`
- URL: `https://app.biel.ai/api/v2/projects/{slug}/recrawl/`
- Auth: API key in header `Authorization`

Re-crawl one page and replace it in the project's search index, without touching the rest of the index. Returns immediately with `202`; the crawl runs in the background.

Use this when one page changed. To re-crawl every source in the project, use [`POST /api/v2/projects/{slug}/sync/`](/api/sync-project) instead.

## Requirements

- The URL must be on a host Biel.ai already crawls for this project: one of its embed domains, or the host of one of its URL or sitemap sources. Host matching is exact. A URL on any other host returns `400`, which keeps the endpoint from being used as a fetch-anything proxy.
- The project must have been indexed at least once. Run a full sync first, until then this endpoint returns `409`.

A page the index doesn't hold yet is added rather than replaced, and counts against your plan's page limit.

## Result reporting

The `202` means the page was accepted and queued, not that it was indexed. The background job is fire-and-forget: if the page can't be fetched, is excluded by the project's URL filters, or produces no indexable content, the run is dropped and no status is reported back. The next call, or the next full sync, is the retry. Use [`GET /api/v2/projects/{slug}/search/`](/api/search-project) to confirm the new content is in the index.

**Required permission:** `sync_create`

## Path parameters

- `slug` string, required

## Request body

- PageRecrawlInput: The single page to re-crawl and replace in the project's index.
  - `url` string, uri, required: Absolute `http` or `https` URL of the page to re-crawl. The host must be one Biel.ai already crawls for this project: an embed domain, or the host of one of its URL or sitemap sources. Host matching is exact, so `docs.example.com` does not cover `blog.example.com`.

## Response `202`

Page accepted and queued for crawling.

- PageRecrawlQueued: Acknowledgement that the page was accepted and queued for crawling.
  - `status` 'queued', required: Always `queued`. The crawl itself runs in the background.
  - `url` string, uri, required: The URL that was queued, echoed back.

## Other responses

- `400`: The `url` field is missing or malformed, or the URL is on a host this project does not crawl.
- `403`: The API key is missing, belongs to another team, lacks `sync_create`, or the team's trial has expired.
- `404`: Resource not found.
- `409`: The project has no index to replace the page in. Run [`POST /api/v2/projects/{slug}/sync/`](/api/sync-project) first.
- `429`: Rate limit exceeded for this API key. Retry after the interval named in `detail`.

---

[API](https://skmtc.dev/biel/apis/biel-ai-api.md) · [All operations](https://skmtc.dev/biel/apis/biel-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/biel/apis/biel-ai-api/revisions/ac7034d82696?raw)
