# Căutare după ID extern

> GET /3/find/{external_id} transformă un ID IMDb, TVDB, Wikidata, Kinopoisk, Facebook, Twitter sau Instagram în rezultate în stil TMDB, iar endpoint-urile external_ids merg în sens invers. Un endpoint Wikidata adaugă buget, încasări, premii și titluri legate pentru un film sau serial. Toate folosesc cheia ta obișnuită.

## Endpoint

`GET /3/find/{external_id}`

```bash
curl "https://api.amodb.dev/3/find/tt0137523?external_source=imdb_id" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Răspuns:

```json
{
  "movie_results": [
    {
      "adult": false,
      "backdrop_path": "/c6OLXfKAk5BKeR6broC8pYiCquX.jpg",
      "genre_ids": [
        18,
        53
      ],
      "id": 550,
      "original_language": "en",
      "original_title": "Fight Club",
      "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground \"fight clubs\" forming in every town, until an eccentric gets in the wa...",
      "popularity": 39.0054,
      "poster_path": "/jSziioSwPVrOy9Yow3XhWIBDjq1.jpg",
      "release_date": "1999-10-15",
      "title": "Fight Club",
      "video": false,
      "vote_average": 8.437,
      "vote_count": 33042,
      "media_type": "movie"
    }
  ],
  "person_results": [],
  "tv_results": [],
  "tv_episode_results": [],
  "tv_season_results": []
}
```

## Găsește un titlu după ID extern

`GET /3/find/{external_id}` primește un ID dintr-un alt sistem și întoarce înregistrările care se potrivesc. Calea conține ID-ul, iar parametrul de interogare `external_source` spune din ce sistem provine. amodb acceptă douăsprezece surse, iar șapte dintre ele se rezolvă în înregistrări: `imdb_id`, `tvdb_id`, `wikidata_id`, `kinopoisk_id`, `facebook_id`, `twitter_id` și `instagram_id`.

Exemplul mapează ID-ul IMDb `tt0137523` la un ID TMDB.

```bash
curl -sf "https://api.amodb.dev/3/find/tt0137523?external_source=imdb_id" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
const url = 'https://api.amodb.dev/3/find/tt0137523?external_source=imdb_id';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const found = await res.json();
const movie = found.movie_results[0];
console.log(movie ? `${movie.id} ${movie.title}` : 'no match');
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/find/tt0137523",
    params={"external_source": "imdb_id"},
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
results = r.json()["movie_results"]
print(f"{results[0]['id']} {results[0]['title']}" if results else "no match")
```

```php
<?php
$url = 'https://api.amodb.dev/3/find/tt0137523?external_source=imdb_id';
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
$movies = json_decode($body, true)['movie_results'];
echo $movies ? $movies[0]['id'] . ' ' . $movies[0]['title'] : 'no match', PHP_EOL;
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Found struct {
	MovieResults []struct {
		ID    int    `json:"id"`
		Title string `json:"title"`
	} `json:"movie_results"`
}

func main() {
	url := "https://api.amodb.dev/3/find/tt0137523?external_source=imdb_id"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var f Found
	if err := json.NewDecoder(res.Body).Decode(&f); err != nil {
		panic(err)
	}
	if len(f.MovieResults) == 0 {
		fmt.Println("no match")
		return
	}
	fmt.Println(f.MovieResults[0].ID, f.MovieResults[0].Title)
}
```

### Parametri

| Parametru         | Loc        | Obligatoriu          | Descriere                                                                                                                                                                                                                         |
| ----------------- | ---------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `external_id`     | cale       | da                   | ID-ul din celălalt sistem, de exemplu `tt0137523`.                                                                                                                                                                                |
| `external_source` | interogare | da                   | Una dintre `imdb_id`, `tvdb_id`, `wikidata_id`, `kinopoisk_id`, `facebook_id`, `twitter_id`, `instagram_id`. Alte cinci sunt acceptate și nu întorc nimic: `freebase_mid`, `freebase_id`, `tvrage_id`, `tiktok_id`, `youtube_id`. |
| `language`        | interogare | nu                   | Una dintre cele 14 limbi, precum `en` sau `ru-RU`. Alte valori revin la `en`.                                                                                                                                                     |
| `api_key`         | interogare | una dintre cele două | Cheia ta. Folosește-o pe aceasta sau antetul `Authorization: Bearer`.                                                                                                                                                             |

Un `external_source` lipsă, sau unul care nu este în listă, răspunde 400 cu `status_code` 22. Valoarea trebuie să fie cu litere mici.

### Câmpurile răspunsului

| Câmp                 | Tip   | Observații                                                                                               |
| -------------------- | ----- | -------------------------------------------------------------------------------------------------------- |
| `movie_results`      | array | Înregistrări de filme cu aceleași câmpuri ca un rezultat de căutare, plus `media_type` setat la `movie`. |
| `person_results`     | array | Persoane potrivite după ID. Fiecare are `known_for` ca array gol și `media_type` setat la `person`.      |
| `tv_results`         | array | Înregistrări de seriale TV cu `media_type` setat la `tv`.                                                |
| `tv_episode_results` | array | Mereu gol.                                                                                               |
| `tv_season_results`  | array | Mereu gol.                                                                                               |

### Exemplu de răspuns

```json
{
  "movie_results": [
    {
      "adult": false,
      "backdrop_path": "/c6OLXfKAk5BKeR6broC8pYiCquX.jpg",
      "genre_ids": [18, 53],
      "id": 550,
      "original_language": "en",
      "original_title": "Fight Club",
      "overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking n...",
      "popularity": 39.0054,
      "poster_path": "/jSziioSwPVrOy9Yow3XhWIBDjq1.jpg",
      "release_date": "1999-10-15",
      "title": "Fight Club",
      "video": false,
      "vote_average": 8.437,
      "vote_count": 33039,
      "media_type": "movie"
    }
  ],
  "person_results": [],
  "tv_results": [],
  "tv_episode_results": [],
  "tv_season_results": []
}
```

Descrierea este tăiată.

### Ce sursă găsește ce

| `external_source`                           | Cum arată ID-ul                                                 | Exemplu                                                              | Array-ul de rezultate uzual                        |
| ------------------------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------- |
| `imdb_id`                                   | `tt` plus cifre pentru titluri, `nm` plus cifre pentru persoane | `tt0137523`, `nm0000093` (Brad Pitt)                                 | `movie_results`, `tv_results` sau `person_results` |
| `tvdb_id`                                   | Număr                                                           | `81189` (Breaking Bad)                                               | `tv_results`                                       |
| `wikidata_id`                               | `Q` plus cifre                                                  | `Q190050` (Fight Club), `Q1079` (Breaking Bad), `Q35332` (Brad Pitt) | `movie_results`, `tv_results` sau `person_results` |
| `kinopoisk_id`                              | Număr                                                           | `361` (Fight Club), `404900` (Breaking Bad)                          | `movie_results` sau `tv_results`                   |
| `facebook_id`, `twitter_id`, `instagram_id` | Nume de cont                                                    | `FightClub`                                                          | Depinde de cont                                    |

Un nume de cont poate corespunde mai multor titluri. De exemplu `instagram_id=breakingbad` întoarce serialul și filmul El Camino, deci citește fiecare array.

```bash
curl -sf "https://api.amodb.dev/3/find/361?external_source=kinopoisk_id" \
  -H "Authorization: Bearer $AMODB_KEY"
```

## ID-urile externe ale unui titlu cunoscut

Sensul invers este un set de endpoint-uri `external_ids`. Ele întorc ID-urile pe care alte sisteme le folosesc pentru o înregistrare pe care o ai deja.

| Metodă și cale                         | Întoarce                                                                                         | Parametri   |
| -------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------- |
| `GET /movie/{movie_id}/external_ids`   | `imdb_id`, `wikidata_id`, `facebook_id`, `instagram_id`, `twitter_id`, `kinopoisk_id`            | `movie_id`  |
| `GET /tv/{tv_id}/external_ids`         | Aceleași plus `freebase_mid`, `freebase_id`, `tvdb_id`, `tvrage_id`                              | `tv_id`     |
| `GET /person/{person_id}/external_ids` | `imdb_id`, `wikidata_id`, `facebook_id`, `instagram_id`, `tiktok_id`, `twitter_id`, `youtube_id` | `person_id` |

Un ID pe care un titlu nu îl are vine ca `null`. `kinopoisk_id` este un șir și este prezent pentru un film sau serial doar când amodb îl cunoaște. Un răspuns real pentru `/3/movie/550/external_ids`:

```json
{
  "id": 550,
  "imdb_id": "tt0137523",
  "wikidata_id": "Q190050",
  "facebook_id": "FightClub",
  "instagram_id": null,
  "twitter_id": null,
  "kinopoisk_id": "361"
}
```

Un răspuns real pentru `/3/tv/1396/external_ids`:

```json
{
  "id": 1396,
  "imdb_id": "tt0903747",
  "freebase_mid": null,
  "freebase_id": null,
  "tvdb_id": 81189,
  "tvrage_id": null,
  "wikidata_id": "Q1079",
  "facebook_id": "BreakingBad",
  "instagram_id": "breakingbad",
  "twitter_id": "BreakingBad",
  "kinopoisk_id": "404900"
}
```

Endpoint-urile `external_ids` de sezon și de episod există, dar fiecare ID din ele este azi `null`, deci sari peste ele.

## Fapte Wikidata

`GET /3/movie/{movie_id}/wikidata` și `GET /3/tv/{tv_id}/wikidata` întorc ID-ul Wikidata al unui titlu și fapte despre el: bani, vecini dintr-o serie, pagini Wikipedia, premii și locuri. Fiecare cheie este mereu prezentă. Un fapt necunoscut este `null` pentru o singură valoare și `[]` pentru o listă.

| Metodă și cale                   | Întoarce                                    | Parametri                     |
| -------------------------------- | ------------------------------------------- | ----------------------------- |
| `GET /movie/{movie_id}/wikidata` | ID Wikidata și fapte                        | `movie_id`, `language`        |
| `GET /tv/{tv_id}/wikidata`       | ID Wikidata și fapte                        | `tv_id`, `language`           |
| `append_to_response=wikidata`    | Același bloc sub `wikidata`, cu `id`-ul său | Adăugat la un apel de detalii |

Acesta este răspunsul pentru Fight Club (filmul 550), tăiat la o dimensiune lizibilă:

```json
{
  "id": 550,
  "wikidata_id": "Q190050",
  "budget": {
    "value": 63000000,
    "currency": "USD"
  },
  "box_office": {
    "value": 101209702,
    "currency": "USD",
    "worldwide": true
  },
  "follows": null,
  "followed_by": null,
  "sitelinks": {
    "en": "Fight Club",
    "ru": "Бойцовский клуб (фильм)",
    "uk": "Бійцівський клуб (фільм)"
  },
  "awards": [
    {
      "wikidata_id": "Q28044798",
      "label": "Empire Awards, UK for best british actress"
    },
    {
      "wikidata_id": "Q943908",
      "label": "Jupiter Award",
      "year": 2000
    }
  ],
  "nominations": [
    {
      "wikidata_id": "Q488645",
      "label": "Academy Award for Best Sound Editing",
      "year": 2000
    }
  ],
  "based_on": [
    {
      "wikidata_id": "Q837283",
      "label": "Fight Club",
      "author": {
        "wikidata_id": "Q268181",
        "label": "Chuck Palahniuk"
      }
    }
  ],
  "filming_locations": [
    {
      "wikidata_id": "Q65",
      "label": "Los Angeles"
    }
  ],
  "narrative_locations": [
    {
      "wikidata_id": "Q65",
      "label": "Los Angeles"
    }
  ],
  "original_broadcasters": []
}
```

Obiectul `sitelinks` are 14 intrări, iar `awards` are 5. Ambele sunt tăiate aici.

| Câmp                                                                | Tip             | Observații                                                                                                   |
| ------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------ |
| `id`                                                                | număr întreg    | ID-ul TMDB al titlului. Rămâne când folosești `append_to_response`.                                          |
| `wikidata_id`                                                       | șir sau null    | Element Wikidata precum `Q190050`.                                                                           |
| `budget`                                                            | obiect sau null | `value` este un număr întreg rotunjit, iar `currency` este un cod ISO sau `null`.                            |
| `box_office`                                                        | obiect sau null | La fel ca `budget`, plus `worldwide` setat la `true` sau `false`.                                            |
| `follows`, `followed_by`                                            | obiect sau null | Titlul anterior și cel următor dintr-o serie de filme, ca link.                                              |
| `sitelinks`                                                         | obiect          | Mapează un cod de limbă la titlul paginii Wikipedia. Cheile sunt cele 14 limbi servite. `{}` când nu există. |
| `awards`, `nominations`                                             | array           | Linkuri cu un `year` opțional.                                                                               |
| `based_on`                                                          | array           | Lucrări sursă cu `wikidata_id`, `label` și un obiect `author` sau `null`.                                    |
| `filming_locations`, `narrative_locations`, `original_broadcasters` | array           | Linkuri. Breaking Bad are AMC în `original_broadcasters`.                                                    |

Un link are `wikidata_id`, `label` și, când elementul este un titlu din catalog, `tmdb_id` și `media_type`. Pentru The Matrix Reloaded (filmul 604), vecinii sunt linkuri către filmele 603 și 605:

```json
{
  "follows": {
    "wikidata_id": "Q83495",
    "label": "The Matrix",
    "tmdb_id": 603,
    "media_type": "movie"
  },
  "followed_by": {
    "wikidata_id": "Q207536",
    "label": "The Matrix Revolutions",
    "tmdb_id": 605,
    "media_type": "movie"
  }
}
```

Fiecare `label` vine în `language` din cerere și revine la engleză. Cu `language=ru`, autorul de mai sus se citește `Чак Паланик`.

## Erori

Erorile folosesc corpul TMDB, de exemplu `{"success": false, "status_code": 7, "status_message": "Invalid API key: You must be granted a valid key."}`.

| HTTP | status_code | Când                                                                         |
| ---- | ----------- | ---------------------------------------------------------------------------- |
| 400  | 22          | `external_source` lipsește, nu este cu litere mici sau nu este în listă.     |
| 401  | 7           | Cheia lipsește sau este greșită.                                             |
| 402  | 36          | Perioada planului s-a încheiat.                                              |
| 404  | 34          | ID-ul titlului dintr-o cale `wikidata` nu există.                            |
| 429  | 25          | Ai depășit cererile pe minut. Așteaptă numărul de secunde din `Retry-After`. |

Un ID extern necunoscut la `find` nu este o eroare: așteaptă-te la cinci array-uri goale. Nici endpoint-urile `external_ids` nu răspund 404 pentru un ID necunoscut. Ele răspund 200 cu fiecare ID `null`. Vezi [erori](https://amodb.dev/ro/errors/) și [autentificare](https://amodb.dev/ro/authentication/).

## Note practice

- Salvează ID-ul TMDB prima dată când rezolvi un ID extern. Apelurile următoare sar atunci peste `find` și merg direct la calea de detalii, ceea ce economisește o cerere pe titlu.
- Testează mereu că array-ul dorit are un element. `find` poate întoarce mai multe array-uri deodată pentru un ID.
- Detaliile și ID-urile externe sunt ținute în cache la margine 6 ore. O căutare repetată în acest interval întoarce răspunsul stocat.
- `wikidata_id` funcționează în ambele sensuri: transmite-l la `find` ca să obții un titlu sau citește-l din `external_ids` ca să faci legătura în exterior.
- Ca să aduci căutările IMDb în stil OMDb, vezi [endpoint-ul OMDb](https://amodb.dev/ro/omdb-endpoint/). Pentru scoruri după ce ai rezolvat un titlu, vezi [evaluări](https://amodb.dev/ro/ratings/).

## Întrebări și răspunsuri

### Ce surse externe acceptă find?

Pentru external_source se acceptă douăsprezece valori. Șapte dintre ele se rezolvă: imdb_id, tvdb_id, wikidata_id, kinopoisk_id, facebook_id, twitter_id și instagram_id. Celelalte cinci întorc array-uri goale. Valoarea este obligatorie, cu litere mici și exactă, de exemplu external_source=imdb_id.

### De ce întoarce find cinci array-uri?

Un ID poate indica un film, o persoană, un serial, un episod sau un sezon, deci răspunsul are câte un array pentru fiecare fel. În amodb doar movie_results, person_results și tv_results conțin elemente. tv_episode_results și tv_season_results sunt mereu goale.

### Ce se întâmplă când ID-ul este necunoscut?

Primești starea 200 cu toate cele cinci array-uri goale, ca în TMDB. Verifică dacă măcar un array are un element înainte să-l citești. Un external_source lipsă sau necunoscut este altceva: răspunde 400 cu status_code 22.

### Cum obțin un ID Kinopoisk pentru un titlu pe care îl am deja?

Apelează endpoint-ul external_ids al filmului sau serialului. Întoarce kinopoisk_id ca șir, precum 361 pentru Fight Club, sau null când amodb nu îl cunoaște. Transmite acel șir la find cu external_source=kinopoisk_id ca să te întorci.

### Pot adăuga wikidata la un apel de detalii?

Da. Adaugă append_to_response=wikidata la o cerere de detalii pentru film sau TV, iar blocul Wikidata sosește sub cheia wikidata, în aceeași cerere și fără un apel suplimentar.

## Pagini conexe

- [API detalii film](https://amodb.dev/ro/movies/): API detalii film cu aceleași căi și același JSON ca TMDB v3. Preia un film după ID, adaugă credite, evaluări și atmosferă cu append_to_response, în 14 limbi.
- [API seriale TV](https://amodb.dev/ro/tv-series/): API seriale TV cu căile și JSON-ul TMDB v3. Preia un serial după ID cu sezoane, rețele și următorul episod, plus clasificări de conținut și furnizori.
- [Evaluări pentru filme și TV](https://amodb.dev/ro/ratings/): API evaluări filme ce întoarce scorurile IMDb, Kinopoisk, Metacritic, Rotten Tomatoes și TMDB pentru un titlu într-un apel, cu null pentru sursele necunoscute.
- [API detalii persoană](https://amodb.dev/ro/people/): API detalii persoană cu căile și JSON-ul TMDB v3. Preia un actor sau membru al echipei după ID, cu biografie, filmografie, ID-uri externe și lista populară.
- [Endpoint compatibil OMDb](https://amodb.dev/ro/omdb-endpoint/): Endpoint compatibil OMDb la api.amodb.dev/omdb/. Caută după i sau t, caută cu s, citește array-ul Ratings și păstrează-ți clientul schimbând URL-ul de bază.
- [Autentificare](https://amodb.dev/ro/authentication/): Cum trimiți cheia amodb: api_key în interogare, antetul Authorization Bearer sau apikey pentru apelurile OMDb. Format, stocare, rotire și erorile 401.

Actualizat: 2026-10-18. Source: https://amodb.dev/ro/find-by-external-id/
