Now Playing SF APInowplayingsf.com ↗
Fetch real-time movie showtimes at San Francisco theaters from nowplayingsf.com. Filter by date, theater, or time. 2 endpoints covering AMC, Regal, and Apple Cinemas.
What is the Now Playing SF API?
The nowplayingsf.com API provides 2 endpoints for accessing movie showtimes and featured films at San Francisco theaters. The get_film_showtimes endpoint returns every scheduled screening for a given film across AMC Kabuki, AMC Metreon, Regal Stonestown, and Apple Cinemas Van Ness — each row including a local date, 24-hour start time, ISO timestamps, and a direct ticketing link to the theater.
curl -X GET 'https://api.parse.bot/scraper/b4922206-2963-40f7-b812-c5c2970db3a6/get_film_showtimes?film_slug=resident-evil' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace nowplayingsf-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: browse SF movie showtimes — discover films, then drill into screenings."""
from parse_apis.nowplayingsf_com_api import NowPlaying, FilmNotFound
client = NowPlaying()
# Browse the home-page shelves to see what's playing.
for section in client.sections.list(limit=4):
print(f"— {section.section} ({len(section.films)} films) —")
for film in section.films[:3]:
label = f" [{film.tag}]" if film.tag else ""
print(f" {film.title}{label}")
# Pick the first film from the first section and fetch full showtimes.
first_section = client.sections.list(limit=1).first()
if first_section is not None and first_section.films:
slug = first_section.films[0].film_slug
try:
film = client.films.get(film_slug=slug)
except FilmNotFound:
print(f"Film '{slug}' is no longer listed")
else:
print(f"\n{film.title} — {film.showtime_count} screenings across {len(film.theaters)} theaters")
for theater in film.theaters:
print(f" {theater.theater_name} ({theater.neighborhood})")
# Show the next few showtimes.
for st in film.showtimes[:5]:
print(f" {st.date} {st.local_time} {st.theater_name} {st.ticket_url[:60]}…")
# Filter to evening screenings at one theater if available.
if film.theaters:
evening = client.films.get(
film_slug=film.film_slug,
theater=film.theaters[0].theater_slug,
after_time="17:00",
)
print(f"\nEvening at {film.theaters[0].theater_name}: {evening.showtime_count} screenings")
print("\nexercised: sections.list / films.get (unfiltered + filtered) / FilmNotFound")
Returns every scheduled showtime for one film across the San Francisco theaters the site tracks, in a single round trip. Each row is one screening with its local date, 24h local time (America/Los_Angeles), ISO start timestamps, theater identity and the theater's ticketing link. Optional filters narrow the rows locally: a calendar date (YYYY-MM-DD; the site publishes roughly a two-week window, listed in available_dates), a theater_slug (values are listed in the theaters array of the same response; an unrecognized slug yields zero rows), and after_time (24h HH:MM local; keeps screenings starting at or after that time). Rows are sorted by start time. The theaters and available_dates arrays describe the film's whole schedule, not the filtered rows. Zero rows is a valid result when the film has no screening matching the filters. An unknown film slug returns a stale_input (input_not_found) error.
| Param | Type | Description |
|---|---|---|
| date | string | Local calendar date YYYY-MM-DD to restrict screenings to. Omitted = all dates the site publishes for this film. |
| theater | string | theater_slug from the theaters array of this endpoint's response (e.g. amc-metreon). Omitted = all theaters; an unrecognized value yields zero showtimes. |
| film_slugrequired | string | Film slug as it appears in the site's film URL and in list_films.sections[*].films[*].film_slug (e.g. the-odyssey). |
| after_time | string | 24-hour local time HH:MM; only screenings starting at or after this time are returned. Omitted = no time filter. |
{
"type": "object",
"fields": {
"title": "film title as shown on the site",
"filters": "echo of the date, theater and after_time filters applied (null when omitted)",
"theaters": "array of theaters the site tracks for this film: theater_slug, theater_name, neighborhood, label, website_url",
"timezone": "IANA timezone the local_time and date fields are expressed in",
"film_slug": "the requested film slug",
"showtimes": "array of screenings: show_id (integer), date, local_time (HH:MM), starts_at (ISO local with offset), starts_at_utc, theater_slug, theater_name, neighborhood, ticket_url",
"showtime_count": "integer number of rows in showtimes",
"available_dates": "array of YYYY-MM-DD strings the site publishes a schedule for this film"
},
"sample": {
"data": {
"title": "The Odyssey",
"filters": {
"date": "2026-09-16",
"theater": null,
"after_time": "17:00"
},
"theaters": [
{
"label": "Kabuki",
"website_url": "https://www.amctheatres.com/movie-theatres/san-francisco/amc-kabuki-8",
"neighborhood": "Japantown",
"theater_name": "AMC Kabuki 8",
"theater_slug": "amc-kabuki"
},
{
"label": "Van Ness",
"website_url": "https://www.applecinemas.com",
"neighborhood": "Van Ness",
"theater_name": "Apple Cinemas Van Ness",
"theater_slug": "apple-van-ness"
}
],
"timezone": "America/Los_Angeles",
"film_slug": "the-odyssey",
"showtimes": [
{
"date": "2026-09-16",
"show_id": 637789,
"starts_at": "2026-09-16T17:15:00-07:00",
"local_time": "17:15",
"ticket_url": "https://tickets.fandango.com/transaction/ticketing/mobile/jump.aspx?sdate=2026-09-16%2B17%3A15&tid=AAGBK",
"neighborhood": "Van Ness",
"theater_name": "Apple Cinemas Van Ness",
"theater_slug": "apple-van-ness",
"starts_at_utc": "2026-09-17T00:15:00.000Z"
},
{
"date": "2026-09-16",
"show_id": 585584,
"starts_at": "2026-09-16T20:30:00-07:00",
"local_time": "20:30",
"ticket_url": "https://www.amctheatres.com/showtimes/all/2026-09-16/kabuki/all/146806697",
"neighborhood": "Japantown",
"theater_name": "AMC Kabuki 8",
"theater_slug": "amc-kabuki",
"starts_at_utc": "2026-09-17T03:30:00.000Z"
}
],
"showtime_count": 2,
"available_dates": [
"2026-09-14",
"2026-09-15",
"2026-09-16"
]
},
"status": "success"
}
}About the Now Playing SF API
Endpoints
The API exposes two endpoints. list_films returns the films currently featured on the nowplayingsf.com home page, grouped into named shelves such as Recommended, New Releases, Classics, and Upcoming Releases. Each film entry includes a film_slug, a title, and a promotional tag. The film_slug values returned here are the same identifiers accepted by the second endpoint.
get_film_showtimes takes a required film_slug and returns all scheduled screenings for that film across the four tracked San Francisco theaters. Each screening in the showtimes array includes show_id, date (YYYY-MM-DD), local_time (HH:MM in America/Los_Angeles), starts_at (ISO local with UTC offset), starts_at_utc, theater_slug, and a ticket_url pointing to the theater's ticketing page for that showtime.
Filtering Showtimes
Three optional filters narrow the showtimes array. Pass date (YYYY-MM-DD) to restrict to a single calendar day, theater (a theater_slug such as amc-metreon) to restrict to one venue, or after_time (HH:MM) to exclude screenings starting before a given hour. The response echoes all applied filters in a filters object and always includes available_dates — the full list of dates the site publishes for that film — so you can see what other days exist even when filtering to one day.
Theater and Timezone Context
The theaters array in each get_film_showtimes response lists every venue the site tracks for that film, including theater_slug, theater_name, neighborhood, label, and website_url. All time fields are expressed in the America/Los_Angeles IANA timezone, confirmed by the top-level timezone field in the response.
The Now Playing SF API is a managed, monitored endpoint for nowplayingsf.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when nowplayingsf.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official nowplayingsf.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a same-day showtime finder filtered by
after_timefor users who want evening screenings only - Aggregate
available_datesacross multiple films to generate a weekly SF cinema calendar - Display neighborhood-level theater options using the
neighborhoodfield from thetheatersarray - Power a 'what's playing tonight' widget using
list_filmssections combined withget_film_showtimesdate filtering - Generate direct ticket purchase links by surfacing the per-showtime
ticket_urlfield - Track which films appear in the 'Upcoming Releases' shelf on nowplayingsf.com using
list_filmssection data
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does nowplayingsf.com have an official developer API?+
What does get_film_showtimes return for each screening, and how granular is the time data?+
showtimes array includes the local date, a 24-hour local_time string (HH:MM), a starts_at field with the full ISO timestamp including UTC offset, and starts_at_utc for timezone-agnostic comparisons. All local fields are expressed in America/Los_Angeles.Does the API cover theaters outside San Francisco, or other Bay Area cities?+
Can I retrieve showtimes for all films at once rather than one film at a time?+
get_film_showtimes requires a single film_slug per request, and list_films returns film metadata without showtime details. You can fork the API on Parse and revise it to add a bulk-showtimes endpoint that iterates across all films from the home page shelves.How far in advance does the site publish showtimes, and how do I know which dates are available?+
available_dates field in every get_film_showtimes response lists the exact YYYY-MM-DD dates the site currently has a schedule for that film. Availability reflects what the site has published at the time of the request; the horizon varies by film and is typically a few days to about a week.