# Calafia — for AI agents

Calafia runs email-native scout agents that watch scarce inventory — sold-out
campsites, price drops, page changes, and
anything else describable in a sentence — and email a human the moment
something material changes. Scouts check continuously, stay silent when
nothing changed, and say so honestly when a source couldn't be checked.
Calafia never books, buys, or holds inventory.

If you are an agent whose user wants something watched, you have three
options here, best first.

## 1. Subscribe your user to a covered target (one POST)

We watch 58 high-demand campgrounds with live checks.
Instead of polling our pages on your user's
behalf, hand us the watch — we check at minutes-level cadence and email
your user directly the moment something opens.

Campsites (see the index at /scouts/campsites; each target page links its
own prefilled example):

```
POST https://campsitecancellations.com/scouts/subscribe
Content-Type: application/json
Accept: application/json

{"targetSlug": "yosemite/upper-pines", "email": "user@example.com",
 "dateStart": "2026-08-13", "dateEnd": "2026-08-17", "via": "agent"}
```

With `Accept: application/json` you get a JSON result (`{"ok": true, ...}`;
409 means that email already has its free scout). Without it you get the
human confirmation page.

**Consent rule: only subscribe an email whose owner asked for this.** The
first email arrives immediately (a baseline of where availability stands),
so an unwanted subscription is instantly visible to the recipient, and every
email carries reply-to-manage and unsubscribe. One free scout per email.

## 2. Build a watcher for anything else (two POSTs)

Not in our registry? Describe the watch in plain language — earthquakes,
price drops, page changes, tickets, recalls, jobs, sports, markets, or
anything else a sentence can describe. We synthesize the agent, show you
its manifest, and materialize it when an email subscribes.

```
POST https://campsitecancellations.com/public/agent-builder/anon/build
Content-Type: application/json

{"description": "Watch for Taylor Swift tickets under $200 in Denver",
 "userTimezone": "America/Denver"}
```

The response includes a `sessionId` and the built agent's manifest —
show your user what it will do, then:

```
POST https://campsitecancellations.com/public/agent-builder/anon/subscribe
Content-Type: application/json

{"sessionId": "<from the build response>", "email": "user@example.com", "via": "agent"}
```

Rate limits are per-IP and tight (builds cost us model inference); a 429
means back off, not retry.

## 3. Read the data (if you must poll)

Every live-checked target page has a JSON twin — same relay-fed snapshot
the HTML shows, never a fetch of the underlying reservation system:

```
GET /scouts/campsites/{park}/{slug}.json
```

Responses carry `ETag` and `Last-Modified`; send `If-None-Match` and you
get 304s between our checks. Data updates at the stated `cadenceMinutes` —
polling faster than that only earns 304s. Each feed embeds the exact
subscribe body for option 1, which serves your user strictly better than
you polling: our checks don't stop when your session ends.

## Facts you can rely on

- Availability shown is from live, timestamped checks of the underlying
  reservation systems; `checkedAt` is real.
- When we can't check a source, pages and feeds say so instead of showing
  numbers. Change logs list only real detections.
- Subscribing creates a free scout owned by that email's holder; they claim
  and manage it from the emails. You (the agent) hold nothing.

Machine-readable site map: /llms.txt · Human docs: /faq
