Scheduling & webhooks
Run reports on a cadence, or trigger them with a private URL
Prowl can run a saved analysis automatically. Pick a fixed cadence (daily, weekly, or monthly at a chosen UTC hour) and Prowl fires the report itself, or create a webhook schedule to get a private trigger URL you POST to whenever you want a fresh report. Each account can hold up to 20 schedules, managed from either the REST API or the MCP tools — and a schedule never bills at creation time, only when it fires.
Interval vs. webhook
Every schedule is one of two trigger types.
- Interval — Prowl runs the report on a cadence you set.
cadenceisdaily,weekly, ormonthly;run_at_houris the UTC hour0-23(default8, i.e. 08:00 UTC, always on the hour). Interval jobs get a computednext_run_at. - Webhook — Prowl returns a private trigger URL. The report runs when you
POSTto that URL, on your own schedule (cron, CI, an app event). Webhook jobs ignorecadenceandrun_at_hour.
Both types share the same options: execution_mode is basic, deep, or max (deep and max require an active subscription, checked fresh each time the job fires — a lapsed subscription downgrades the run to basic rather than failing it); an optional playbook_id fixes the report structure; and the query is capped at 32,000 characters (tunable via PROWL_SCHEDULE_MAX_QUERY_CHARS). Each account may hold at most 20 schedules total — the same shared limit applies whether you create them over REST or via MCP.
Create and manage a schedule
Two surfaces, one backend — schedules created either way share the same 20-per-account limit and behave identically.
REST API (uses your account auth):
POST /api/schedules— create; returns201with the schedule JSON (webhook jobs include awebhook_url).GET /api/schedules— list your schedules, withcountand thelimit(20).DELETE /api/schedules/{job_id}— cancel (404 if it is not yours).POST /api/schedules/{job_id}/resume— re-activate a paused job.
curl -X POST https://prowl.chat/api/schedules \\
-H "Content-Type: application/json" \\
-d '{"query": "weekly SEO recon for example.com",
"trigger_type": "interval",
"cadence": "weekly",
"run_at_hour": 8,
"execution_mode": "deep"}'
Exceeding the cap returns an error ("schedule limit reached (20)"); cancel one first.
MCP tools (need an authenticated Prowl API key): prowl_schedule_create, prowl_schedule_list, prowl_schedule_cancel, and prowl_schedule_resume. A successful prowl_schedule_create replies with the schedule id and either the next run time (interval) or the trigger URL (webhook).
Cadence examples
Interval schedules fire at run_at_hour UTC, on the hour. The first run is the next matching slot strictly after creation time.
| You want | cadence | run_at_hour | Fires |
|---|---|---|---|
| Every morning | daily | 8 | Every day at 08:00 UTC |
| Weekly digest | weekly | 13 | Every 7 days at 13:00 UTC |
| Monthly snapshot | monthly | 0 | Same calendar day each month at 00:00 UTC (clamped for shorter months — the 31st becomes the 28th/30th) |
All hours are UTC; convert from your local time when choosing run_at_hour.
Webhook trigger, payload & retries
A webhook schedule gives you a capability URL of the form POST https://prowl.chat/webhooks/schedule/<token>. Firing it by hand is the test path for scheduling — create a webhook job, POST the URL, and confirm the report lands in your account.
Request. The endpoint ignores the request body, so send an empty POST. No auth header is needed; the token in the path is the credential.
curl -X POST https://prowl.chat/webhooks/schedule/YOUR_TOKEN
Response. Prowl accepts the trigger and runs the report in the background, returning immediately:
202 Accepted
{"status": "accepted", "job_id": "..."}
Status codes.
202— accepted; the report is now running server-side.404— unknown token, or the schedule is inactive/paused, or it is not a webhook job.429— rate limited. Each token allows 6 triggers per 60-second window (tunable viaPROWL_WEBHOOK_RATE_LIMIT/PROWL_WEBHOOK_RATE_WINDOW_SEC); aRetry-Afterheader tells you when to try again.503— scheduling is disabled on the server.
Retries & delivery. This webhook is inbound: you call Prowl, Prowl does not call you back. There is no outbound callback and no report payload delivered to an external URL — the finished report is stored in your account (retrieve it from your history or via the schedule's last_artifact_id). Prowl performs no automatic retry: on a 429, wait out the Retry-After window and POST again; a 202 means the run is already underway, so do not re-fire it.
Failures: pause, resume & errors
Each run records a last_status, last_run_at, and last_artifact_id, all visible when you list schedules.
- ok — report generated and stored; for interval jobs,
next_run_atadvances to the next slot. - paused_insufficient_funds — at fire time the wallet could not cover the run, so the job is paused instead of looping on empty reports. Top up your balance, then re-activate it with the resume endpoint (
POST /api/schedules/{job_id}/resume) orprowl_schedule_resume. - error — a runtime failure during the run. The job stays active and
next_run_atstill advances, so a transient error does not retire the schedule; it simply tries again next slot.
Billing happens at fire time through the same wallet reserve/settle gate as an interactive report — a schedule never bills at creation time.
Security: the token is the secret
A webhook trigger URL is a bearer capability — anyone holding the full URL can fire the schedule (bounded only by the per-token rate limit and your wallet). Treat it like a password.
- There is no request signing. Prowl does not send an HMAC or signature header, and the trigger endpoint verifies none. The only secret is the random token embedded in the URL, so do not build signature-verification logic against it.
- Keep the URL private — store it in a secrets manager, never in client-side code or a public repo.
- To rotate a leaked URL, delete the schedule and create a new one — there is no in-place rotate. Deleting immediately invalidates the old token, and further POSTs to it return
404.
Frequently asked questions
Does Prowl sign webhook requests with an HMAC or signature I should verify?
No. Prowl has no webhook signing at all - no signature header is sent, and the trigger endpoint verifies none. The token embedded in the URL is the only secret, so keep the full URL private and treat it like a password.
What payload should I send when triggering a webhook schedule?
None. The trigger endpoint ignores the request body, so an empty POST works. On success it returns 202 with a small JSON body containing the status 'accepted' and the job_id. The report itself runs in the background and is stored in your account - it is not returned in the response, and Prowl does not POST it back to any URL of yours.
How do I rotate or revoke a webhook URL if it leaks?
Delete the schedule and create a new one - there is no in-place rotate. Deleting invalidates the old token immediately, and any further POST to it returns 404.
How many schedules can I create, and does the limit differ between the web app and MCP?
Up to 20 per account. It is a single shared limit - schedules created over the REST API and via the MCP tools count against the same 20. Creating a 21st returns an error until you cancel one.
How often can I hit a webhook trigger URL?
By default, 6 times per 60 seconds per token (operators can tune PROWL_WEBHOOK_RATE_LIMIT and PROWL_WEBHOOK_RATE_WINDOW_SEC). Exceeding it returns 429 with a Retry-After header - wait that long and try again.