Tony Wang6 min readHow to Scrape Box Office Mojo in 2026 (API & Python)
Box Office Mojo has no public API. Pull grosses, weekend charts, and franchise data via DIY scraping, an enterprise license, or a structured API.
The honest answer up front: Box Office Mojo doesn't offer a public API to sign up for. It's owned by IMDb, which is owned by Amazon, and the only official route to its box-office numbers is an enterprise data license sold through AWS Data Exchange — not something a solo developer requests over a weekend. This guide covers what DIY scraping actually looks like, what the licensed path costs, and a structured API that returns Box Office Mojo's grosses, charts, and franchise rollups as normalized JSON.
Why scrape Box Office Mojo data?
Box Office Mojo is the reference source most film/TV and finance tooling reaches for when the question is "how much money did this make," which feeds:
- Box-office trend research — track how a title, genre, or release window performs against historical norms.
- Franchise and studio performance analysis — roll up lifetime grosses by franchise, brand (studio/production company), or genre.
- Weekend chart tracking — follow the domestic weekend top 10, by-distributor market share, and estimate-vs-actual accuracy.
- Market research and journalism — cite verified grosses instead of estimates pulled from social posts or press releases.
- AI and analytics pipelines — feed a normalized box-office dataset into a forecasting model or a media-industry dashboard.
Is it legal to scrape Box Office Mojo?
Option 1: DIY in Python (and why it breaks)
Box Office Mojo's pages are still largely server-rendered HTML tables, so a DIY scraper parses rows out of the markup:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.boxofficemojo.com/year/2025/",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
rows = soup.select("table tr")
# Rank, release title, and gross figures live in <td> cells with
# formatted currency strings ("$423,778,855") you have to re-parse to int
It demos and then breaks:
- The Conditions of Use name this activity directly. Unlike sites that only restrict a login-walled feature, Box Office Mojo's terms explicitly prohibit data mining and screen scraping — real risk, not a theoretical one.
- Amazon-grade anti-bot. Box Office Mojo sits behind the same infrastructure as IMDb; naive clients and datacenter IPs get rate-limited or blocked quickly.
- Formatted, not raw, numbers. Every gross figure renders as a currency string (
$423,778,855) inside a table cell — you re-parse that into an integer yourself, and table structure shifts between the weekend, yearly, and title-detail page templates. - Everything paginates or fans out separately. Franchise, brand, genre, and showdown rollups each live on their own page, and a single title's full release history spans a separate release-group sub-page.
Option 2: No-code / ready-made tools
Marketplace scraper actors exist for Box Office Mojo's public pages and can produce a one-off CSV export for a report or spreadsheet. They carry the same Conditions of Use exposure as DIY scraping, don't solve the "formatted currency string to integer" parsing problem for you, and are awkward to run on a recurring schedule alongside other platforms.
Option 3: A structured Box Office Mojo API
If you want Box Office Mojo's grosses as clean, typed JSON — with the currency strings already parsed into numbers — a Box Office Mojo API gives you that. Start with a year's domestic chart, no id required:
curl "https://api.crawlora.net/api/v1/boxofficemojo/year/domestic?year=2025" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"year": 2025,
"grosses_option": "calendar_grosses",
"results": [
{ "rank": 1, "release": "Lilo & Stitch", "gross_raw": "$423,778,855" }
],
"public_page_derived": true
}
}
Then pull title detail, a weekend chart, the all-time lifetime list, and a franchise rollup in Python — titles use the same tt-prefixed id as IMDb:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/boxofficemojo"
title = requests.get(f"{base}/title", headers=h, params={"id": "tt0499549"}).json()["data"]
weekend = requests.get(f"{base}/weekend/domestic", headers=h, params={"year": 2025, "week": 52}).json()["data"]
lifetime = requests.get(f"{base}/lifetime-grosses", headers=h, params={"area": "worldwide"}).json()["data"]
franchise = requests.get(f"{base}/franchise", headers=h, params={"id": "fr541495045"}).json()["data"]
Title detail groups every theatrical and re-release under one record (real fields — check the docs):
{
"code": 200,
"msg": "OK",
"data": {
"title": "Avatar",
"title_id": "tt0499549",
"release_groups": [
{ "name": "Original Release", "markets": "77 markets", "worldwide": 2743577587, "worldwide_raw": "$2,743,577,587" }
],
"public_page_derived": true
}
}
A weekend chart returns the ranked top releases for that year and ISO week:
{
"code": 200,
"msg": "OK",
"data": {
"year": 2025,
"week": 52,
"results": [
{ "rank": 1, "release": "Avatar: Fire and Ash", "gross_raw": "$63,087,667" }
],
"public_page_derived": true
}
}
Franchise rollups (/boxofficemojo/franchise) and brand rollups (/boxofficemojo/brand) return every release under that grouping with a summary.movie_count and summary.top_release; /boxofficemojo/franchises, /brands, and /genres list every available grouping and id to drill into. /boxofficemojo/calendar and /calendar/date cover upcoming release scheduling, /weekend/domestic/estimates compares Friday estimates against Sunday actuals, and /date/domestic and /showdown cover daily grosses and head-to-head franchise comparisons. Store one row per release (or per weekend) and re-run on a schedule.
What you can collect
Public box-office figures: yearly domestic and worldwide charts; weekend domestic charts (ranked, by-distributor, and estimate-vs-actual); daily domestic grosses by date; title detail with every release group and market breakdown; all-time lifetime-gross rankings (domestic, international, or worldwide); franchise, brand (studio), and genre rollups with movie counts and lifetime totals; release-calendar scheduling and change history; and showdown (franchise-vs-franchise) comparisons.
Limitations
- The Conditions of Use are explicit and enforced. Scope any project to public reference figures, never bulk-republish content elsewhere on the web, and get written permission for large-scale commercial use.
- No self-serve API tier. The only official commercial path is IMDb's enterprise AWS Data Exchange licensing — there's no equivalent of TMDB's free key or IMDb's non-commercial TSV datasets for Box Office Mojo specifically.
- Currency strings, not raw numbers, on the page. Every gross renders as formatted text; parsing it yourself means handling commas, dollar signs, and the occasional "N/A" for unreleased or unreported figures.
- Ids aren't all uniform. Titles reuse IMDb's
ttid, but franchises, brands, genres, showdowns, and releases each use their own prefixed id you discover from the corresponding list endpoint first. - Public data only. This collects the same grosses Box Office Mojo already publishes on its public pages — never a way around its licensing terms or a full database rebuild.
Where this gets used
- Box-office analytics dashboards — track weekend performance and year-over-year trends.
- Franchise and studio scorecards — compare lifetime grosses across a studio's or franchise's full release history.
- Media and finance journalism — cite verified grosses instead of estimates.
- Cross-platform reception research — pair box-office performance with TMDB or IMDb rating data, or Rotten Tomatoes critic scores, to see how money and reception actually correlate.
Sources
Start collecting
Try it first, free: run any public URL through the Free Web Scraper, or check whether a site blocks bots with the Anti-Bot Checker — no signup.
Test the year, weekend, and title endpoints in the Playground, check the schema in the API docs, and review pricing. Box Office Mojo tells you what a title actually earned; TMDB adds catalog and cast metadata, and Rotten Tomatoes adds critic and audience scores — pair grosses with reception data instead of trusting either alone. See also how to choose a web scraping API and is web scraping legal.
Part of our how-to-scrape guide series — every platform we cover, in one index.
Frequently asked questions
Does Box Office Mojo have a public API?
No. Box Office Mojo does not offer a self-serve developer API. It has operated as part of IMDb since 2008, and the only official commercial data route is IMDb's enterprise licensing through AWS Data Exchange ("IMDb and Box Office Mojo for Movies/TV/OTT"), which is priced and scoped for enterprise buyers rather than solo developers.
Is it legal to scrape Box Office Mojo?
Box Office Mojo's Conditions of Use explicitly prohibit data mining, robots, and screen scraping without express written consent, and its robots.txt blocks all crawlers except a named allowlist. Treat any collection as scoped to public reference figures, avoid republishing content elsewhere, and seek written permission for large-scale or commercial use. This is not legal advice.
How do I find a title's Box Office Mojo id?
Titles use the same tt-prefixed id as IMDb (for example tt0499549 for Avatar), so you can resolve a title through IMDb search first and reuse that id directly against Box Office Mojo's title endpoint. Franchises, brands (studios), genres, and showdowns use their own prefixed ids, discoverable from the corresponding list endpoint (franchises, brands, genres, showdowns).
What box-office data can I actually collect?
Yearly domestic and worldwide charts, weekend domestic charts (ranked, by-distributor, and estimate-vs-actual), daily grosses by date, full title detail with release-group market breakdowns, all-time lifetime-gross rankings, franchise/brand/genre rollups with movie counts and lifetime totals, release-calendar scheduling, and franchise-vs-franchise showdown comparisons.
Why does Box Office Mojo show gross figures as formatted currency strings?
The public site renders every gross as display text (for example "$423,778,855") inside a table cell rather than a raw number, so a DIY scraper has to strip commas and dollar signs and re-parse each figure into an integer itself — and handle the occasional "N/A" for unreleased or unreported grosses.
How is Box Office Mojo different from IMDb or TMDB for scraping purposes?
IMDb and TMDB primarily cover catalog metadata, cast/crew, and ratings. Box Office Mojo is specifically financial performance data — grosses, weekend charts, and franchise/studio rollups — not reviews or star ratings. Pairing Box Office Mojo's numbers with IMDb or TMDB's catalog and rating data gives a fuller picture of what a title earned versus how it was received.
Can I use a structured API instead of scraping Box Office Mojo myself?
Yes. A structured Box Office Mojo API returns the site's grosses, weekend charts, and franchise/brand/genre rollups as normalized JSON with currency figures already parsed into numbers, avoiding the parsing upkeep and Conditions of Use exposure of scraping the site's HTML directly.