Appointment and Calendar Slot Availability
Get notified the moment an appointment, reservation, or event slot opens up - for medical visits, restaurants, classes, and ticketed events.
The scenario
You need a specialist appointment that's normally booked three months out. You check the booking page once a day and every slot is "Not Available." But cancellations happen - daily, randomly - and the slot is taken again within minutes.
The same pattern fits hard-to-book restaurant reservations, popular fitness classes, university course sections that fill quickly, and event tickets that sell out and occasionally reopen via released holds.
The problem
Booking systems rarely have a "notify me on cancellation" feature, and when they do, the notification is slow. Manual checking is unbounded - most days nothing changes, and on the day something does change, you're not looking.
How Verid solves it
Booking page UIs reveal availability in one of two ways. Either there's a list of slot elements (some marked "available," most marked "full"), or the page just shows "no availability" until something opens up. In both cases, a CSS selector extracts the relevant signal - a count of available slots, or the text of the first slot.
A field_changes predicate on the count, or a field_equals predicate on a specific availability string, fires the alert immediately.
Build the monitor
Extraction config
For a page that lists slots with a marker:
{
"method": "css",
"fields": {
"available_count": ".slot--available",
"first_available_slot": ".slot--available:first-child .slot-time",
"any_text_signal": ".availability-banner"
}
}
The available_count field works because some CSS extractors return the count of matches when the field is queried - your downstream consumer reads the count rather than text.
Predicate
For count-based fires (any change up or down):
{ "type": "field_changes", "field": "available_count" }
For text-banner pages where "No appointments available" flips to "View available appointments":
{ "type": "field_matches_regex", "field": "any_text_signal", "pattern": "available|book now|schedule" }
Create the monitor
curl -X POST https://api.verid.dev/v1/monitors \
-H "Authorization: Bearer vrd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Specialist appointments - DrSmith",
"url": "https://clinic.example.com/book/dr-smith",
"schedule_interval_seconds": 300,
"fetch_mode": "browser",
"extract_config": {
"method": "css",
"fields": {
"available_count": ".slot--available",
"first_available_slot": ".slot--available:first-child .slot-time"
}
},
"diff_predicate": { "type": "field_changes", "field": "available_count" },
"deliveries": [
{ "type": "webhook", "url": "https://my-phone-notify.example.com/hook" }
]
}'
SDK:
import { VeridClient } from '@verid.dev/sdk';
const client = new VeridClient({ apiKey: 'vrd_your_api_key' });
await client.monitors.create({
name: 'Specialist appointments - DrSmith',
url: 'https://clinic.example.com/book/dr-smith',
schedule_interval_seconds: 300,
fetch_mode: 'browser',
extract_config: {
method: 'css',
fields: {
available_count: '.slot--available',
first_available_slot: '.slot--available:first-child .slot-time',
},
},
diff_predicate: { type: 'field_changes', field: 'available_count' },
deliveries: [
{ type: 'webhook', url: 'https://my-phone-notify.example.com/hook' },
],
});
What the webhook delivers
{
"id": "del_01H...",
"fired_at": "2026-05-08T14:23:00Z",
"diff": {
"fields_changed": ["available_count", "first_available_slot"],
"before": { "available_count": "0", "first_available_slot": "" },
"after": { "available_count": "1", "first_available_slot": "May 14, 10:30 AM" }
}
}
A cancellation just opened a slot for May 14. Your webhook handler pushes a phone notification and you book within sixty seconds.
Caveats & tips
- Fast interval - tier permitting. Cancellations get snapped up in minutes. A 3- to 5-minute interval is the right neighborhood. Make sure your plan tier supports it; check the pricing page for the cadence ceilings.
- Booking pages need browser mode. Almost universally, slot UIs render via JavaScript. Set
fetch_mode: 'browser'so Verid sees the same DOM the booking app does. - Date-range URLs. Some booking systems put the date in the URL (
?date=2026-05). To monitor multiple months, run one monitor per URL. - Polite usage. Pounding a small clinic's booking page every 60 seconds is rude and may get your IP soft-blocked. A 5-minute interval is the polite floor for non-commercial booking systems.
Related use cases
For event-ticket restocks, see restock alerts. For hotel and flight date-shopping, see airline & hotel fare drops. For grant deadlines that operate on a slot-style cadence, see scholarship & grant deadlines.
Ship this monitor today
5 monitors free, no credit card. Set up takes about a minute.
Get started free