Rotten Tomatoes API endpoint
Returns the details of up to 20 Rotten Tomatoes movies in one call, in the order requested. Each entry carries the title, synopsis, path and URL, `ems_id`, runtime, release date/year, production companies, the release runs with distributors, the Tomatometer and Popcornmeter scores, the score variants for all critics, top critics, all audience and verified audience, the critics and audience consensus, and `where_to_watch`: the public streaming, rental and purchase offers with provider name, link, licence, quality, price and availability date. Those are public provider pages, not playable media URLs. Identifiers that resolve to nothing are listed in `data.not_found` instead of failing the call. Pass exactly one of `ids` (Rotten Tomatoes `ems_id` values) or `paths` (Rotten Tomatoes movie paths or URLs); the `paths` form resolves each path first, so it costs one extra upstream read per path. The headline Tomatometer and Popcornmeter carry no counts; review and rating counts are in the score variants (for the number of critic reviews read `scores.critics_all.review_count`). Review samples are not returned here: use `/rottentomatoes/movie/reviews` for reviews. `data.fetched_at` is the UTC fetch time.
/rottentomatoes/moviesids: comma-separated Rotten Tomatoes ems_id values, 1 to 20, as returned by the other Rotten Tomatoes endpoints (for example d5639ed5-2dfe-44a3-8ed2-1cb3ea99855f).paths: comma-separated movie paths or absolute https://www.rottentomatoes.com movie URLs, 1 to 20 (for example /m/clayface). Each path is resolved to its ems_id first, a few at a time, so this form is slower than ids.Pass exactly one of ids or paths. Repeated values, and different paths that name the same title, are returned once.
data.movies and listed in data.not_found, in request order; the rest of the batch is still returned. If nothing resolves the call returns 404.ems_id, path, url, title, description, media_type (always Movie), release_date, release_year, runtime_minutes, rotten_tomatoes_id, fandango_id, poster_url, image_url, production_companies and releases (date, type, country and distributors per run).critics_score and audience_score are the headline Tomatometer and Popcornmeter as the title page shows them (score, sentiment, certified, average rating). The upstream attaches no counts to them.scores holds the four variants that do carry counts: critics_all, critics_top, audience_all and audience_verified. Each has review_count, rating_count, liked_count and not_liked_count where the upstream reports them; a reported 0 is returned as 0, and a count the upstream omits is absent. To follow how many critic reviews a title has, read scores.critics_all.review_count.critics_consensus and audience_consensus are the consensus sentences when the title has them. has_critics_all, has_critics_top, has_audience_all and has_audience_verified say whether those review lists exist.lifecycle is the title's current release stage (for example IN_THEATERS) and call_to_action the primary button the title page shows.where_to_watch[] lists the public places the title can be watched or bought: name, provider_id, title, url, license, quality, price, availability_date and preorder, each present when the provider reports it. license is one of stream, rent, purchase, buy tickets or preorder. The url is the provider's public page, not a playable media URL, and price is as the provider lists it, without a currency symbol./api/v1/rottentomatoes/movie/reviews for a title's reviews.data.fetched_at is the UTC time, to the second, when the data was read. A reused response keeps its original time.X-Cache is miss for a live read and hit for a reused response; X-Availability-Last-Success-At and X-Availability-Last-Success-Age-Seconds give the same instant and its age.| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| ids | string | No | Comma-separated Rotten Tomatoes ems_id values, 1 to 20 | d5639ed5-2dfe-44a3-8ed2-1cb3ea99855f | |
| paths | string | No | Comma-separated Rotten Tomatoes movie paths or URLs, 1 to 20 | /m/clayface | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/rottentomatoes/movies" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"movies": [
{
"ems_id": "d5639ed5-2dfe-44a3-8ed2-1cb3ea99855f",
"path": "/m/clayface",
"url": "https://www.rottentomatoes.com/m/clayface",
"title": "Clayface",
"description": "\"Clayface\" unravels one man's horrifying descent from rising Hollywood star to\nrevenge-filled monster in a story that explores the loss of one's identity and humanity,\ncorrosive love, and the dark underbelly of scientific ambition.",
"media_type": "Movie",
"release_date": "2026-10-23",
"release_year": "2026",
"runtime_minutes": 108,
"rotten_tomatoes_id": "900109434",
"fandango_id": "244768",
"poster_url": "https://resizing.flixster.com/3ZvkmVoGsbasxSX66ydiWVCS7dY=/206x305/v2/https://resizing.flixster.com/O8G8HZEBw1uKp4Sc2X4VFjg0KUI=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2M0MzFlZWJlLTc1NWUtNGQ0YS1iYjc5LTZlZTRhZTBhNWU5YS5qcGc=",
"image_url": "https://resizing.flixster.com/O8G8HZEBw1uKp4Sc2X4VFjg0KUI=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2M0MzFlZWJlLTc1NWUtNGQ0YS1iYjc5LTZlZTRhZTBhNWU5YS5qcGc=",
"production_companies": [
"6th & Idaho Productions",
"DC Studios"
],
"releases": [
{
"date": "2026-10-23",
"type": "WIDE",
"country": "USA",
"distributors": [
"Warner Bros. Pictures"
]
}
],
"critics_score": {
"score": 77,
"score_percent": "77%",
"sentiment": "POSITIVE",
"certified": true
},
"audience_score": {
"score": 94,
"score_percent": "94%",
"sentiment": "POSITIVE",
"certified": true,
"score_type": "VERIFIED"
},
"scores": {
"critics_all": {
"score": 77,
"score_percent": "77%",
"sentiment": "POSITIVE",
"average_rating": "6.60",
"rating_count": 193,
"review_count": 193,
"liked_count": 148,
"not_liked_count": 45,
"certified": true
},
"critics_top": {
"score": 72,
"score_percent": "72%",
"sentiment": "POSITIVE",
"average_rating": "6.20",
"rating_count": 36,
"review_count": 36,
"liked_count": 26,
"not_liked_count": 10,
"certified": true
},
"audience_all": {
"score": 94,
"score_percent": "94%",
"sentiment": "POSITIVE",
"average_rating": "4.5",
"review_count": 2866,
"liked_count": 7632,
"not_liked_count": 526,
"certified": true,
"score_type": "ALL",
"banded_rating_count": "5,000+"
},
"audience_verified": {
"score": 94,
"score_percent": "94%",
"sentiment": "POSITIVE",
"average_rating": "4.4",
"review_count": 983,
"liked_count": 3406,
"not_liked_count": 225,
"certified": true,
"score_type": "VERIFIED",
"banded_rating_count": "2,500+"
}
},
"critics_consensus": "Carving out a unique identity for itself in the DCU while closely resembling a litany of body horror classics, <em>Clayface</em> takes time to get going until it eventually morphs into an icky and satisfying revenge thriller.",
"audience_consensus": "A refreshingly twisted tale of revenge, <em>Clayface</em> is a horror-fueled comic book adaptation that breaks from conventions while still delivering a satisfying emotional core.",
"where_to_watch": [
{
"name": "Fandango",
"provider_id": "fandango",
"license": "buy tickets"
},
{
"name": "Fandango",
"provider_id": "70906",
"title": "Clayface",
"url": "https://athome.fandango.com/content/browse/details/Clayface/5147269",
"license": "purchase",
"quality": "UHD",
"price": "24.99",
"availability_date": "2026-12-07T20:00:00",
"preorder": true
}
],
"call_to_action": {
"button_text": "Buy Tickets",
"window_text": "Now in Theaters",
"name": "Fandango",
"lifecycle_date": "2026-10-23"
},
"lifecycle": {
"lifecycle": "IN_THEATERS",
"date": "2026-10-23"
},
"has_critics_all": true,
"has_critics_top": true,
"has_audience_all": true,
"has_audience_verified": true
}
],
"not_found": [
"00000000-0000-4000-8000-000000000000"
],
"fetched_at": "2026-10-30T02:15:04Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/rottentomatoes.moviesBatchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | rottentomatoes.BatchMoviesResponse | No | ||||
| data.fetched_at | string | No | 2026-10-30T00:12:00Z | UTC time, to the second, when the data was fetched. | ||
| data.movies | array | No | Movie details, in the order the identifiers were requested. | |||
| data.movies[].audience_consensus | string | No | Audience consensus sentence, when the title has one. | |||
| data.movies[].audience_score | object | No | Popcornmeter score as the movie page shows it. | |||
| data.movies[].audience_score.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].audience_score.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].audience_score.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].audience_score.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].audience_score.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].audience_score.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].audience_score.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].audience_score.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].audience_score.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].audience_score.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].audience_score.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].audience_score.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].audience_score.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].call_to_action | object | No | Primary call to action shown for the title, such as a ticket link. | |||
| data.movies[].call_to_action.button_text | string | No | Button label, such as `Buy Tickets`. | |||
| data.movies[].call_to_action.lifecycle_date | string | No | Lifecycle date behind the action, such as `2026-10-23`. | |||
| data.movies[].call_to_action.name | string | No | Provider the action goes to. | |||
| data.movies[].call_to_action.window_text | string | No | Supporting text, such as `Now in Theaters`. | |||
| data.movies[].critics_consensus | string | No | Critics consensus sentence, when the title has one. | |||
| data.movies[].critics_score | object | No | Tomatometer score as the movie page shows it. | |||
| data.movies[].critics_score.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].critics_score.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].critics_score.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].critics_score.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].critics_score.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].critics_score.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].critics_score.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].critics_score.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].critics_score.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].critics_score.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].critics_score.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].critics_score.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].critics_score.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].description | string | No | Short synopsis of the movie. | |||
| data.movies[].ems_id | string | No | Rotten Tomatoes' own unique id of the movie. | |||
| data.movies[].fandango_id | string | No | Fandango's numeric movie id. | |||
| data.movies[].has_audience_all | boolean | No | true | Whether audience reviews and ratings exist at all, and for verified ticket holders only. | ||
| data.movies[].has_audience_verified | boolean | No | true | |||
| data.movies[].has_critics_all | boolean | No | true | Whether critic reviews exist at all, and for top critics only. | ||
| data.movies[].has_critics_top | boolean | No | true | |||
| data.movies[].image_url | string | No | URL of the primary image. | |||
| data.movies[].lifecycle | object | No | Current lifecycle of the title, such as `IN_THEATERS`. | |||
| data.movies[].lifecycle.date | string | No | Date the stage began, such as `2026-10-23`. | |||
| data.movies[].lifecycle.lifecycle | string | No | Lifecycle stage, such as `IN_THEATERS` or `AT_HOME`. | |||
| data.movies[].media_type | string | No | Movie | Kind of title, always `Movie` here. | ||
| data.movies[].path | string | No | Rotten Tomatoes path of the movie, such as `/m/clayface`. | |||
| data.movies[].poster_url | string | No | URL of the poster image. | |||
| data.movies[].production_companies | array | No | Production companies behind the movie. | |||
| data.movies[].release_date | string | No | Release date of the movie in the United States, such as `2026-10-23`. | |||
| data.movies[].release_year | string | No | Year of release, such as `2026`. | |||
| data.movies[].releases | array | No | Release runs, by country and type. | |||
| data.movies[].releases[].country | string | No | Country of the release, such as `USA`. | |||
| data.movies[].releases[].date | string | No | Release date, such as `2026-10-23`. | |||
| data.movies[].releases[].distributors | array | No | Distributors of the release. | |||
| data.movies[].releases[].type | string | No | Release type, such as `WIDE` or `LIMITED`. | |||
| data.movies[].rotten_tomatoes_id | string | No | Rotten Tomatoes' legacy numeric movie id. | |||
| data.movies[].runtime_minutes | integer | No | Runtime in minutes. | |||
| data.movies[].scores | object | No | Every score variant the upstream reports: all critics, top critics, all audience and verified audience. | |||
| data.movies[].scores.audience_all | object | No | Every audience rating. | |||
| data.movies[].scores.audience_all.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].scores.audience_all.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].scores.audience_all.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].scores.audience_all.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].scores.audience_all.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].scores.audience_all.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].scores.audience_all.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].scores.audience_all.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].scores.audience_all.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].scores.audience_all.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].scores.audience_all.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].scores.audience_all.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].scores.audience_all.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].scores.audience_verified | object | No | Verified ticket holders only. | |||
| data.movies[].scores.audience_verified.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].scores.audience_verified.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].scores.audience_verified.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].scores.audience_verified.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].scores.audience_verified.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].scores.audience_verified.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].scores.audience_verified.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].scores.audience_verified.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].scores.audience_verified.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].scores.audience_verified.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].scores.audience_verified.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].scores.audience_verified.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].scores.audience_verified.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].scores.critics_all | object | No | All critics. | |||
| data.movies[].scores.critics_all.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].scores.critics_all.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].scores.critics_all.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].scores.critics_all.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].scores.critics_all.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].scores.critics_all.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].scores.critics_all.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].scores.critics_all.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].scores.critics_all.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].scores.critics_all.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].scores.critics_all.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].scores.critics_all.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].scores.critics_all.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].scores.critics_top | object | No | Top critics only. | |||
| data.movies[].scores.critics_top.average_rating | string | No | 8.40 | Average rating as shown on the scorecard, such as `8.40`. | ||
| data.movies[].scores.critics_top.banded_rating_count | string | No | 250,000+ Ratings | Approximate number of ratings as shown on the page, such as `250,000+ Ratings`. | ||
| data.movies[].scores.critics_top.certified | boolean | No | true | Whether Rotten Tomatoes marks the score as certified. | ||
| data.movies[].scores.critics_top.liked_count | integer | No | 314 | Number of ratings that liked the title. | ||
| data.movies[].scores.critics_top.not_liked_count | integer | No | 49 | Number of ratings that did not like the title. | ||
| data.movies[].scores.critics_top.rating_count | integer | No | 363 | Number of ratings behind the score. | ||
| data.movies[].scores.critics_top.review_count | integer | No | 363 | Number of reviews behind the score. | ||
| data.movies[].scores.critics_top.reviews_page_url | string | No | https://www.rottentomatoes.com/m/inception/reviews | URL of the Rotten Tomatoes page that lists the reviews behind this score. | ||
| data.movies[].scores.critics_top.score | integer | No | 87 | Score as a whole-number percentage. | ||
| data.movies[].scores.critics_top.score_percent | string | No | 87% | Score as text with a percent sign, such as `87%`. | ||
| data.movies[].scores.critics_top.score_type | string | No | ALL | Audience group the score covers, such as `ALL` or `VERIFIED`. | ||
| data.movies[].scores.critics_top.sentiment | string | No | POSITIVE | Overall sentiment of the score, such as `POSITIVE`. | ||
| data.movies[].scores.critics_top.title | string | No | Tomatometer | Name of the score, such as `Tomatometer` or `Popcornmeter`. | ||
| data.movies[].title | string | No | Title of the movie. | |||
| data.movies[].url | string | No | Rotten Tomatoes page URL of the movie. | |||
| data.movies[].where_to_watch | array | No | Where the title can be streamed, rented or bought. Public provider links only; no playable media URL is returned. | |||
| data.movies[].where_to_watch[].availability_date | string | No | Date the offer becomes available, such as `2026-12-07`. | |||
| data.movies[].where_to_watch[].license | string | No | stream, rent, purchase, buy tickets, preorder | How the title is offered: `stream`, `rent`, `purchase`, `buy tickets` or `preorder`. | ||
| data.movies[].where_to_watch[].name | string | No | Provider name, such as `Fandango`. | |||
| data.movies[].where_to_watch[].preorder | boolean | No | Whether the offer is a preorder. | |||
| data.movies[].where_to_watch[].price | string | No | Price of the offer as the provider lists it, without a currency symbol. | |||
| data.movies[].where_to_watch[].provider_id | string | No | Provider id when the upstream reports one. | |||
| data.movies[].where_to_watch[].quality | string | No | Video quality of the offer, such as `UHD` or `HD`. | |||
| data.movies[].where_to_watch[].title | string | No | Title as the offer lists it. | |||
| data.movies[].where_to_watch[].url | string | No | Public provider page for the offer. | |||
| data.not_found | array | No | Identifiers that resolved to no movie, in request order. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/rottentomatoes/movies" \
-H "x-api-key: $CRAWLORA_API_KEY"