# CMS webhooks and re-crawls

Every site has a webhook URL, on its **Search index** page. Point your CMS's "on publish" webhook at it and new or changed posts reach hosted search within seconds. Webhooks are on every plan.

## By platform

- **Ghost**: Settings → Integrations → custom integration → webhooks for *Post published*, *Published post updated*, *Post unpublished* and *Post deleted*. The post is indexed straight from the webhook; members-only posts are never indexed.
- **WordPress**: a *WP Webhooks* "Send Data" webhook on post create, update and trash, or a few lines on `transition_post_status` that post `{"post_permalink": "...", "post_status": "publish"}`. Published permalinks are re-fetched; any other status removes the post.
- **Sanity**: a GROQ-powered webhook with the projection `{"url": "https://your.site/posts/" + slug.current + "/"}`. Create and update re-fetch the page, delete removes it.
- **Contentful**: a webhook on Entry publish, unpublish, archive and delete. Entries carry no public URL, so each event queues one debounced re-crawl.
- **Strapi, Storyblok and others**: any `POST` works (below).

## Any other system

```
POST <your site's webhook URL>
{"url": "https://your.site/post/"}
```

Add `"action": "delete"` to remove a post, or send an empty body to re-crawl everything.

## Static sites

Static sites can skip webhooks and upload `agentprose.json` from CI (see [Hosted search](/docs/hosted-search)).

## Scheduled re-crawls

Each site is also re-crawled on a schedule you set in its settings: daily by default, down to every 6 hours on Pro and every hour on Team. **Re-index now** on the Search index tab runs one at once.
