POST /v1/feeds/monitors creates a scheduled web-change monitor that
closes that gap.
A monitor is not a separate product surface. Detected changes arrive as an
ordinary followed source, so everything in Follow sources
applies to it: query it, poll it with POST /v1/feeds/changes, feed it to a
managed consumer, move it between collections, rename it,
unfollow it.
Create a monitor
Response (abridged)
subscription.feedId: that is the source_id every feed operation takes.
Naming a collection that does not exist creates it; omit it and the source
lands in Unsorted.
Each detected change becomes one entry, with the change’s title, the URL that
changed, a summary in the entry’s description, and the detection time as its
publish date. Read them exactly as you read any other entry:
Choose a target type
pageaccepts optionalinstructions(up to 2,000 characters) andnormalize_whitespace.sitemapacceptsincludeandexcludepattern lists (up to 50 each) andmax_urls(1–10,000).extractrequiresinstructionsand watches for meaningful changes across the site, which is why it costs ten times as much per run.
Choose change detection
change_detection is {"type": "exact"} or {"type": "semantic"}, and
semantic accepts an optional confidence_threshold between 0 and 1. Exact
detection reports any textual difference. Semantic detection reports only
changes that match your instructions, so a rotating banner or a timestamp does
not wake your agent.
Four combinations are rejected with 400 invalid_monitor:
- a
sitemaptarget with anything other thanexact - an
extracttarget with anything other thansemantic - a
pagetarget withinstructionsandexactdetection - a
pagetarget withsemanticdetection and noinstructions
Choose a schedule
schedule is {"type": "interval", "frequency": N, "unit": U} where unit is
minutes, hours, or days. The shortest interval is 60 minutes. Omit
schedule entirely and the monitor runs daily.
The published bounds are 60–43,200 minutes, 1–720 hours, or 1–30 days.
The credit model
Credits are reserved, not metered. When you create a monitor, smry reserves the maximum credits its schedule could consume over a 30-day month:page monitor reserves 30 credits. An hourly page monitor reserves
720. A daily extract monitor reserves 300. The sum of every monitor you
currently hold must stay inside your plan’s monthly budget; removing a monitor
returns its reservation immediately.
So a free account can hold three daily page monitors (90 of 150 credits) but
cannot hold one hourly page monitor, because 720 credits exceed its budget. The
fix for a credit rejection is a slower schedule, a cheaper target type, or one
fewer monitor.
Read your live figures from the
limits.webMonitors block of the create
response, or from GET /v1/me — never from hardcoded constants.
The 409 conditions
POST /v1/feeds/monitors returns 409 for four distinct, non-retryable
reasons. Branch on code, not on the message.
A
monitor_limit response carries the plan’s limit. A monitor_credit_limit
response carries the requested reservation and the full limits block, so a
client can report exactly how far over the line the request was.
Validation problems — an unreachable or private URL, an interval under an hour,
an unsupported target and detection pairing, a reserved tag — return
400 invalid_monitor instead.
tags accepts up to 18 tags. They must be unique, case-insensitively, and
none may be smry or begin with smry: — that prefix is reserved for
ownership bookkeeping.Manage a monitor after creation
There is no separate monitor-management API, because a monitor is a source. Use the feed operations onsubscription.feedId:
Unfollowing the source stops the upstream monitor and releases both its active
slot and its credit reservation. Run the dry run first and confirm
would_affect — see Write back.
Next
Follow sources
Query, poll, and mutate the source your monitor created.
Managed consumers
Act on every detected change from a scheduled agent that stores nothing.
Read the page that changed
Pull the full text behind a change entry’s URL.