Scheduled reports
How brands, scheduled reports, region configs and prompts fit together to power recurring AI visibility tracking.
Recurring AI visibility tracking in Rank Prompt is built on a four-level hierarchy: brand → scheduled report → region config → prompts. Once you understand how the four resources nest, the rest of the API is just CRUD.
This page is a conceptual overview. For the exact request shapes, jump to the Scheduled reports and Region configs sections of the reference.
The hierarchy
brand
└── scheduled report (cadence: daily / weekly / monthly)
└── region config (×N) (one per market: country + language + AI platforms)
└── prompts (×M) (the questions we ask each AI platform)
Every tick of the scheduler materialises one report per active region config attached to the schedule. So a weekly schedule with 3 region configs produces 3 fresh reports every week, each containing the prompts seeded on its region config.
Brand
A brand is the top-level container for everything we track. It owns its
researched facts, its categories, the aliases the analyzer counts as brand
mentions, and every report (one-off or recurring) below it. See
POST /v1/brands.
Scheduled report
A scheduled report defines the cadence at which we want to refresh visibility data:
frequency:daily,weeklyormonthly.next_run_at: computed fromfrequencyon creation; you can override it viaPATCHto anchor a run to a specific moment.is_active: pause/resume without deleting history.
A schedule by itself doesn’t ask any questions yet; it’s the cadence
container. You attach region configs to it to define what it actually
runs. See
POST /v1/scheduled-reports.
Manual runs
You can fire a schedule outside its normal cadence with
POST /v1/scheduled-reports/{id}/executions.
By default it runs every active region config attached to the schedule;
pass region_config_id to scope the run to one. Manual runs do not advance
next_run_at.
Region config
A region config is one market you want to track on a given schedule:
country: the market (e.g.United States).language: the language we ask the AI platforms in.location: optional finer-grained locality (e.g.Manhattan).ai_platforms: which models to query (chatgpt,claude,perplexity, …).scheduled_report_id: required. The schedule this region belongs to.
Region configs live under /v1/region-configs (not nested under a schedule)
because they are first-class resources you may want to:
- list across a brand for analytics,
- attach/detach independently of their parent schedule,
- or copy from a previous one when expanding to a new market.
Each schedule is capped at 20 active region configs.
Attaching, re-attaching, removing
There are three patterns:
| You want to… | Endpoint |
|---|---|
| Create a new region config under a schedule | POST /v1/region-configs with scheduled_report_id set |
| Move an existing region config to a different schedule | POST /v1/scheduled-reports/{id}/region-configs/{rc_id} |
| Remove a region from a schedule | DELETE /v1/region-configs/{rc_id} (cascades to prompts and history) |
There is intentionally no detach endpoint: the
region_configs.scheduled_report_id column is NOT NULL, so a region config
cannot exist “unlinked”. To take a region out of a schedule, delete the
region config, or move it to a different schedule with the attach endpoint.
Prompts
The leaf level. Each prompt is a single question we’ll ask every AI platform on the region config:
{
"prompt_text": "best CRM for SaaS startups",
"category": "CRM Software"
}
category is required: pick a stable free-form bucket that names the
topic the prompt is about (e.g. CRM Software, Marketing Automation,
Specialty Coffee). It powers the per-category
breakdowns surfaced in schedule analytics, so two prompts about the same
topic should share the same category. Prompts are bulk-managed under
POST /v1/region-configs/{id}/prompts;
each region config is capped at 50 active prompts.
Prompts on a region config are soft-deleted: deleting a prompt sets
disabled=true so it stops appearing in future runs while past reports
remain unchanged. To wipe all active prompts at once and re-seed, use
DELETE /v1/region-configs/{id}/prompts.
Putting it together
Setting up a brand-new weekly schedule for two markets:
# 1. Create the schedule (no regions yet, it's just the cadence)
curl -X POST https://api.rankprompt.com/v1/scheduled-reports \
-H "Authorization: Bearer rp_live_YOUR_KEY" \
-H "Idempotency-Key: schedule-acme-weekly" \
-d '{"brand_id": "{brand_id}", "name": "Weekly tracking", "frequency": "weekly"}'
# 2. Add a US region config under it
curl -X POST https://api.rankprompt.com/v1/region-configs \
-H "Authorization: Bearer rp_live_YOUR_KEY" \
-H "Idempotency-Key: rc-acme-us" \
-d '{
"brand_id": "{brand_id}",
"scheduled_report_id": "{schedule_id}",
"name": "United States",
"country": "United States",
"language": "en",
"ai_platforms": ["chatgpt", "perplexity"]
}'
# 3. Add a UK region config under the same schedule
curl -X POST https://api.rankprompt.com/v1/region-configs \
-H "Authorization: Bearer rp_live_YOUR_KEY" \
-H "Idempotency-Key: rc-acme-uk" \
-d '{
"brand_id": "{brand_id}",
"scheduled_report_id": "{schedule_id}",
"name": "United Kingdom",
"country": "United Kingdom",
"language": "en",
"ai_platforms": ["chatgpt", "perplexity"]
}'
# 4. Seed prompts on each region config (category is required: use the topic)
curl -X POST https://api.rankprompt.com/v1/region-configs/{us_rc_id}/prompts \
-H "Authorization: Bearer rp_live_YOUR_KEY" \
-d '{"prompts": [
{"prompt_text": "best CRM for SaaS startups", "category": "CRM Software"},
{"prompt_text": "alternatives to Salesforce", "category": "CRM Software"}
]}'
# 5. (Optional) Run it now instead of waiting for the next tick
curl -X POST https://api.rankprompt.com/v1/scheduled-reports/{schedule_id}/executions \
-H "Authorization: Bearer rp_live_YOUR_KEY" \
-H "Idempotency-Key: run-schedule-once" \
-d '{}'
After that, every weekly tick produces two reports (one per region config)
that you can list with GET /v1/reports?scheduled_report_id={schedule_id} or
analyse in aggregate via
GET /v1/scheduled-reports/{id}/analytics.
Reading what came back
Three lenses, depending on what you want to render:
- Per-run reports:
GET /v1/reports?scheduled_report_id={schedule_id}returns one report per region config per tick, each with prompts and per-platform results inlined. - Schedule analytics:
GET /v1/scheduled-reports/{id}/analyticsrolls every completed run into average visibility, per-prompt sparklines, and per-AI-platform appearance rates. - Per-prompt history:
GET /v1/scheduled-reports/{id}/prompt-history/{region_config_prompt_id}returns one entry per run for a single prompt, perfect for time-series charts of how a question’s visibility evolves.
Lifecycle gotchas
- Deleting a brand cascades to its schedules, region configs, prompts and reports. Irreversible.
- Deleting a schedule deletes the linked reports and their prompts; the region configs are removed with it.
- Deleting a region config cascades to its prompts and historical reports for that region.
- Disabling a region config (
PATCH ... is_active=false) keeps the data but stops future ticks from running it. - Manual runs (
POST .../executions) don’t advancenext_run_at.