Una API de películas que habla TMDB v3 y OMDb
amodb es una API de películas independiente. Habla el mismo protocolo que TMDB v3 y OMDb, así que un cliente escrito para cualquiera de los dos funciona después de cambiar la URL base a https:/ (o a https:/ para las llamadas estilo OMDb). Encuentras una película con /search/movie y luego la lees con /movie/{movie_id} y append_to_response.
Lo que obtienes:
- JSON con la forma de TMDB v3, con las mismas rutas y los mismos parámetros de consulta.
- Títulos y sinopsis en 14 idiomas, que eliges con
language. - Reparto, equipo técnico, tráilers, palabras clave, imágenes y fechas de estreno mediante
append_to_response. - Puntuaciones de IMDb, Kinopoisk, Metacritic, Rotten Tomatoes y TMDB cuando se conocen.
- Pósteres desde
https:/, sin clave./ img.amodb.dev/ t/ p/ {size}/ {file}
Qué datos obtienes
| Necesitas | Llamada | Notas |
|---|---|---|
| Encontrar una película por título | GET / | Paginado, hasta 20 resultados por página, caché perimetral de 10 minutos. Consulta búsqueda. |
| El registro principal | GET / | Títulos, sinopsis, duración, géneros, fecha de estreno. Consulta películas. |
| Reparto y equipo técnico | append_ | Los campos se describen en créditos. |
| Tráilers | append_ | Devuelve el array results con key, site y type. |
| Puntuaciones | append_ | Cinco fuentes, cada una { value, votes } o null. Consulta puntuaciones. |
| Una respuesta estilo OMDb | GET /omdb/?t=Inception | Los mismos campos de cuerpo que OMDb. Consulta endpoint OMDb. |
Empieza en 3 pasos
- Elige un plan en precios. Los planes se diferencian solo en el límite: 20, 40 o 120 solicitudes por minuto.
- Crea una clave en el panel de tu cuenta. Una clave tiene 32 caracteres hexadecimales en minúscula.
- Llama al endpoint con la clave en el parámetro
api_keyo en un encabezadoAuthorization: Bearer. Consulta autenticación.
Ejemplo de solicitud
El ejemplo busca Inception por título, toma el primer resultado y lee la película con reparto, tráilers y puntuaciones en una llamada más. Son dos solicitudes en total.
# 1. find the id
curl -s "https://api.amodb.dev/3/search/movie?query=inception&language=en-US" \
-H "Authorization: Bearer $AMODB_KEY"
# 2. read the movie with extras
curl -s "https://api.amodb.dev/3/movie/27205?language=en-US&append_to_response=credits,videos,ratings" \
-H "Authorization: Bearer $AMODB_KEY"const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
async function get(path, params) {
const res = await fetch(`${base}${path}?${new URLSearchParams(params)}`, { headers });
if (res.status === 429) {
throw new Error(`Over the limit, retry in ${res.headers.get('Retry-After')} s`);
}
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
return res.json();
}
const found = await get('/search/movie', { query: 'inception', language: 'en-US' });
if (!found.results.length) throw new Error('No match');
const movie = await get(`/movie/${found.results[0].id}`, {
language: 'en-US',
append_to_response: 'credits,videos,ratings',
});
const director = movie.credits.crew.find((c) => c.job === 'Director');
console.log(movie.title, movie.release_date, movie.runtime, director?.name);
console.log('IMDb', movie.ratings.imdb?.value);La respuesta recortada. Solo se conservan algunos campos del registro de la película, credits se reduce a un miembro del reparto y al director, y se omite el bloque videos.
{
"genres": [
{
"id": 12,
"name": "Adventure"
},
{
"id": 28,
"name": "Action"
},
{
"id": 80,
"name": "Crime"
}
],
"id": 27205,
"imdb_id": "tt1375666",
"poster_path": "/xlaY2zyzMfkhk0HSC5VUwzoZPU1.jpg",
"release_date": "2010-07-15",
"runtime": 148,
"title": "Inception",
"credits": {
"cast": [
{
"adult": false,
"gender": 2,
"id": 6193,
"known_for_department": "Acting",
"name": "Leonardo DiCaprio",
"original_name": "Leonardo DiCaprio",
"popularity": 9.3213,
"profile_path": "/wo2hJpn04vbtmh0B9utCFdsQhxM.jpg",
"character": "Dom Cobb",
"credit_id": "52fe4534c3a368484e04de03",
"order": 0
}
],
"crew": [
{
"adult": false,
"gender": 2,
"id": 525,
"known_for_department": "Directing",
"name": "Christopher Nolan",
"original_name": "Christopher Nolan",
"popularity": 8.578,
"profile_path": "/xuAIuYSmsUzKlUMBFGVZaWsY3DZ.jpg",
"credit_id": "5e83ac2ee33f830018359a00",
"department": "Directing",
"job": "Director"
}
]
},
"ratings": {
"imdb": {
"value": 8.8,
"votes": 2877173
},
"kinopoisk": {
"value": 8.7,
"votes": null
},
"metacritic": {
"value": 74,
"votes": null
},
"rotten_tomatoes": {
"value": 86,
"votes": null
},
"tmdb": {
"value": 8.373,
"votes": 40457
}
}
}Formas de encontrar una película
Elige la llamada que se ajuste a lo que ya tienes.
| Empiezas con | Llamada | Resultado |
|---|---|---|
| Un título escrito por un usuario | GET / | Array results con id, title, release_date, poster_path |
Un ID de IMDb como tt0133093 | GET / | Array movie_results |
Un id numérico de película como 603 | GET /3/movie/603 | El registro completo |
| Un cliente OMDb existente | GET /omdb/?i=tt0133093 | Cuerpo OMDb con Title, Year, Ratings |
Guarda ambos ids. El id numérico es la clave para todas las demás llamadas, y imdb_id une tus datos con otros sistemas. Las reglas de consulta están en buscar por ID externo.
Campos vacíos y consultas fallidas
Los datos reales de películas tienen huecos, así que escribe el código de presentación pensando en ellos. Una búsqueda sin resultados no es un error: devuelve HTTP 200 con un array results vacío. Un id desconocido sí es un error.
| Caso | Qué ves | Qué hacer |
|---|---|---|
| Búsqueda sin resultados | 200 y "results": [] | Muestra «sin coincidencias», no reintentes |
| ID de película desconocido | 404 con status_code 34 | Quita el id de tu lista |
| Clave ausente o incorrecta | 401 con status_code 7 | Detente y corrige la clave |
overview vacío | Una cadena vacía | Solicita de nuevo con language=en-US |
| Puntuación desconocida | null dentro de ratings | Oculta esa insignia |
| Sin fecha de estreno | release_date vacío | Ordena el título al final |
La lista completa de errores está en errores.
Cómo respetar el límite de solicitudes
Una búsqueda y una llamada de detalles cuestan una solicitud cada una. Con 20 solicitudes por minuto son diez consultas de títulos por minuto, y con 120 solicitudes por minuto son sesenta. Un acierto en la caché perimetral también cuenta, porque la comprobación de la clave y el límite se ejecutan antes que la caché. Mantén una caché propia para las consultas repetidas y lee X-RateLimit-Remaining para ver cuánto queda del minuto. Cuando recibas un 429, espera los segundos indicados en Retry-After. Los límites de cada plan están en límites de solicitudes.
Cómo se compara
| Capacidad | Hacer scraping de las páginas tú mismo | API de metadatos con nivel gratuito | amodb |
|---|---|---|---|
| Formato de respuesta | HTML que debes analizar | JSON | JSON con la forma de TMDB v3 |
| Estabilidad del esquema | Se rompe cuando cambia el marcado de la página | Lo define el proveedor | Rutas y campos fijos, pueden aparecer campos nuevos |
| Condiciones de acceso | Se aplican los términos de cada sitio | Nivel gratuito con términos de uso, revísalos | De pago, prepago, sin nivel gratuito |
| Límite de solicitudes | Nada en lo que puedas confiar | Lo define el proveedor | 20, 40 o 120 solicitudes por minuto por clave |
| Puntuaciones de varias fuentes | Un scraper por cada sitio | Varía, revisa la documentación | ratings en la misma llamada, null cuando se desconoce |
| Idiomas | Los que ofrezca cada página | Varía | 14, elegidos con language |
| Reutilizar clientes de TMDB v3 y OMDb | No | Solo si usa el mismo protocolo | Sí, cambia la URL base |
Precios
El acceso es prepago por 1, 3, 6, 12 o 24 meses, con 0, 10, 20, 30 y 40 por ciento de descuento en los periodos más largos. No hay renovación automática ni nivel gratuito. Todos los planes dan acceso a todos los datos y se diferencian solo en el límite: 20, 40 o 120 solicitudes por minuto. Elige uno en precios y haz tu primera llamada en pocos minutos.