# amodb vs TMDB

> amodb keeps TMDB v3 paths, query parameters and JSON for most read endpoints, so a client needs a new base URL and key. Writes answer 405, and changes, aggregate credits and review lookups are not offered. Other differences are terms, 14 languages, five extensions and per-key limits.

## The short comparison

amodb is an independent API that speaks the same protocol as TMDB v3. A client written for TMDB reads from amodb after you change the base URL and the key, as long as it does not call a path from the not offered table below. The choice is therefore about terms, extras and a few gaps. TMDB offers a free API for qualifying use under its own terms. amodb is a read only, paid API with 14 languages, five extra data blocks and a limit counted per key.

## Endpoint parity

Each row shows a TMDB v3 read path and how it behaves on `https://api.amodb.dev/3`.

| Area                   | TMDB v3 path                             | On amodb                                                                                                     |
| ---------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Movie details          | `/movie/{movie_id}`                      | Same, with five more `append_to_response` values                                                             |
| TV details             | `/tv/{series_id}`                        | Same, but no `type` field, and `created_by` is empty for most series                                         |
| Seasons and episodes   | `/tv/{series_id}/season/{season_number}` | Same shape. Season images, videos and translations are empty, and season and episode `external_ids` are null |
| People                 | `/person/{person_id}`                    | Same, with `combined_credits`, `movie_credits`, `tv_credits`, `external_ids` and `images` (profiles only)    |
| Credits                | `/movie/{movie_id}/credits`              | Same. On episodes, `cast` is empty                                                                           |
| Search                 | `/search/multi`                          | Same, cached 10 minutes                                                                                      |
| Discover               | `/discover/movie`                        | Same, cached 30 minutes                                                                                      |
| Trending               | `/trending/{media_type}/{time_window}`   | Same, cached 30 minutes                                                                                      |
| Lists                  | `/movie/popular`                         | Same, `page` from 1 to 500                                                                                   |
| Images                 | `/movie/{movie_id}/images`               | Same shape, files load from `img.amodb.dev`                                                                  |
| Videos                 | `/movie/{movie_id}/videos`               | Same                                                                                                         |
| Translations           | `/movie/{movie_id}/translations`         | Same, 14 languages served                                                                                    |
| Keywords               | `/movie/{movie_id}/keywords`             | Same                                                                                                         |
| Reviews                | `/movie/{movie_id}/reviews`              | Answers 200, but only a few titles have reviews, so an empty list is normal                                  |
| Collections            | `/collection/{collection_id}`            | Same, `parts` ordered by release date                                                                        |
| Companies and networks | `/company/{company_id}`                  | Same keys. A company `description` is empty and `parent_company` is null                                     |
| Genres                 | `/genre/movie/list`                      | Same                                                                                                         |
| Configuration          | `/configuration`                         | Same keys, image host is `img.amodb.dev`                                                                     |
| Find by external id    | `/find/{external_id}`                    | Same endpoint, plus `kinopoisk_id`. `tv_episode_results` and `tv_season_results` are always empty            |
| Episode groups         | `/tv/{series_id}/episode_groups`         | Lists the groups of a show, without their contents                                                           |

## Not offered on amodb

These TMDB v3 calls have no equivalent. Unknown paths answer 404 with `status_code` 34, and write methods answer 405 with `status_code` 37.

| TMDB v3 call                                                                                                          | amodb answer          |
| --------------------------------------------------------------------------------------------------------------------- | --------------------- |
| `/movie/changes`, `/tv/changes`, `/person/changes` and `changes` under one id                                         | 404, `status_code` 34 |
| `aggregate_credits` under a series or a season                                                                        | 404, `status_code` 34 |
| `/credit/{credit_id}` and `/review/{review_id}`                                                                       | 404, `status_code` 34 |
| `/tv/episode_group/{id}`                                                                                              | 404, `status_code` 34 |
| `/person/{person_id}/translations`, `tagged_images` and `/person/latest`                                              | 404, `status_code` 34 |
| `images`, `translations` and `alternative_names` for collections, companies and networks                              | 404, `status_code` 34 |
| `/configuration/timezones`                                                                                            | 404, `status_code` 34 |
| Everything under `account`, `authentication`, `guest_session` and `list`, and any `/rating` or `/account_states` path | 405, `status_code` 37 |

If you add `aggregate_credits` or `changes` to `append_to_response`, amodb ignores the name without an error, so the key is simply missing from the body.

## Feature comparison

| Feature         | TMDB                                                 | amodb                                                 |
| --------------- | ---------------------------------------------------- | ----------------------------------------------------- |
| Pricing model   | Free for qualifying use, under TMDB terms            | Prepaid, 1 to 24 months per purchase                  |
| Free tier       | Yes, for qualifying use                              | None, and no trial                                    |
| Authentication  | v3 key in `api_key`, or v4 token as Bearer           | `api_key` or Bearer with a 32 character hex key       |
| Response format | JSON                                                 | JSON, same fields on the paths it serves              |
| Languages       | Check their docs                                     | 14 served, other tags fall back to `en`               |
| Movies          | Yes                                                  | Yes                                                   |
| TV              | Yes                                                  | Yes                                                   |
| People          | Yes                                                  | Yes                                                   |
| Images          | Yes                                                  | `img.amodb.dev`, sizes `w92` to `original`            |
| Ratings         | TMDB user score, other sources: check their docs     | Five sources in one object where known                |
| Write methods   | Account, list and rating methods                     | None, they answer 405                                 |
| Rate limit      | Check their docs                                     | 20, 40 or 120 per minute per key                      |
| Commercial use  | Check their terms for commercial use and attribution | Paid plans, see [pricing](https://amodb.dev/pricing/) |
| Compatibility   | Defines TMDB v3                                      | Most TMDB v3 read paths and an OMDb route             |

## What differs in detail

- **Terms.** TMDB asks you to read its terms for commercial use and attribution. amodb is sold by prepaid period, has no automatic renewal, no free tier and no trial.
- **Languages.** amodb serves en, ru, uk, be, zh, pt, bg, he, cs, ro, fr, pl, it and es. It accepts TMDB tags such as `ru-RU` and `pt-BR`. German, Japanese and Korean fall back to `en`, while `original_title` keeps the source title. For TMDB language coverage, check their docs. See [languages](https://amodb.dev/languages/).
- **Extensions.** `append_to_response` also takes `moods`, `soundtracks`, `ratings`, `wikidata` and `showtimes`, and each has its own path under movies and series.
- **External ids.** `/3/find` resolves `imdb_id`, `tvdb_id`, `wikidata_id`, `kinopoisk_id`, `facebook_id`, `twitter_id` and `instagram_id`. The sources `freebase_mid`, `freebase_id`, `tvrage_id`, `tiktok_id` and `youtube_id` are accepted but return empty arrays. A missing or unknown `external_source` answers 400 with `status_code` 22.
- **Empty by design.** Season images, videos and translations and a company `description` are always empty. Reviews and `created_by` on a series are filled for only a few titles. Season and episode `external_ids` are all null.
- **Adult titles.** `include_adult` is ignored. Adult titles and people are never served and answer 404.
- **Images.** The CDN path is `https://img.amodb.dev/t/p/{size}/{file}`. No key is needed and files cache for 30 days.
- **Limits.** The window is a sliding 60 seconds per key. Headers show the remaining count, and cache hits still count because the limit check runs first.
- **Independence.** The catalog comes from public and open sources and our own enrichment. A shared shape does not guarantee identical values for every field of every title.

## Where TMDB is a better fit

- **Free qualifying use.** No payment is needed, and amodb cannot match that.
- **Writes.** Rating a title, building a list and account sessions work on TMDB. On amodb they return 405.
- **Changes feeds.** TMDB lists the ids that changed. amodb has no such feed, so you refresh on your own schedule.
- **Aggregate credits and credit lookups.** Both answer 404 on amodb. Use `/credits` on the title.
- **Wider language needs.** If your UI needs a language outside the 14, check TMDB first.
- **Existing approval.** A team that has cleared TMDB with legal review should weigh the cost of a second review.

## Migrate to amodb

The change is one line per request.

```bash
# before: TMDB_BASE is your current TMDB v3 base URL
curl -s "$TMDB_BASE/movie/550?api_key=$TMDB_KEY"

# after
curl -s "https://api.amodb.dev/3/movie/550?api_key=$AMODB_KEY"
```

Before cutover, compare the shape of a few responses side by side. This script prints top level keys that one side returns and the other does not.

```js
async function topLevelKeys(base, key, path) {
  const res = await fetch(`${base}${path}?api_key=${key}`);
  if (!res.ok) throw new Error(`${path} returned ${res.status}`);
  return Object.keys(await res.json()).sort();
}

for (const path of ['/movie/550', '/tv/1396', '/person/31']) {
  const current = await topLevelKeys(process.env.TMDB_BASE, process.env.TMDB_KEY, path);
  const next = await topLevelKeys('https://api.amodb.dev/3', process.env.AMODB_KEY, path);
  const missing = current.filter((k) => !next.includes(k));
  console.log(path, missing.length ? `missing: ${missing.join(', ')}` : 'same keys');
}
```

Optional fields can differ for a given title, so read a missing key as a lead to inspect, not as a verdict. Then work through this list:

1. Pick a plan on [pricing](https://amodb.dev/pricing/), then create a key in your account dashboard.
2. Move the base URL and key into configuration.
3. Read `images.secure_base_url` from `/3/configuration`.
4. Search your code for write calls and for the paths in the not offered table. Keep the writes on TMDB and replace the rest.
5. Add a 429 handler that waits `Retry-After` seconds. See [rate limits](https://amodb.dev/rate-limits/) and [errors](https://amodb.dev/errors/).

## Pricing

amodb is prepaid. Pick 1, 3, 6, 12 or 24 months, which take 0, 10, 20, 30 or 40 percent off, and one of three plans at 20, 40 or 120 requests per minute. Every plan returns all data, and none renews on its own. See [pricing](https://amodb.dev/pricing/) for amounts.

## Questions and answers

### Are all TMDB v3 read endpoints available on amodb?

No. Most read paths keep the same path, query parameters and JSON shape, and the parity table on this page groups them by area. Writes answer 405 with status_code 37. Changes feeds, aggregate credits, credit and review lookups, episode group contents and person translations answer 404 with status_code 34.

### What changes in my code when I move from TMDB?

Three things: the base URL becomes https://api.amodb.dev/3, the key becomes your amodb key, and image URLs use img.amodb.dev. Read the image base from the configuration endpoint. The paths stay the same, except for the calls listed as not offered.

### Will movie and TV ids stay the same?

Ids follow the TMDB numbering. Fight Club is 550 and Breaking Bad is 1396 on both. Values of individual fields can still differ for some titles, so compare a sample from your own catalog before cutover.

### Can I use both services together?

Yes. Because the protocol is the same, you can keep TMDB for account and list features, changes feeds and aggregate credits, and use amodb for catalog reads. Keep two base URLs and two keys in your configuration.

### Which service is cheaper?

TMDB offers a free API for qualifying use under its own terms, so it costs nothing when you qualify. amodb is paid from the first request, with prepaid periods of 1 to 24 months and a discount up to 40 percent.

## Related pages

- [TMDB API alternative](https://amodb.dev/tmdb-api-alternative/): Need a TMDB API alternative? Check terms, limits, languages and ratings, then move to a paid API that keeps most TMDB v3 read paths and JSON. See the gaps.
- [Movie database API for your own catalog](https://amodb.dev/movie-database-api/): Movie database API for your own local copy: movies, people, companies, collections and keywords with linked ids, discover date windows and id lookups.
- [Find by external id](https://amodb.dev/find-by-external-id/): Look up a movie, series or person by IMDb, TVDB, Wikidata or Kinopoisk id with the TMDB find endpoint, and read external ids and Wikidata facts for a title.
- [Authentication](https://amodb.dev/authentication/): How to send your amodb key: api_key in the query, an Authorization Bearer header, or apikey for OMDb calls. Key format, storage, rotation and the 401 errors.
- [Rate limits](https://amodb.dev/rate-limits/): amodb limits each key by requests per minute in a sliding 60 second window: 20, 40 or 120 by plan. Read the rate limit headers and handle 429 with Retry-After.
- [Pricing](https://amodb.dev/pricing/): amodb plans differ only in requests per minute: 20, 40 or 120. Every plan includes all TMDB v3 and OMDb compatible data. Prepaid, no renewal, no trial.

Updated: 2026-10-18. Source: https://amodb.dev/amodb-vs-tmdb/
