Aller au contenu

Documentation de l'API

Tout ce qu'il faut pour intégrer CKD SIV : authentification, requête, réponse, référence des champs et exemples de code.

Pas encore de clé API ? Créez votre compte professionnel pour commencer à interroger l'API.

Créer un compte

Démarrage rapide

  1. Générez une clé dans Clés API. Elle n'est affichée qu'une seule fois : conservez-la en lieu sûr.
  2. Appelez l'API avec la plaque recherchée :
curl -H "X-API-Key: VOTRE_CLE" \
  "https://siv.ckd.agency/api/v1/plaque?immat=AA-123-BC"

Vous recevez les caractéristiques du véhicule au format JSON (marque, modèle, motorisation, VIN, dimensions, pneumatiques…).

Authentification

Chaque requête doit porter votre clé API, au choix :

  • en-tête X-API-Key: pk_live_… (recommandé) ;
  • ou en-tête Authorization: Bearer pk_live_….

Vous pouvez créer plusieurs clés (une par application ou par environnement) et révoquer une clé à tout moment ; elle est alors refusée immédiatement. Toutes les clés d'un compte partagent la même consommation et la même facturation.

Ne placez jamais votre clé dans du code exécuté dans le navigateur (JavaScript côté client, application mobile). Appelez l'API depuis votre serveur.

Requête

GET https://siv.ckd.agency/api/v1/plaque

Paramètres (query string)

ParamètreObligatoireDescription
immatouiPlaque d'immatriculation. Espaces, tirets et minuscules acceptés : AA-123-BC, aa 123 bc et AA123BC désignent le même véhicule. Alias accepté : immatriculation.
paysnonCode pays ISO à 2 lettres. Par défaut FR. Valeurs acceptées : FR, ES, UK, DE, IT, PT, NL.

Réponse

Réponse 200 au format JSON, composée de deux blocs :

  • data : les caractéristiques du véhicule (voir référence des champs) ;
  • meta : les informations sur votre requête et votre consommation.

Bloc meta

ChampTypeDescription
request_identierIdentifiant unique de la requête. À conserver de votre côté et à nous communiquer en cas de question.
platetextePlaque normalisée (majuscules, sans séparateur).
countrytextePays utilisé pour la recherche.
sourcetexteInformation technique sur l'origine de la donnée ; n'a aucun impact sur le contenu ni sur la facturation.
billedbooléentrue si cette requête est facturée, false sinon.
unit_price_httexte décimalPrix HT appliqué à cette requête ("0.0000" si non facturée).
usage.periodtexteMois en cours (AAAA-MM).
usage.requestsentierNombre total de vos requêtes ce mois-ci, celle-ci incluse (toutes clés, tous résultats).
usage.billed_requestsentierNombre de requêtes facturées ce mois-ci.
usage.amount_httexte décimalMontant HT cumulé du mois.

Exemple de réponse complète

{
    "data": {
        "erreur": "",
        "immat": "AA123BC",
        "pays": "FR",
        "marque": "RENAULT",
        "modele": "MEGANE III",
        "modele_en": "MEGANE III Coupe",
        "version": "1.9 dCi",
        "debut_modele": "2008-11",
        "fin_modele": "2015-08",
        "date1erCir_us": "2009-04-18",
        "date1erCir_fr": "18-04-2009",
        "co2": "",
        "energie": "2",
        "energieNGC": "DIESEL",
        "type_moteur": "Diesel",
        "genreVCG": "1",
        "genreVCGNGC": "VP",
        "puisFisc": "7",
        "carrosserieCG": "COUPE",
        "code_carrosserie": "29",
        "carrosserie": "Coupé",
        "code_type_transmission": "1",
        "type_transmission": "Traction avant",
        "capacite_litres": "1.90",
        "code_systeme_alimentation": "11",
        "systeme_alimentation": "Injection directe",
        "valves": "2",
        "puisFiscReelKW": "96 KW",
        "puisFiscReelCH": "131 CH",
        "collection": "",
        "vin": "VF1DZ0N0641118804",
        "variante": "DZ0N06",
        "boite_vitesse": "M",
        "code_boite_vitesse": "",
        "nr_passagers": "",
        "nb_portes": "0",
        "type_mine": "MRE5531A0421",
        "cnit": "MRE5531A0421",
        "couleur": "",
        "poids": "",
        "ptac": "",
        "ccm": "1870 CM3",
        "cylindres": "4",
        "propulsion": "",
        "type_compression": "",
        "longueur": "",
        "largeur": "",
        "hauteur": "",
        "empattement": "",
        "sra_id": "",
        "sra_group": "",
        "sra_commercial": "1.9 dCi (DZ0N, DZ0J, DZ1J, DZ1K)",
        "numero_serie": "41118804",
        "prix_estime": "",
        "logo_marque": "https://siv.ckd.agency/media/vehicules/marques/93.png",
        "photo_modele": "https://siv.ckd.agency/media/vehicules/modeles/31164.jpg",
        "k_type": "31164",
        "tecdoc_manu_id": "93",
        "tecdoc_model_id": "7867",
        "tecdoc_car_id": "31164",
        "tecdoc_vehicules_compatible": "",
        "code_moteur": "F9Q_870,F9Q_872",
        "codes_platforme": "DZ0/1_",
        "liste_sra_commercial": null,
        "pneus": [
            {
                "name": "205/50 R 17",
                "width": 205,
                "height": 50,
                "diameter": 17,
                "load_index": 89,
                "speed_index": "V"
            },
            {
                "name": "205/55 R 16",
                "width": 205,
                "height": 55,
                "diameter": 16,
                "load_index": 91,
                "speed_index": "H"
            }
        ]
    },
    "meta": {
        "request_id": 18342,
        "plate": "AA123BC",
        "country": "FR",
        "source": "upstream",
        "billed": true,
        "unit_price_ht": "0.0600",
        "usage": {
            "period": "2026-11",
            "requests": 152,
            "billed_requests": 98,
            "amount_ht": "5.88"
        }
    }
}

Formats des valeurs

  • Toutes les valeurs de data sont des chaînes, sauf les listes pneus et liste_sra_commercial.
  • Une valeur inconnue est une chaîne vide "" ; certaines valeurs numériques inconnues valent "0".
  • Dates : date1erCir_fr au format JJ-MM-AAAA, date1erCir_us au format AAAA-MM-JJ. debut_modele / fin_modele au format AAAA-MM.
  • Certaines valeurs incluent leur unité ("1995 CM3", "200 KW", "2472 KG") : pensez à les nettoyer si vous les traitez comme des nombres.
  • De nouveaux champs peuvent être ajoutés à data sans préavis : ignorez les champs que vous ne connaissez pas.

Facturation

  • Chaque véhicule est facturé une seule fois par compte, lors de votre première consultation (0,06 € HT au tarif actuel).
  • Les consultations suivantes du même véhicule par votre compte sont gratuites, quelle que soit la clé utilisée.
  • Les véhicules introuvables (404), les requêtes invalides (422) et les erreurs ne sont jamais facturés.
  • Le prix appliqué est celui en vigueur au moment de la requête ; il est indiqué dans meta.unit_price_ht.
  • La facturation est mensuelle. Le détail de chaque requête est consultable et exportable (CSV) dans Requêtes.

Erreurs

En cas d'erreur, la réponse contient un bloc error et, dès que la clé est reconnue, le bloc meta :

{
  "error": { "code": "not_found", "message": "Véhicule introuvable" },
  "meta": { "request_id": 18343, "plate": "ZZ999ZZ", "country": "FR", "source": "not_found",
            "billed": false, "unit_price_ht": "0.0000",
            "usage": { "period": "2026-11", "requests": 153, "billed_requests": 98, "amount_ht": "5.88" } }
}
HTTPerror.codeSignificationFacturéQue faire
401unauthorizedClé absente, invalide ou révoquéenonVérifier la clé envoyée
403forbiddenCompte en attente de validation ou suspendunonNous contacter
404not_foundAucun véhicule pour cette plaquenonVérifier la saisie ; ne pas réessayer en boucle
422invalid_requestPlaque vide ou mal formée, pays non pris en chargenonCorriger les paramètres
429rate_limitedPlus de 60 requêtes par minute sur votre comptenonPatienter puis réessayer
429quota_exceededProtection du compte : quota quotidien de nouveaux véhicules atteint, ou trop de plaques introuvables en peu de temps. Les véhicules déjà consultés restent accessibles.nonRéessayer plus tard ou nous contacter pour relever le quota
502upstream_errorService temporairement indisponiblenonRéessayer quelques secondes plus tard

Limites

  • 60 requêtes par minute par compte, toutes clés confondues (limite ajustable sur demande). Au-delà : réponse 429. Les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et Retry-After indiquent où vous en êtes.
  • Temps de réponse : quelques millisecondes pour un véhicule déjà connu, jusqu'à quelques secondes pour une première recherche. Prévoyez un délai d'attente (timeout) d'au moins 20 secondes.
  • Volume mensuel : illimité.

Exemples de code

cURL
curl -s -H "X-API-Key: $PLAQUE_API_KEY" \
  "https://siv.ckd.agency/api/v1/plaque?immat=AA-123-BC&pays=FR"
PHP (Guzzle / Laravel HTTP)
// Laravel
$response = Http::withHeaders(['X-API-Key' => env('PLAQUE_API_KEY')])
    ->timeout(20)
    ->get('https://siv.ckd.agency/api/v1/plaque', ['immat' => 'AA-123-BC', 'pays' => 'FR']);

if ($response->successful()) {
    $vehicule = $response->json('data');      // marque, modele, vin…
    $facture  = $response->json('meta.billed');
} elseif ($response->status() === 404) {
    // véhicule introuvable (non facturé)
}

// PHP natif
$ch = curl_init('https://siv.ckd.agency/api/v1/plaque?' . http_build_query(['immat' => 'AA-123-BC']));
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER     => ['X-API-Key: ' . getenv('PLAQUE_API_KEY')],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 20,
]);
$json = json_decode(curl_exec($ch), true);
JavaScript (Node.js 18+)
const url = new URL('https://siv.ckd.agency/api/v1/plaque');
url.searchParams.set('immat', 'AA-123-BC');

const res = await fetch(url, {
  headers: { 'X-API-Key': process.env.PLAQUE_API_KEY },
  signal: AbortSignal.timeout(20000),
});
const body = await res.json();

if (res.ok) {
  console.log(body.data.marque, body.data.modele, body.meta.billed);
} else {
  console.error(res.status, body.error.code, body.error.message);
}
Python (requests)
import os, requests

r = requests.get(
    "https://siv.ckd.agency/api/v1/plaque",
    params={"immat": "AA-123-BC", "pays": "FR"},
    headers={"X-API-Key": os.environ["PLAQUE_API_KEY"]},
    timeout=20,
)
body = r.json()
if r.ok:
    print(body["data"]["marque"], body["data"]["modele"], body["meta"]["billed"])
else:
    print(r.status_code, body["error"]["code"])

Référence des champs data

Liste des champs renvoyés, avec un exemple réel. Les champs vides ne sont pas renseignés pour tous les véhicules.

Identification

ChampDescriptionExemple
immatImmatriculationAA123BC
paysPaysFR
date1erCir_fr1ʳᵉ mise en circulation18-04-2009
vinVINVF1DZ0N0641118804
numero_serieN° de série41118804
type_mineType mineMRE5531A0421
cnitCNITMRE5531A0421
genreVCGNGCGenre (carte grise)VP
couleurCouleur—
prix_estimePrix neuf estimé—

Modèle

ChampDescriptionExemple
marqueMarqueRENAULT
modeleModèleMEGANE III
modele_enModèle (international)MEGANE III Coupe
versionVersion1.9 dCi
sra_commercialDésignation commerciale1.9 dCi (DZ0N, DZ0J, DZ1J, DZ1K)
varianteVarianteDZ0N06
collectionCollection—
debut_modeleDébut de commercialisation2008-11
fin_modeleFin de commercialisation2015-08
codes_platformePlateformeDZ0/1_

Motorisation

ChampDescriptionExemple
energieNGCÉnergieDIESEL
type_moteurType de moteurDiesel
puisFiscPuissance fiscale (CV)7
puisFiscReelCHPuissance réelle (ch)131 CH
puisFiscReelKWPuissance réelle (kW) (kW)96 KW
ccmCylindrée (cm³)1870 CM3
capacite_litresCylindrée (litres) (L)1.90
cylindresCylindres4
valvesSoupapes par cylindre2
systeme_alimentationAlimentationInjection directe
type_compressionCompression—
code_moteurCode moteurF9Q_870,F9Q_872
co2Émissions CO₂ (g/km)—

Transmission et carrosserie

ChampDescriptionExemple
boite_vitesseBoîte de vitessesM
type_transmissionTransmissionTraction avant
propulsionPropulsion—
carrosserieCarrosserieCoupé
carrosserieCGCarrosserie (carte grise)COUPE
nb_portesPortes0
nr_passagersPlaces—

Dimensions et poids

ChampDescriptionExemple
longueurLongueur (cm)—
largeurLargeur (cm)—
hauteurHauteur (cm)—
empattementEmpattement (cm)—
poidsPoids à vide (kg)—
ptacPTAC (kg)—

Références techniques

ChampDescriptionExemple
k_typeK-Type31164
tecdoc_manu_idTecDoc constructeur93
tecdoc_model_idTecDoc modèle7867
tecdoc_car_idTecDoc véhicule31164
tecdoc_vehicules_compatibleTecDoc compatibles—
sra_idCode SRA—
sra_groupGroupe SRA—
date1erCir_us1ʳᵉ circulation (format ISO)2009-04-18
energieCode énergie2
genreVCGCode genre1
code_carrosserieCode carrosserie29
code_type_transmissionCode transmission1
code_systeme_alimentationCode alimentation11
code_boite_vitesseCode boîte—

Visuels et listes

ChampDescriptionExemple
logo_marqueURL du logo de la marque (PNG)https://siv.ckd.agency/media/vehicules/marques/93.png
photo_modeleURL d'une photo du modèle (JPG)https://siv.ckd.agency/media/vehicules/modeles/31164.jpg
pneus[]Montes de pneumatiques : name, width, height, diameter, load_index, speed_index[{"name":"255/70 R 18", …}]
liste_sra_commercial[]Versions commerciales SRA : sra_id, sra_commercial[{"sra_id":"JP08005", …}]
erreurToujours vide quand le véhicule est trouvé—

Bonnes pratiques

  • Normalisez et validez la plaque côté client avant l'appel pour éviter les 422.
  • Enregistrez meta.request_id avec vos données : il permet de retrouver chaque requête dans votre relevé.
  • En cas de 429 ou 502, réessayez avec un délai croissant (1 s, 2 s, 4 s…), au maximum 3 fois.
  • Ne réessayez pas automatiquement un 404 : le résultat sera le même.
  • Utilisez une clé par application ; révoquez immédiatement une clé compromise et générez-en une nouvelle.
  • Les URL logo_marque et photo_modele sont stables : vous pouvez les afficher directement ou les mettre en cache.

Prêt à identifier vos premiers véhicules ?

Créez votre compte professionnel en deux minutes. Aucun engagement.