← All use cases
Research & NicheCSS

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.

Verid Use Cases·4 min read

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