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.
