curl --request POST \
--url https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"paths": [
"<string>"
]
}
'import requests
url = "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh"
payload = { "paths": ["<string>"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({paths: ['<string>']})
};
fetch('https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'paths' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh"
payload := strings.NewReader("{\n \"paths\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"paths\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"paths\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"path": "/pricing",
"outcome": "queued",
"retry_after": null
},
{
"path": "/blog/launch",
"outcome": "cooldown",
"retry_after": "2026-10-07T18:42:10Z"
},
{
"path": "/careers",
"outcome": "not_found",
"retry_after": null
}
],
"quota": {
"hourly": {
"limit": 500,
"remaining": 499,
"resets_at": "2026-10-07T19:02:41Z"
},
"daily": {
"limit": 5000,
"remaining": 4987,
"resets_at": "2026-10-08T09:15:03Z"
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Force Refresh
Refetch existing Agent Pages from your live site now, then re-optimize and republish them, whether or not they changed. Use it after updating pages on your site so AI agents see the new version without waiting for the next scheduled check.
Only pages that already have an active Agent Page can be refreshed. The endpoint returns one outcome per requested path, and queued refreshes run in the background.
Limits: 100 paths per request; each path once every 5 minutes; per brand, 500 refreshes per rolling hour and 5,000 per rolling 24 hours.
curl --request POST \
--url https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"paths": [
"<string>"
]
}
'import requests
url = "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh"
payload = { "paths": ["<string>"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({paths: ['<string>']})
};
fetch('https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'paths' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh"
payload := strings.NewReader("{\n \"paths\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"paths\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.scrunchai.com/v1/{brand_id}/sites/{site_id}/agent-pages/refresh")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"paths\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"results": [
{
"path": "/pricing",
"outcome": "queued",
"retry_after": null
},
{
"path": "/blog/launch",
"outcome": "cooldown",
"retry_after": "2026-10-07T18:42:10Z"
},
{
"path": "/careers",
"outcome": "not_found",
"retry_after": null
}
],
"quota": {
"hourly": {
"limit": 500,
"remaining": 499,
"resets_at": "2026-10-07T19:02:41Z"
},
"daily": {
"limit": 5000,
"remaining": 4987,
"resets_at": "2026-10-08T09:15:03Z"
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The unique identifier for the brand that owns the site.
The ULID of the registered site whose Agent Pages you are refreshing.
Body
Site-relative paths to refresh, e.g. /pricing. 1 to 100 entries, each up to 2,048 characters. Full or protocol-relative URLs are rejected. Paths are trimmed and normalized (lowercased, trailing slash and query string dropped), and duplicates after normalization are merged. / is the homepage.
1 - 100 elementsResponse
One outcome per requested path, in request order, plus the brand's remaining quota.
One entry per requested path, in request order (after duplicates are merged).
Show child attributes
Show child attributes
The brand's remaining refresh quota. A path is queued only while both windows have room.
Show child attributes
Show child attributes