← All use cases
E-commerce & PricingCSSAI

Airline and Hotel Fare Drop Alerts

Watch specific routes and properties for price drops and fire an alert only when the drop crosses a threshold worth acting on.

Verid Use Cases·4 min read

The scenario

You're flexible on dates for an upcoming trip. The fare you've been watching is $480 today; you'd book at $380. Manually checking the airline's site once or twice a day takes minutes per check and you still miss the dip that happens between 1am and 8am.

The same problem applies to a specific hotel property whose rate fluctuates by demand - you'd book if the per-night rate drops by 20%.

The problem

OTA-side alerts ("Google Flights price drop") are coarse. They fire on big moves or specific dates and don't let you express thresholds. Building this yourself means parsing pages that load fares asynchronously, often after captchas, with selectors that change quarterly.

How Verid solves it

For airline and OTA sites where the fare lives in a stable DOM node, use a CSS selector and pull the price as a number. For sites where the fare is buried in heavy JavaScript or the layout is too varied to write a single selector against - say, hotel aggregators with map views - Verid's prompt-based extraction can read the rendered page and return a structured price.

Then attach a field_decreases_by_percent predicate so you only hear about meaningful drops, not the $2 noise that happens every hour.

Build the monitor

Extraction config - CSS for stable layouts

{
  "method": "css",
  "fields": {
    "fare": ".fare-card[data-date='2026-09-12'] .price-amount"
  }
}

Extraction config - Prompt for messy layouts

{
  "method": "prompt",
  "prompt": "Extract the lowest available nightly rate in USD shown on this hotel page for the date 2026-09-12. Return just the number.",
  "schema": { "rate_usd": "number" }
}

The prompt extractor calls an LLM on each run with the rendered page content and returns structured output matching the schema you defined.

Predicate

For threshold-based alerts, the prompt extractor's numeric output is essential - field_decreases_by_percent works on parseable numbers, not currency strings.

{ "type": "field_decreases_by_percent", "field": "rate_usd", "threshold": 15 }

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": "Hotel - Tokyo Property Sep 12",
    "url": "https://www.hotel-aggregator.com/property/xyz?checkin=2026-09-12",
    "schedule_interval_seconds": 3600,
    "fetch_mode": "browser",
    "extract_config": {
      "method": "prompt",
      "prompt": "Extract the lowest available nightly rate in USD shown on this hotel page for the date 2026-09-12. Return just the number.",
      "schema": { "rate_usd": "number" }
    },
    "diff_predicate": { "type": "field_decreases_by_percent", "field": "rate_usd", "threshold": 15 },
    "deliveries": [
      { "type": "email", "to": "traveler@example.com" }
    ]
  }'

SDK equivalent:

import { VeridClient } from '@verid.dev/sdk';

const client = new VeridClient({ apiKey: 'vrd_your_api_key' });

await client.monitors.create({
  name: 'Hotel - Tokyo Property Sep 12',
  url: 'https://www.hotel-aggregator.com/property/xyz?checkin=2026-09-12',
  schedule_interval_seconds: 3600,
  fetch_mode: 'browser',
  extract_config: {
    method: 'prompt',
    prompt:
      'Extract the lowest available nightly rate in USD shown on this hotel page for the date 2026-09-12. Return just the number.',
    schema: { rate_usd: 'number' },
  },
  diff_predicate: {
    type: 'field_decreases_by_percent',
    field: 'rate_usd',
    threshold: 15,
  },
  deliveries: [{ type: 'email', to: 'traveler@example.com' }],
});

What the webhook delivers

{
  "id": "del_01H...",
  "fired_at": "2026-09-04T03:11:00Z",
  "diff": {
    "fields_changed": ["rate_usd"],
    "before": { "rate_usd": 312 },
    "after":  { "rate_usd": 248 }
  }
}

Caveats & tips

  • Prompt extraction has a small per-run cost - billed against your LLM allowance. Verid caches results when the page hasn't changed, so on quiet days you won't pay much.
  • Stale dates auto-decay. A monitor pointed at "Sep 12, 2026" stops being useful after that date - pause or delete it once the trip is booked.
  • Browser mode for aggregators. Map-and-card-style results are JavaScript-rendered. Set fetch_mode: 'browser'.
  • Threshold tuning. 5% drops in airfare are noise; 15-20% drops are usually meaningful. Tune until your inbox only contains the alerts you'd act on.

Related use cases

For consumer goods price monitoring, see competitor price tracking. For currency moves that affect international booking, see currency / FX rate monitoring. For appointment-style date-slot tracking, see appointment & calendar slot availability.

Ship this monitor today

5 monitors free, no credit card. Set up takes about a minute.

Get started free