Madrid Film Calendar Partner API Browse the calendar

Bulk API v1

Films and screenings in Madrid

Download films currently showing in Madrid. Each record includes the film, its cited Madrid Film Calendar research, and its current and upcoming sessions.

Quick start

Download the current snapshot

  1. Register or sign in, create a machine credential, and store it in a secret manager.
  2. Send it as Authorization: Bearer $MFC_PARTNER_API_KEY when fetching /v1/current.json and the manifest.
  3. Fetch its manifest_url and locate upcoming-films.ndjson.gz.
  4. Request the payload with the same header, follow its one-minute signed R2 redirect without forwarding the API key, verify the SHA-256 checksum, and parse one JSON object per line.
Terminal
export MFC_PARTNER_API_KEY='store-this-outside-your-code'
curl --fail \
  -H "Authorization: Bearer $MFC_PARTNER_API_KEY" \
  https://data.madridfilmcalendar.com/v1/current.json
# Use the same header for the manifest and payload gateway URL.
# Standard clients strip Authorization when redirected to the R2 host.

Coding agents

Using the API with a coding agent

If an agent is writing the integration, give it the contract and the task together. The prompt below contains the minimum context it needs to start without guessing the dataset shape.

Context for your agent
Use the Madrid Film Calendar Bulk API v1.

Read the natural-language field guide before writing code:
https://data.madridfilmcalendar.com/docs#fields

Then use this public contract for structure and validation:
https://data.madridfilmcalendar.com/v1/openapi.json
https://data.madridfilmcalendar.com/v1/schemas/upcoming-film.schema.json

Start at https://data.madridfilmcalendar.com/v1/current.json, follow
manifest_url, and download upcoming-films.ndjson.gz.

Authenticate every data.madridfilmcalendar.com snapshot request with
Authorization: Bearer $MFC_PARTNER_API_KEY. Never put the key in a URL, log,
browser bundle, repository, prompt, or analytics event. The payload endpoint
redirects to R2; do not forward Authorization to the signed R2 URL.

There is one dataset; do not look for separate film or screening downloads.
Each NDJSON line is one upcoming-film record containing:
- film: the film and its Madrid Film Calendar research
- screenings: a non-empty array of current or future Madrid sessions

Verify the manifest and file SHA-256 checksums. Interpret showtime_local in
Europe/Madrid. Treat missing or nullable values as unknown, not false. Use
film_url and screening_url as the public links; do not invent direct cinema
ticket URLs.

My task is: [describe what you want to build]

The field guide explains what fields mean. OpenAPI and JSON Schema define their structure and validation rules. An integration should use both.

Feedback

What are you building?

The Partner API is new, and real integrations will shape what we document and improve next. If you are building an app, research project, visualization, or cultural tool, tell us what you are making, which fields you use, and where the contract gets in your way.

Tell us about your project

Dataset

Upcoming films

One film per line

Each record contains one film with at least one current or future Madrid screening. The screenings array includes venues, showtimes, first-party Madrid Film Calendar links, and public event annotations.

upcoming-films.ndjson.gz

Field reference

Data dictionary

Each NDJSON line is an upcoming-film record. Arrays are written as []. Nullable fields may be null when the value is unknown.

Record and film identity
FieldTypeMeaning
filmobject · requiredThe rights-cleared film record associated with the screenings on this line.
screeningsarray · requiredOne or more current or future Madrid sessions for this film. An exported record never has an empty array. See screening fields and event annotations.
film.idinteger · requiredThe stable, canonical FDB film identifier. Use it as the film key across snapshots.
film.film_urlURL · requiredThe canonical Madrid Film Calendar film page, with static partner-API attribution parameters. See first-party link rules.
film.titleobject · requiredOriginal and localized titles for the film.
film.title.originalstring · requiredThe film's title in its original release language.
film.title.esstring · nullableThe published Spanish title, when known.
film.title.enstring · nullableThe published English title, when known.
film.yearinteger · nullableThe film's release or production year.
film.runtime_minutesinteger · nullableThe canonical running time in minutes; a particular restoration or cut can differ.
film.film_typestring · nullableThe work format, such as feature, short, documentary, or episode.
film.original_languagestring · nullableThe principal original language recorded for the film.
film.premiere_datedate · nullableThe earliest known premiere date in YYYY-MM-DD form.
film.statusstring · nullableThe production or release status when it is known.
film.colorstring · nullableThe recorded image presentation, such as color, black-and-white, or mixed.
film.silentboolean · nullableWhether the work is a silent film. Null means not established, not false.
film.wikidata_urlURL · nullableA Wikidata entity URL used for external identity alignment.
film.researchobject · optionalMadrid Film Calendar's cited editorial and structured research. Its child arrays may be empty. See attributes, credits and origins, versions and releases, editorial context, and film relationships.
Screenings and event annotations
FieldTypeMeaning
screenings[].idinteger · requiredThe stable FDB screening/session identifier.
screenings[].film_idinteger · requiredThe parent film ID. It always equals film.id in the same record.
screenings[].theaterobject · requiredThe venue hosting the session.
screenings[].theater.idstring · requiredThe stable Madrid Film Calendar identifier for the venue.
screenings[].theater.namestring · requiredThe public venue name.
screenings[].showtime_locallocal datetime · requiredThe Madrid-local start time, without a UTC offset, in YYYY-MM-DDTHH:MM:SS form.
screenings[].timezoneconstant · requiredAlways Europe/Madrid. Combine it with showtime_local when converting time zones.
screenings[].versionvose · dubbed · nullvose means original or otherwise undubbed audio, including Spanish-language originals; it does not guarantee that subtitles are present. dubbed means audio dubbed into Spanish. null means the source genuinely does not specify the presentation, so consumers must not guess. Determine a film's original language or Spanish identity from film.original_language and its research fields, not from this screening value.
screenings[].freeboolean · requiredWhether the session is advertised as free entry.
screenings[].screening_urlURL · requiredA first-party link that opens the film page with this exact session selected and preserves partner attribution. See first-party link rules.
screenings[].annotationsarray · optionalPublic session-level context such as a presentation, discussion, guest, premiere, or special access note.
annotations[].tagstring · requiredA stable machine-readable annotation category.
annotations[].label_esstring · optionalA short Spanish display label.
annotations[].label_enstring · optionalA short English display label.
annotations[].detail_esstring · optionalLonger Spanish context for the special session.
annotations[].detail_enstring · optionalLonger English context for the special session.
annotations[].guestsarray · optionalPublicly announced people associated with the session.
guests[].namestring · requiredThe guest's public name.
guests[].rolestring · optionalThe guest's role in the film or event.
guests[].note_esstring · optionalAdditional Spanish context about the guest's participation.
guests[].note_enstring · optionalAdditional English context about the guest's participation.
Editorial attributes
FieldTypeMeaning
research.attributesobject · requiredA dictionary keyed by stable attribute slug. Only researched attributes are present; an absent key does not mean false.
attributes.{slug}.categorystring · requiredThe broader editorial category used to group the attribute.
attributes.{slug}.label.enstring · requiredThe human-readable English attribute name.
attributes.{slug}.label.esstring · requiredThe human-readable Spanish attribute name.
attributes.{slug}.valueJSON value · requiredThe assessed value. Its type depends on the attribute and can be boolean, numeric, text, structured JSON, or null.
attributes.{slug}.evidencestring · nullableMadrid Film Calendar's concise explanation of why the value applies.
attributes.{slug}.sourcesURL array · requiredThe evidence URLs supporting the assessment. These links do not license third-party page content.
Genres, origins, credits and companies
FieldTypeMeaning
research.genres[]arrayGenre assignments for the film.
genres[].slugstringThe stable machine-readable genre identifier.
genres[].name_en / name_esstringEnglish and, when available, Spanish display names.
genres[].is_primarybooleanWhether this is treated as a principal rather than secondary genre.
research.countries[]arrayCountries associated with the film.
countries[].countrystringThe country name or code recorded by FDB.
countries[].rolestringHow the country relates to the film, such as production or co-production.
research.languages[]arrayLanguages associated with the film.
languages[].languagestringThe language name or code.
languages[].rolestringHow the language is used, such as original, spoken, or intertitle.
research.credits[]arrayPeople credited on the film.
credits[].namestringThe credited person's public name.
credits[].departmentstringThe broad credit department, such as directing, cast, or cinematography.
credits[].rolestring · nullableThe specific credited role.
credits[].characterstring · nullableThe performed character name for cast credits.
credits[].orderinteger · nullableThe source ordering within comparable credits.
credits[].uncreditedbooleanWhether the contribution was not listed in the original on-screen credits.
credits[].wikidata_urlURL · nullableA Wikidata identity link for the person.
research.companies[]arrayCompanies associated with production, distribution, restoration, or another role.
companies[].namestringThe company name.
companies[].kind / rolestringThe company type and its specific relationship to the film.
companies[].country / territorystring · nullableThe company's home country and the territory where this role applies.
companies[].wikidata_urlURL · nullableA Wikidata identity link for the company.
Source works, certifications, versions and releases
FieldTypeMeaning
research.source_works[]arrayWorks adapted or otherwise used as source material.
source_works[].kindstringThe source form, such as novel, play, article, or earlier film.
source_works[].title / authorstring · nullableThe source title and credited author or creator.
source_works[].wikidata_urlURL · nullableA Wikidata identity link for the source work.
research.certifications[]arrayAge or content classifications issued in a territory.
certifications[].systemstringThe classification authority or rating system.
certifications[].territorystring · nullableThe country or market where the rating applies.
certifications[].ratingstringThe issued classification.
certifications[].detailstring · nullableAdditional rating notes or reasons.
research.market_stats[]arrayMeasured market facts such as admissions or box office.
market_stats[].territorystring · nullableThe market covered by the measurement.
market_stats[].metric / valuestring / numberThe measurement name and numeric value.
market_stats[].as_of / perioddate / string · nullableThe observation date and reporting period.
research.versions[]arrayDistinct cuts, restorations, or presentation versions.
versions[].label / kindstringThe public version label and its version category.
versions[].runtime_minutes / yearinteger · nullableThe version-specific runtime and creation or release year.
versions[].restored_bystring · nullableThe organization or people responsible for a restoration.
versions[].restoration_resolutionstring · nullableThe advertised restoration resolution, such as 4K.
versions[].source_elementsstring · nullableThe film or digital elements used to create the version.
versions[].aspect_ratio / sound_mixstring · nullableThe version's image ratio and audio presentation.
versions[].formatsstring arrayKnown physical or digital presentation formats.
versions[].notesstring · nullableAdditional version or restoration context.
research.releases[]arrayTerritory-specific premieres and releases.
releases[].territorystring · nullableThe market where the event occurred.
releases[].datedate · nullableThe release or premiere date.
releases[].kindstringThe release kind, such as theatrical, festival, or restoration.
releases[].distributor / notestring · nullableThe distributor and any contextual release note.
Places, tags, festivals and editorial context
FieldTypeMeaning
research.settings[]arrayPlaces and time periods represented in the story.
settings[].period_start / period_endinteger · nullableThe approximate first and last years of the setting.
settings[].place_name / countrystring · nullableThe named setting and its country.
settings[].fictional / is_primarybooleanWhether the place is fictional and whether it is a principal setting.
research.filming_locations[]arrayReal-world production locations.
filming_locations[].place_namestringThe specific location name.
filming_locations[].city / region / countrystring · nullableThe location's geographic hierarchy.
filming_locations[].latitude / longitudenumber · nullableCoordinates when reliable public evidence is available.
filming_locations[].notestring · nullableAdditional context about what was filmed there.
research.tags[]arrayCuratorial, thematic, formal, and audience-facing tags.
tags[].slugstringThe stable machine-readable tag identifier.
tags[].name_en / name_esstringEnglish and Spanish display names.
tags[].kindstringThe tag family or vocabulary.
tags[].weightnumber · nullableRelative relevance when the source supplies a weight.
research.festival_entries[]arrayFestival selections, premieres, nominations, and awards.
festival_entries[].festival / festival_slugstringThe festival display name and stable identifier.
festival_entries[].edition_yearintegerThe festival edition year.
festival_entries[].sectionstring · nullableThe programmed section or competition.
festival_entries[].premiere_kindstring · nullableThe premiere status advertised by the festival.
festival_entries[].award / award_result / recipientstring · nullableThe award, outcome, and named recipient when applicable.
research.endorsements[]arrayPublic recommendations or endorsements by people or institutions.
endorsements[].name / kindstringThe endorser and whether it is a person, publication, institution, or other type.
endorsements[].contextstringWhat was said or the list/program in which the endorsement appeared.
endorsements[].source_urlURL · nullableThe public source for the endorsement.
research.trivia[]arrayCited, editorially reviewed facts about the film.
trivia[].text_es / text_enstringSpanish and English versions of the fact.
trivia[].categorystringThe trivia topic or editorial category.
trivia[].spoiler_safebooleanWhether the text can be shown without revealing plot-sensitive information.
trivia[].source_urlURL · nullableThe public evidence source.
Identity, comparisons and film relationships
FieldTypeMeaning
research.geographic_identities[]arrayEvidence-based national or world-region identities associated with the film.
geographic_identities[].country / country_code / world_regionstring · nullableThe normalized country, code, and broader region.
geographic_identities[].identity_typestringHow the identity applies, such as production, cultural, authorial, or narrative.
geographic_identities[].is_primarybooleanWhether it is a principal geographic identity.
geographic_identities[].strengthnumber · nullableThe editorial confidence or relevance score.
geographic_identities[].evidence / source_urlstring / URL · nullableThe reasoning and its public evidence source.
research.regional_identities[]arraySubnational or local identities associated with the film.
regional_identities[].region / region_code / localitystringThe region, optional normalized code, and optional locality.
regional_identities[].identity_typestringHow the regional identity applies.
regional_identities[].is_primary / strengthboolean / numberWhether it is primary and its optional editorial strength.
regional_identities[].evidence / source_urlstring / URL · nullableThe reasoning and its public evidence source.
research.comparables[]arrayDirect recommendations selected by an AI research agent while researching this film. These are explicit recommendations, not algorithmic similarity results.
comparables[].title / yearstring / integerThe comparable film's title and optional year.
comparables[].rationalestringWhy the two films are meaningfully comparable.
comparables[].film_idinteger · nullableThe FDB film ID when the resolved recommendation is present in this snapshot.
comparables[].tmdb_idinteger · nullableThe resolved film's TMDB identifier when known.
research.relations[]arrayExplicit structural relationships to another FDB film.
relations[].film_idinteger · nullableThe related FDB film when it is present in this snapshot.
relations[].tmdb_idinteger · nullableThe related film's TMDB lookup identifier when known. Every relation has at least one of film_id or tmdb_id.
relations[].relationstringThe relationship type, such as remake or sequel.
research.series[]arrayNamed franchises, cycles, or series containing the film.
series[].name / slugstringThe series display name and stable identifier.
series[].positioninteger · nullableThe film's known order within the series.
series[].wikidata_urlURL · nullableA Wikidata identity link for the series.
research.similarity_neighbours[]array · maximum 10Up to ten films calculated by Madrid Film Calendar's internal semantic-similarity algorithm. No AI agent explicitly selected each pair; inclusion is not an editorial endorsement.
similarity_neighbours[].film_idinteger · nullableThe similar FDB film when it is present in this snapshot.
similarity_neighbours[].tmdb_idinteger · nullableThe similar film's TMDB lookup identifier when known. Every neighbour has at least one of film_id or tmdb_id.
similarity_neighbours[].rankinteger · 1–10Rank within the eligible neighbours published for this film.
similarity_neighbours[].similaritynumber · −1–1An internal relative semantic-similarity signal, not a probability or quality score.
Current pointer and manifest
FieldTypeMeaning
current.api_versionconstantAlways v1 for this contract.
current.snapshot_versionstringThe immutable release identifier consumers should store to detect changes.
current.published_atUTC datetimeWhen this snapshot became the current public version.
current.manifest_urlURLThe immutable manifest describing the current snapshot.
current.manifest_sha256SHA-256The lowercase hexadecimal checksum for verifying the manifest bytes.
manifest.api_versionconstantThe manifest contract version.
manifest.snapshot_versionstringThe immutable version described by this manifest.
manifest.generated_atUTC datetimeWhen the snapshot data was generated.
manifest.datasets.upcoming_filmsobjectCounts and ID bounds for the upcoming-films dataset.
datasets.upcoming_films.record_countintegerThe number of NDJSON records and therefore upcoming films.
datasets.upcoming_films.screening_countintegerThe total nested screening count across every record.
datasets.upcoming_films.first_id / last_idinteger · nullableThe first and last film IDs in canonical record order.
manifest.licenseobjectMachine-readable license, attribution, scope, and exclusions.
manifest.license.identifierstringThe dataset license identifier.
manifest.license.urlURLThe canonical license text.
manifest.license.attributionstringThe exact attribution text consumers should reproduce.
manifest.license.scopestringWhat Madrid Film Calendar rights the license covers.
manifest.license.excludedstring arrayContent explicitly outside the snapshot license.
manifest.files[]arrayThe plain NDJSON and gzip representations of this dataset, with verification metadata.
manifest.files[].pathstringThe snapshot-relative filename.
manifest.files[].formatconstantAlways ndjson.
manifest.files[].content_typeenumEither application/x-ndjson or application/gzip.
manifest.files[].compressionenumEither none or gzip.
manifest.files[].bytesintegerThe exact object size in bytes.
manifest.files[].sha256SHA-256The checksum consumers should verify before decompressing or parsing.

Examples

Code examples

Python
import gzip, hashlib, json, os, requests

base = "https://data.madridfilmcalendar.com"
auth = {"Authorization": f"Bearer {os.environ['MFC_PARTNER_API_KEY']}"}
current = requests.get(
    f"{base}/v1/current.json", headers=auth
).json()
manifest = requests.get(
    current["manifest_url"], headers=auth
).json()
file = next(
    x for x in manifest["files"]
    if x["path"] == "upcoming-films.ndjson.gz"
)
url = current["manifest_url"].replace(
    "manifest.json", file["path"]
)
redirect = requests.get(
    url, headers=auth, allow_redirects=False
)
redirect.raise_for_status()
# Deliberately omit Authorization on the cross-host signed request.
payload = requests.get(redirect.headers["Location"]).content
assert hashlib.sha256(payload).hexdigest() == file["sha256"]

for line in gzip.decompress(payload).decode("utf-8").splitlines():
    record = json.loads(line)
    film = record["film"]
    print(
        film["id"],
        film["title"]["original"],
        len(record["screenings"]),
    )

API contract

Contract rules

Canonical IDs
Film and screening IDs belong to FDB and remain numeric in v1.
Madrid time
showtime_local is paired with timezone: Europe/Madrid.
First-party links
film_url opens the film page. screening_url opens that page with the exact session modal, where the genuine cinema ticket/info action is shown. Static UTM parameters identify partner API referrals.
Immutable versions
Published snapshot files never change. Corrections create a new version.
Breaking changes
Fields may be added compatibly within v1. Removing or changing meaning requires v2.

Snapshots

Versioning and updates

Store the last snapshot_version you processed. If it has not changed, there is nothing to download. When a film or screening is corrected, a new immutable version is published and current.json moves to it.

Compare the dataset's SHA-256 value in the manifest with the previous version to avoid processing unchanged content.

Terms

License and corrections

The snapshot dataset is licensed under Creative Commons Attribution 4.0. You may copy, modify, redistribute and use it commercially. When sharing the data or a substantial part of it, include the attribution from the active manifest and indicate your changes.

Attribution: Madrid Film Calendar FDB — https://data.madridfilmcalendar.com — licensed under CC BY 4.0. Snapshot: {snapshot_version}.

The license applies to Madrid Film Calendar's rights in the exported snapshot compilation, original research summaries and records. Citation links identify third-party evidence; they do not license those pages or their content. Madrid Film Calendar names, logos and trademarks are not licensed. Posters, licensed synopsis text, third-party ratings and other separately licensed material are excluded from this API. The manifest repeats this scope in machine-readable form.

The data is provided as-is, without warranty or endorsement by listed cinemas. To report an error, rights concern or removal request, email madridfilmcalendar@gmail.com; accepted corrections are published as a new immutable snapshot.

For machine-readable details, use the OpenAPI document and the published upcoming-film record schema.