SceneF

For agents

Built to be called, not just browsed.

SceneF is every movie showtime in San Francisco — chains, indies, and repertory houses — verified against each theater’s own calendar and served in whatever shape your caller speaks: MCP tools, plain JSON, stable URLs, or calendar feeds. Same dataset everywhere. If you can fetch, you can book a movie night.

The MCP server

URL        https://scenef.com/mcp
Transport  Streamable HTTP
scenef_whats_playing
Everything on tonight, or any night, grouped by venue.
scenef_search_showtimes
Filter by film, venue, night, format, or time window.
scenef_theater_info
One venue: address, discounts, amenities, ticketing notes.
scenef_film_details
One film: runtime, credits, trailer, and where it plays.
scenef_plan_movie_night
Ranked picks against a preference profile, with reasons.
scenef_discounts
Every standing discount in the city, by venue and day.
scenef_coming_soon
What enters the calendar over the coming weeks.
scenef_now
The dataset heartbeat: generated-at, counts, source health.
scenef_accuracy
The verification record as numbers you can quote, failures included.

The URL grammar

Every page is a stable, guessable URL. Fetch it as a human or a machine; the address means the same thing.

https://scenef.com/                              tonight, every screen
https://scenef.com/week                          the next seven nights
https://scenef.com/film/design-for-living-1933   one film, everywhere it plays
https://scenef.com/theaters                      every venue: discounts, amenities
https://scenef.com/go/8abd241fcafb               ticket redirect for a screening id

Ticket links are always /go/<screeningId> — never a raw vendor URL — so a link that worked yesterday still resolves after a theater reshuffles its box office.

Bring your own profile

Append preferences to any listing URL or API call. Preferences rank; they never hide — a ranked-down show is still on the page.

likes
Genres to favor, comma-separated. likes=horror,thriller
no
Genres to avoid. no=matinee is also read as a time rule.
window
One of matinee, early, evening, late.
home
Venue ids to nudge upward. home=roxie,balboa
formats
Screening tags to favor. formats=35mm,70mm,imax
discounts
discounts=only keeps shows with a standing discount.

A worked example:

https://scenef.com/week?likes=horror,thriller&no=matinee&window=late&home=roxie,balboa&formats=35mm

The APIs

All GET, all CORS-open, no keys. Every JSON payload carries data_as_of, canonical scenef.com URLs, and the attribution line “Showtimes via SceneF.com”.

/api/listings The whole board as JSON. Accepts the same profile params.

curl -s "https://scenef.com/api/listings?likes=horror&window=late"

/ask One natural-language question, one grounded JSON answer.

curl -s "https://scenef.com/ask?q=what+is+playing+on+35mm+tonight"

/api/changes What changed since a timestamp: added, moved, gone.

curl -s "https://scenef.com/api/changes?since=2026-08-01"

/api/accuracy Our own verification record: checks run, checks failed, pass rate.

curl -s "https://scenef.com/api/accuracy"

/openapi.json The machine-readable contract for everything above.

curl -s "https://scenef.com/openapi.json"

/api/evals Our own graded answers, in public, so you can score us.

curl -s "https://scenef.com/api/evals"

Accuracy, provable

Accuracy is the product, so it is computed and published rather than asserted. Every screening carries how well it is known and where it came from. Every verification run we make is counted in public — including the ones that failed, and the ones that never got to run.

venue-published
Read from the theater's own ticketing system, published feed, or public calendar.
corroborated
Two independent sources report the same showtime.
single-source
One licensed aggregator reports it and nothing contradicts it.
disputed
Sources disagree about this showtime. It is published with the disagreement attached.

Every screening in /api/listings carries:

confidence    venue-published | corroborated | single-source | disputed
source_tier   venue-api | public-feed | verified-scrape | licensed-feed
sources       every source that reported this exact showtime
verified_at   ISO time this listing last passed a check
note          present only when sources disagree

And the record itself — site-wide and per venue, computed per request and held five minutes at the edge:

curl -s "https://scenef.com/api/accuracy"

A check that could not run — a bot wall, a client-rendered page, a network failure — is graded unreachable and kept out of the pass rate. It is not evidence either way, and counting it as a pass would be the exact overclaim the record exists to prevent. The pass rate is confirmed over confirmed-plus-missing, and it reads null rather than a hundred percent when nothing gradeable has run.

The seam we will not paper over: chain showtimes — AMC, Regal, Apple Cinemas — are licensed from an aggregator rather than read from the theater, because those houses challenge every machine that asks them directly. They are labeled licensed-feed, they carry the weakest claim on this site, and the chain’s own box office is the last word on a same-day change.

Calendar feeds

Live .ics for anything worth subscribing to. Swap https:// for webcal:// to subscribe in a calendar app instead of downloading a file.

https://scenef.com/feeds/screening/8abd241fcafb   one show, one VEVENT
https://scenef.com/feeds/theater/roxie            that house's next 14 nights
https://scenef.com/feeds/genre/horror             a genre, every screen, 14 nights

The widget

Tonight’s board on any site: one dependency-free script tag that renders the listings, links films back here, and adds ScreeningEvent structured data to the host page. Configure it at scenef.com/widget.

<script async src="https://scenef.com/widget.js" data-venue="roxie"></script>

One rule: the “Showtimes by SceneF” credit the widget renders is structural — embeds keep it visible.

The integrity line

Ranking is payout-blind. Ticket links go to the theater’s own box office. We earn nothing from ranking — a screening rises because it fits the profile, never because anyone paid.

The dataset regenerates nightly with rolling verification through the day, and every payload tells you exactly how old it is. Per-venue health, last verified times, and source tiers are public on the status board; the method behind them is on the methodology page.