Tutoriel

Documentation technique : lire une plaque minéralogique via API

Api Plaque ImmatriculationAugust 14, 20269 min de lecture
#documentation technique#api#plaque mineralogique#json#reference#codes erreur
Documentation technique : lire une plaque minéralogique via API

Cette documentation technique de l'API de lecture de plaque minéralogique rassemble ce qu'un développeur doit avoir sous les yeux pendant l'intégration : l'authentification, l'endpoint unique, les formats de plaque acceptés, la structure exacte de la réponse JSON champ par champ, les codes d'erreur et la conduite à tenir pour chacun, les quotas, et des exemples exécutables en cURL, JavaScript et Python. Elle complète la documentation en ligne et le guide d'intégration développeur en se concentrant sur la référence brute.

Authentification

L'API s'authentifie par clé, transmise en en-tête HTTP. Aucun jeton OAuth, aucune session : chaque requête porte sa propre authentification.

En-têteObligatoireValeur
x-rapidapi-keyOuiVotre clé API
x-rapidapi-hostOuiapi-de-plaque-d-immatriculation-france.p.rapidapi.com
Content-TypeRecommandéapplication/json

La clé s'utilise exclusivement côté serveur. Un appel depuis un navigateur ou un binaire mobile expose la clé à quiconque inspecte le trafic. Pour une application mobile, passez par un proxy backend : voir intégrer l'API dans une application mobile.

Endpoint de recherche

Un seul endpoint suffit pour la recherche par plaque.

GET https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/?plaque={PLAQUE}
ParamètreEmplacementTypeObligatoireDescription
plaqueQuery stringstringOuiNuméro d'immatriculation, avec ou sans séparateurs

Appel minimal :

curl --request GET \
  --url 'https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/?plaque=FH-034-DD' \
  --header 'Content-Type: application/json' \
  --header 'x-rapidapi-host: api-de-plaque-d-immatriculation-france.p.rapidapi.com' \
  --header 'x-rapidapi-key: VOTRE_CLE_API'

Formats de plaque acceptés

Le paramètre plaque accepte les séparateurs ou non : FH-034-DD, FH034DD et fh 034 dd désignent le même véhicule. La normalisation appliquée côté serveur est : passage en majuscules, suppression des espaces et des tirets.

FormatMotifExemplePériodeNote
SIVAA-123-AAFH-034-DDDepuis 2009Format principal, numéro attribué à vie
FNI123 ABC 454521 XY 75Avant 2009Les deux derniers chiffres codent le département
WW provisoireWW-123-AAWW-456-BCImmatriculation temporaire, données parfois partielles
CyclomoteursVariableCouverture partielle

Motifs de validation à appliquer côté client avant l'appel :

const SIV = /^[A-Z]{2}[0-9]{3}[A-Z]{2}$/;
const FNI = /^[0-9]{1,4}[A-Z]{2,3}[0-9]{2}$/;
 
const normaliser = (s) => s.toUpperCase().replace(/[\s-]/g, "");
const valide = (s) => SIV.test(normaliser(s)) || FNI.test(normaliser(s));

Les règles de composition de chaque format sont expliquées dans comment lire une plaque d'immatriculation française.

Structure de la réponse

Toute réponse — succès comme erreur — partage la même enveloppe. Vos parseurs peuvent donc traiter le cas d'erreur en un seul point.

{
  "error": false,
  "code": 200,
  "message": "Succès",
  "query": "FH-034-DD",
  "country": "FR",
  "data": { }
}
ChampTypeDescription
errorbooleanfalse en cas de succès. Le premier champ à tester.
codeintegerCode HTTP dupliqué dans le corps
messagestringLibellé lisible, en français
querystringLa plaque telle que reçue, utile pour corréler en logs
countrystringCode pays ISO du registre interrogé (FR, GB, ES…)
dataobjectLes données du véhicule. Absent ou vide en cas d'erreur.

L'objet data, champ par champ

L'objet complet contient plus de cent champs. Voici les plus utilisés, regroupés par famille. Attention à un point important : la quasi-totalité des valeurs sont typées string, y compris les valeurs numériques. Convertissez explicitement avant tout calcul.

Identité administrative

ChampTypeExempleNote
immatstring"FH034DD"Plaque normalisée, sans séparateurs
VINstring"VF1R9800962986572"Numéro de série 17 caractères
date_mise_en_circulationstring"20-06-2019"Format JJ-MM-AAAA
date_mise_en_circulation_usstring"2019-06-20"Format ISO — à privilégier
date_cg / date_derniere_cgstring"30-06-2021"Dates de certificat d'immatriculation
genre / genre_carte_grisestring"VP"VP = voiture particulière, CTTE = camionnette
type_minestring"M10RENVP603P733"Type national
paysstring"FR"Registre d'origine

Identité commerciale

ChampTypeExemple
marquestring"RENAULT"
modelestring"CLIO IV"
versionstring"1.5 dCi 90 (90 hp) [2012-2021]"
labelstring"CLIO IV 1.5 DCI 90 (EURO 6C)"
nom_commercialstring"CLIO 4"
annee_de_debut_modele / annee_de_fin_modelestring"2018" / "2019"

Motorisation

ChampTypeExempleNote
energiestring"GAZOLE"Valeurs en majuscules
code_moteur / codes_moteurstring / array"K9K_638"Le tableau peut contenir plusieurs codes
puissance_chevauxstring"90"Puissance réelle
puissance_KWstring"66"
puissance_fiscalestring"5"Chevaux fiscaux
nbr_cylindre_energiestring"1461"Cylindrée en cm³ malgré le nom
type_boite_vitesstring"MECANIQUE"
nbr_vitessesstring"5"

Environnement

ChampTypeExemple
emission_co_2string"104" (g/km)
classe_environnement_cestring"715/2007 2017/1347ADEURO6"
code_certificat_qualite_airstringClasse Crit'Air
consommation_mixte / _urbaine / _ex_urbainestringl/100 km
depollutionstring"OUI"

Carrosserie et dimensions

ChampTypeExempleUnité
carrosseriestring"BERLINE"
nbr_portes / nbr_de_placesstring"5" / "5"
longueur / largeur / hauteurstring"406" / "173" / "145"cm
empattementstring"259"cm
poids_videstring"1160"kg
couleurstring"GRIS"

Correspondances pièces

ChampTypeUsage
k_typestringIdentifiant TecDoc, pivot des catalogues de pièces
code_srastringRéférence assurance
id_version / modele_id / marque_idstringIdentifiants internes de référentiel
model_image / url_imagestringURL d'illustration du modèle

Le rôle du k_type dans une chaîne pièces détachées est détaillé dans intégrer le K-Type et TecDoc ; le catalogue exhaustif est dans le guide complet des données SIV.

Convention importante : un champ non renseigné vaut la chaîne "INCONNU", pas null et pas une chaîne vide. Testez donc valeur && valeur !== "INCONNU" avant d'afficher un champ ou de l'utiliser dans un calcul. C'est la source de bug numéro un sur cette API.

Exemple de réponse complète

{
  "error": false,
  "code": 200,
  "message": "Succès",
  "query": "FH-034-DD",
  "country": "FR",
  "data": {
    "immat": "FH034DD",
    "VIN": "VF1R9800962986572",
    "marque": "RENAULT",
    "modele": "CLIO IV",
    "version": "1.5 dCi 90 (90 hp) [2012-2021]",
    "date_mise_en_circulation_us": "2019-06-20",
    "energie": "GAZOLE",
    "code_moteur": "K9K_638",
    "puissance_chevaux": "90",
    "puissance_fiscale": "5",
    "emission_co_2": "104",
    "carrosserie": "BERLINE",
    "nbr_portes": "5",
    "couleur": "GRIS",
    "poids_vide": "1160",
    "k_type": "57281",
    "finition": "INCONNU"
  }
}

Codes d'erreur

CodemessageCauseConduite à tenir
200SuccèsDonnées renvoyées
400Requête invalideFormat de plaque incorrectCorriger la saisie. Pas de retry
401Non authentifiéClé manquante ou invalideAlerter l'exploitation, vérifier le secret
404Véhicule non trouvéPlaque absente de la baseMessage utilisateur, repli manuel. Pas de retry
429Trop de requêtesQuota mensuel ou débit dépasséBackoff exponentiel plafonné
500Erreur interneIncident côté serviceUn retry, puis message d'indisponibilité

Traitement recommandé, en JavaScript :

async function interrogerPlaque(plaque) {
  const res = await fetch(
    `https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/?plaque=${plaque}`,
    {
      headers: {
        "x-rapidapi-key": process.env.RAPIDAPI_KEY,
        "x-rapidapi-host": "api-de-plaque-d-immatriculation-france.p.rapidapi.com",
      },
      signal: AbortSignal.timeout(8000),
    },
  );
 
  switch (res.status) {
    case 200:
      break;
    case 400:
      throw new Error("FORMAT_INVALIDE");
    case 401:
      throw new Error("AUTH");
    case 404:
      throw new Error("INTROUVABLE");
    case 429:
      throw new Error("QUOTA");
    default:
      throw new Error("INDISPONIBLE");
  }
 
  const json = await res.json();
  if (json.error) throw new Error(json.message);
  return json.data;
}

Ne retentez jamais un 400 ni un 404 : la réponse sera identique et chaque tentative consomme du quota. Seuls 429 et 5xx justifient un retry.

Quotas et limitation de débit

Le quota est mensuel et dépend de votre offre. Le dépassement déclenche un 429.

OffreRequêtes / moisUsage visé
Basic10Test et prototypage
Pro600Production légère
Ultra5 000Production courante
Mega10 000Volume élevé

Trois pratiques réduisent fortement la consommation réelle :

  1. Cache de 24 heures minimum sur la paire plaque → réponse. Les caractéristiques d'un véhicule ne changent pas ; c'est la mesure qui a le plus d'effet sur la facture.
  2. Validation du format avant l'appel, pour ne jamais consommer de quota sur une saisie invalide.
  3. Déduplication des appels concurrents portant sur la même plaque.

Le calcul du coût par requête utile est détaillé dans combien coûte une API de reconnaissance de plaque ; la grille à jour est sur la page tarifs.

Exemples de code

JavaScript (Node.js)

const plaque = "FH034DD";
 
const res = await fetch(
  `https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/?plaque=${plaque}`,
  {
    headers: {
      "Content-Type": "application/json",
      "x-rapidapi-key": process.env.RAPIDAPI_KEY,
      "x-rapidapi-host": "api-de-plaque-d-immatriculation-france.p.rapidapi.com",
    },
  },
);
 
const json = await res.json();
const v = json.data;
 
const propre = (val) => (val && val !== "INCONNU" ? val : null);
 
console.log({
  marque: propre(v.marque),
  modele: propre(v.modele),
  energie: propre(v.energie),
  chevaux: Number(v.puissance_chevaux) || null,
  co2: Number(v.emission_co_2) || null,
});

Python

import os
import requests
 
BASE = "https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/"
 
 
def propre(valeur):
    return None if valeur in (None, "", "INCONNU") else valeur
 
 
def interroger_plaque(plaque: str) -> dict:
    plaque = plaque.upper().replace("-", "").replace(" ", "")
    reponse = requests.get(
        BASE,
        params={"plaque": plaque},
        headers={
            "Content-Type": "application/json",
            "x-rapidapi-key": os.environ["RAPIDAPI_KEY"],
            "x-rapidapi-host": "api-de-plaque-d-immatriculation-france.p.rapidapi.com",
        },
        timeout=10,
    )
 
    if reponse.status_code == 404:
        raise LookupError("Véhicule introuvable")
    if reponse.status_code == 429:
        raise RuntimeError("Quota dépassé")
    reponse.raise_for_status()
 
    charge = reponse.json()
    if charge.get("error"):
        raise RuntimeError(charge.get("message", "Erreur inconnue"))
 
    data = charge["data"]
    return {
        "marque": propre(data.get("marque")),
        "modele": propre(data.get("modele")),
        "energie": propre(data.get("energie")),
        "chevaux": int(data["puissance_chevaux"]) if propre(data.get("puissance_chevaux")) else None,
        "co2": int(data["emission_co_2"]) if propre(data.get("emission_co_2")) else None,
    }
 
 
print(interroger_plaque("FH-034-DD"))

PHP

<?php
$plaque = strtoupper(str_replace(['-', ' '], '', 'FH-034-DD'));
$url = 'https://api-de-plaque-d-immatriculation-france.p.rapidapi.com/?plaque=' . urlencode($plaque);
 
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'x-rapidapi-key: ' . getenv('RAPIDAPI_KEY'),
        'x-rapidapi-host: api-de-plaque-d-immatriculation-france.p.rapidapi.com',
    ],
]);
 
$corps = curl_exec($ch);
$statut = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
 
if ($statut !== 200) {
    throw new RuntimeException("Requête échouée (HTTP $statut)");
}
 
$charge = json_decode($corps, true);
if (!empty($charge['error'])) {
    throw new RuntimeException($charge['message']);
}
 
$v = $charge['data'];
$propre = fn ($val) => ($val && $val !== 'INCONNU') ? $val : null;
 
printf("%s %s — %s\n", $propre($v['marque']), $propre($v['modele']), $propre($v['energie']));
Rechercher

Exemple interactif — essayez avec votre propre plaque sur notre page de test

Pièges d'intégration à connaître

  • Tout est une chaîne. puissance_chevaux vaut "90", pas 90. Convertissez avant tout calcul ou comparaison.
  • "INCONNU" n'est pas null. Un test de vérité simple laissera passer cette chaîne et l'affichera à vos utilisateurs.
  • Deux formats de date coexistent. date_mise_en_circulation est en JJ-MM-AAAA, date_mise_en_circulation_us en ISO. Utilisez la seconde.
  • Certains noms de champs induisent en erreur. nbr_cylindre_energie contient la cylindrée en cm³, pas un nombre de cylindres — celui-ci est dans nbr_cylindres.
  • Les tableaux peuvent être vides. KBAS, pneus, codes_moteur peuvent revenir vides selon le véhicule.
  • Le schéma peut s'enrichir. De nouveaux champs peuvent apparaître ; parsez de manière tolérante plutôt qu'en mode strict.

Conclusion

L'API tient en un endpoint, deux en-têtes et une enveloppe de réponse constante. La complexité réelle porte sur le traitement des champs — typage en chaînes, valeur "INCONNU", doubles formats de date — et sur la discipline de cache qui détermine votre facture. Pour la mise en œuvre pas à pas, voyez le guide d'intégration développeur ; pour le cas mobile, l'intégration en application mobile ; pour la vue d'ensemble, le guide complet 2026.

Questions fréquentes

Quel endpoint utiliser pour lire une plaque minéralogique via API ?
Un seul endpoint suffit : une requête GET sur la racine du service avec le paramètre de query `plaque`, accompagnée des en-têtes `x-rapidapi-key` et `x-rapidapi-host`. La réponse arrive en JSON avec une enveloppe constante contenant `error`, `code`, `message`, `query`, `country` et l'objet `data` où se trouvent les caractéristiques du véhicule.
Quels formats de plaque l'API accepte-t-elle ?
Le format SIV depuis 2009 (AA-123-BB), l'ancien format FNI d'avant 2009 (123 ABC 45) et les immatriculations provisoires WW. Les séparateurs sont facultatifs : FH-034-DD, FH034DD et fh 034 dd désignent le même véhicule, la normalisation étant appliquée côté serveur. Validez néanmoins le format côté client pour ne pas consommer de quota sur une saisie erronée.
Que signifie la valeur INCONNU dans la réponse JSON ?
C'est la convention utilisée pour un champ non renseigné : l'API renvoie la chaîne "INCONNU" plutôt que null ou une chaîne vide. C'est la source de bug la plus fréquente, car un simple test de vérité laisse passer cette valeur et l'affiche aux utilisateurs. Testez explicitement que la valeur existe et diffère de "INCONNU" avant tout affichage ou calcul.
Comment gérer les codes d'erreur de l'API ?
Six codes sont possibles : 200 succès, 400 format de plaque incorrect, 401 clé manquante ou invalide, 404 véhicule non trouvé, 429 quota dépassé et 500 erreur interne. Ne retentez jamais un 400 ni un 404 : la réponse sera identique et chaque tentative consomme du quota. Seuls le 429 et les 5xx justifient un retry, avec backoff exponentiel plafonné.
Quels sont les quotas et limites de taux de l'API ?
Le quota est mensuel et dépend de l'offre : 10 requêtes pour le palier gratuit Basic, 600 pour Pro, 5 000 pour Ultra et 10 000 pour Mega. Le dépassement renvoie un code 429. Trois pratiques réduisent fortement la consommation : un cache d'au moins 24 heures sur la paire plaque-réponse, la validation du format avant appel, et la déduplication des appels concurrents sur une même plaque.
Les valeurs numériques sont-elles renvoyées en nombres ?
Non. La quasi-totalité des champs sont typés en chaînes de caractères, y compris les valeurs numériques : la puissance vaut "90" et non 90, les émissions "104" et non 104. Convertissez explicitement avant tout calcul ou comparaison. Attention également aux noms trompeurs comme nbr_cylindre_energie, qui contient la cylindrée en cm³ et non un nombre de cylindres.
Partager cet article
Api Plaque Immatriculation

Api Plaque Immatriculation

Expert en identification de véhicules et passionné par les technologies API. Api Plaque Immatriculation partage son expertise sur l'intégration des services de données automobiles.

Restez informé de nos actualités

Recevez les derniers articles et mises à jour directement par email.

S'abonner