{"components":{"schemas":{"Anomalies":{"description":"Défauts de la source, dénombrés à l'ingestion et conservés tels quels : cette API est un miroir fidèle, pas un correcteur.","properties":{"annee_naissance_absente":{"type":"integer"},"annee_naissance_max":{"type":["integer","null"]},"annee_naissance_min":{"type":["integer","null"]},"identifiants_illisibles":{"type":"integer"},"parents_pendants":{"description":"Parents référencés mais absents du fichier : le lien est rompu, et exposé comme une absence de parent.","type":"integer"},"robe_absente":{"type":"integer"},"sans_filiation":{"type":"integer"},"slugs_non_deductibles":{"type":"integer"}},"type":"object"},"Decouverte":{"description":"Document de découverte servi à la racine sur `Accept: application/json`.","properties":{"affiliation":{"type":"string"},"description":{"type":"string"},"documentation":{"type":"string"},"endpoints":{"additionalProperties":{"type":"string"},"description":"Routes servies, par usage.","type":"object"},"gabarits_url":{"additionalProperties":{"type":"string"},"description":"Publiés ici une fois pour toutes : aucune réponse ne répète un lien déductible d'un identifiant.","type":"object"},"licence_donnees":{"type":"string"},"lignes":{"type":"integer"},"nom":{"type":"string"},"openapi":{"type":"string"},"source":{"type":"string"},"version":{"type":"string"}},"type":"object"},"Descendance":{"properties":{"donnees":{"items":{"$ref":"#/components/schemas/Produit"},"type":"array"},"limite":{"type":"integer"},"offset":{"type":"integer"},"parent":{"$ref":"#/components/schemas/Reference"},"total":{"description":"Produits directs connus, avant découpage.","type":"integer"}},"required":["parent","total","limite","offset","donnees"],"type":"object"},"Equide":{"properties":{"annee_naissance":{"example":2026,"type":"integer"},"filiation_texte":{"description":"Filiation telle que rédigée par la source.","example":"Par BOOSTER WINNER TF et JEWELLE DARK TF par CHARLY DU NOYER TF","type":"string"},"id":{"description":"Identifiant officiel IFCE, celui qui figure dans l'URL de la fiche publique. 22 caractères en base64 URL.","example":"Z4ogLhlkS2CeUdq0bZ0YFw","type":"string"},"mere":{"$ref":"#/components/schemas/Reference"},"nom":{"example":"QABALAH MERCURY","type":"string"},"nombre_de_descendants":{"description":"Fiches ayant cet équidé pour père ou mère.","type":"integer"},"pere":{"$ref":"#/components/schemas/Reference"},"pere_de_mere":{"$ref":"#/components/schemas/Reference"},"performances":{"items":{"$ref":"#/components/schemas/Performance"},"type":"array"},"race":{"example":"Trotteur Francais","type":"string"},"robe":{"example":"Bai","type":"string"},"sexe":{"enum":["Femelle","Male","Hongre","Indeter"],"type":"string"},"slug":{"example":"qabalah-mercury","type":"string"},"url":{"description":"Fiche d'origine, reconstruite depuis le slug et l'identifiant.","type":"string"}},"required":["id","nom","slug","url","race","sexe","nombre_de_descendants"],"type":"object"},"JeuDeDonnees":{"description":"Provenance de l'extraction servie. `source` et `ingere_le` sont ce que la mention obligatoire de réutilisation doit citer.","properties":{"anomalies":{"$ref":"#/components/schemas/Anomalies"},"empreinte_source":{"description":"Empreinte blake3 du fichier source : elle identifie exactement l'extraction servie.","type":"string"},"ingere_le":{"description":"Date d'ingestion, ISO 8601.","type":"string"},"licence":{"type":"string"},"lignes":{"type":"integer"},"producteur":{"type":"string"},"source":{"type":"string"},"url_modele":{"description":"Gabarit reconstruisant l'URL publique d'une fiche.","type":"string"}},"type":"object"},"Meta":{"properties":{"jeu_de_donnees":{"$ref":"#/components/schemas/JeuDeDonnees"},"remarques":{"description":"Précisions sur la donnée, son régime de réutilisation et ses défauts connus, que la fiche du producteur ne porte pas.","items":{"type":"string"},"type":"array"},"version_api":{"type":"string"}},"required":["version_api","jeu_de_donnees","remarques"],"type":"object"},"Modalite":{"description":"Une valeur admise par un filtre, avec son effectif.","properties":{"nombre":{"type":"integer"},"valeur":{"example":"Trotteur Francais","type":"string"}},"required":["valeur","nombre"],"type":"object"},"Noeud":{"description":"Nœud d'un arbre d'ascendance ; `pere` et `mere` sont des Noeud.","properties":{"annee_naissance":{"type":"integer"},"generation":{"description":"0 pour le sujet, 1 pour ses parents, etc.","type":"integer"},"id":{"type":"string"},"mere":{"$ref":"#/components/schemas/Noeud"},"nom":{"type":"string"},"pere":{"$ref":"#/components/schemas/Noeud"},"race":{"type":"string"},"sexe":{"type":"string"}},"type":"object"},"PageEquides":{"properties":{"donnees":{"description":"Résumés par défaut, fiches complètes si `vue=complet`.","items":{"oneOf":[{"$ref":"#/components/schemas/Resume"},{"$ref":"#/components/schemas/Equide"}]},"type":"array"},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["donnees","pagination"],"type":"object"},"Pagination":{"properties":{"limite":{"type":"integer"},"note":{"description":"Présent seulement quand la sélection dépasse la profondeur de pagination : le reste n'est pas atteignable par cette route.","type":"string"},"offset":{"type":"integer"},"precedent":{"description":"URI de la page précédente. Nulle sur la première page.","type":["string","null"]},"suivant":{"description":"URI de la page suivante, filtres conservés. Nulle sur la dernière page ou lorsque la profondeur maximale est atteinte.","type":["string","null"]},"total":{"description":"Lignes correspondant aux filtres, avant découpage.","type":"integer"}},"required":["total","limite","offset"],"type":"object"},"Pedigree":{"properties":{"arbre":{"$ref":"#/components/schemas/Noeud"},"generations":{"description":"Profondeur demandée.","type":"integer"},"noeuds":{"description":"Ancêtres réellement connus, sujet compris.","type":"integer"},"noeuds_theoriques":{"description":"Ce qu'un pedigree complet compterait à cette profondeur. L'écart avec `noeuds` mesure les lacunes de l'ascendance.","type":"integer"}},"required":["generations","noeuds","noeuds_theoriques","arbre"],"type":"object"},"Performance":{"properties":{"discipline":{"example":"TROT COURSE","type":"string"},"indices":{"items":{"properties":{"annee":{"type":"integer"},"appreciation":{"example":"indice-satisfaisant","type":"string"},"code":{"example":"BTR","type":"string"},"coefficient":{"example":0.35,"type":"number"},"valeur":{"example":"+59","type":"string"}},"type":"object"},"type":"array"},"texte":{"example":"BTR +59 (0.35)","type":"string"}},"type":"object"},"Probleme":{"description":"Corps d'erreur conforme à la RFC 9457 (« Problem Details for HTTP APIs »), servi en `application/problem+json`. Les champs `parametre` et `indice` sont des extensions, que la RFC autorise.","properties":{"detail":{"description":"Explication propre à cette occurrence.","example":"paramètre inconnu `rase`","type":"string"},"documentation":{"example":"https://docs.api-equides.org","type":"string"},"indice":{"description":"Extension : piste de correction — valeurs admises, référentiel à consulter, ou paramètre le plus proche en cas de faute de frappe.","example":"vouliez-vous dire `race` ?","type":"string"},"parametre":{"description":"Extension : paramètre fautif, quand l'erreur en désigne un.","example":"rase","type":"string"},"status":{"example":400,"type":"integer"},"title":{"description":"Résumé lisible, stable pour un `type` donné.","example":"Paramètre invalide","type":"string"},"type":{"description":"URI du type de problème, relative — le client la résout contre l'URI de la requête. Elle pointe vers la section correspondante de la documentation.","example":"/#erreur-parametre-invalide","type":"string"}},"required":["type","title","status","detail"],"type":"object"},"Produit":{"description":"Un produit direct, décrit comme un nœud de pedigree : mêmes champs, même sens.","properties":{"annee_naissance":{"example":2004,"type":"integer"},"fiche_disponible":{"description":"Toujours vrai : un produit est une fiche du jeu.","type":"boolean"},"id":{"example":"QylKqa2SStCCxjmFVYNvvg","type":"string"},"nom":{"example":"PAMPA D'ARPO","type":"string"},"race":{"type":"string"},"sexe":{"example":"Femelle","type":"string"}},"required":["id","nom","race","sexe","fiche_disponible"],"type":"object"},"Reference":{"description":"Renvoi vers un autre équidé du jeu de données.","properties":{"fiche_disponible":{"description":"Faux si la fiche du parent est absente du jeu de données.","type":"boolean"},"id":{"example":"gecpqPj6Rc2vy_Hz_Y1DmQ","type":"string"},"nom":{"example":"BOOSTER WINNER","type":"string"},"race":{"type":"string"}},"type":"object"},"Referentiel":{"properties":{"dimension":{"example":"races","type":"string"},"donnees":{"description":"De la modalité la plus fréquente à la plus rare, sauf pour `annees_naissance`, rendu par ordre chronologique.","items":{"$ref":"#/components/schemas/Modalite"},"type":"array"},"nombre_de_modalites":{"description":"Total réel, y compris les modalités écartées par la troncature.","type":"integer"},"note":{"description":"Présent seulement quand la liste est tronquée. Une troncature silencieuse laisserait croire à une liste exhaustive.","type":"string"}},"required":["dimension","nombre_de_modalites","donnees"],"type":"object"},"Repartition":{"properties":{"dimension":{"type":"string"},"donnees":{"items":{"$ref":"#/components/schemas/Tranche"},"type":"array"},"effectif_affiche":{"description":"Somme des effectifs renvoyés. Inférieure à `effectif_filtre` si `limite` tronque la liste, ou si des lignes n'ont pas de valeur pour cette dimension.","type":"integer"},"effectif_filtre":{"description":"Lignes retenues par les filtres, avant découpage.","type":"integer"}},"required":["dimension","effectif_filtre","effectif_affiche","donnees"],"type":"object"},"Resume":{"description":"Vue allégée servie par les listes. La fiche complète s'obtient sur /v1/equides/{id} — aucun lien n'est répété par ligne, il se déduit de l'identifiant.","properties":{"annee_naissance":{"example":2026,"type":"integer"},"id":{"example":"Z4ogLhlkS2CeUdq0bZ0YFw","type":"string"},"nom":{"example":"QABALAH MERCURY","type":"string"},"race":{"example":"Trotteur Francais","type":"string"},"robe":{"example":"Bai","type":"string"},"sexe":{"enum":["Femelle","Male","Hongre","Indeter"],"type":"string"}},"required":["id","nom","race","sexe"],"type":"object"},"Sante":{"properties":{"lignes":{"description":"Lignes chargées en mémoire. Le service n'est prêt qu'au-delà de zéro.","type":"integer"},"statut":{"enum":["ok","indisponible"],"type":"string"},"version":{"type":"string"}},"required":["statut","lignes","version"],"type":"object"},"Stats":{"properties":{"annee_naissance_max":{"type":["integer","null"]},"annee_naissance_min":{"type":["integer","null"]},"avec_filiation":{"description":"Équidés dont au moins un parent est renseigné.","type":"integer"},"avec_performances":{"type":"integer"},"avertissement":{"description":"Rappel du sens de « sans performances », que le seul effectif induirait en erreur.","type":"string"},"nombre_de_disciplines":{"type":"integer"},"nombre_de_races":{"type":"integer"},"nombre_de_robes":{"type":"integer"},"par_sexe":{"items":{"$ref":"#/components/schemas/Tranche"},"type":"array"},"sans_filiation":{"type":"integer"},"sans_performances":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"Suggestions":{"properties":{"limite":{"type":"integer"},"q":{"description":"Requête telle que reçue, pour que le client sache à quoi la réponse répond — les frappes arrivent dans le désordre.","type":"string"},"resultats":{"description":"De la suggestion la plus pertinente à la moins.","items":{"properties":{"annee_naissance":{"type":"integer"},"id":{"type":"string"},"nom":{"type":"string"},"race":{"type":"string"},"score":{"description":"Pertinence dans [0, 1] ; 1 pour une correspondance exacte de mot.","type":"number"},"sexe":{"type":"string"}},"type":"object"},"type":"array"}},"required":["q","limite","resultats"],"type":"object"},"Tranche":{"description":"Une modalité et son effectif dans la sélection.","properties":{"nombre":{"type":"integer"},"valeur":{"type":"string"}},"required":["valeur","nombre"],"type":"object"}}},"info":{"contact":{"name":"Fiches d'origine","url":"https://infochevaux.ifce.fr"},"description":"API REST ouverte sur les fiches publiques d'équidés de l'IFCE, avec généalogie et indices de performance.\n\n**Service indépendant, non affilié à l'IFCE.** La donnée servie est une extraction datée ; les fiches en ligne font seules autorité.\n\n**Données** : Extraction des fiches publiques d'infochevaux.ifce.fr, 4446638 fiches. Licence : Licence Ouverte / réutilisation d'informations publiques (CRPA art. L321-1). Mentionnez la source et la date de mise à jour, exposées par `/v1/meta`. Aucune donnée à caractère personnel n'est exposée.\n\n**Sans authentification** : ni clé, ni jeton, ni compte.\n\n## Limites\n\nDébit 50 unités par seconde et par adresse, rafale 200 — une requête ordinaire coûte une unité, les réponses volumineuses davantage. Concurrence 8, délai 5 s. Pagination 100 lignes, profondeur 10000. Pedigree 8 générations. Requête 64 paramètres et 4096 octets. Référentiels tronqués à 2000 modalités.\n\nLes réponses portent un `ETag` et un `Cache-Control` d'une heure ; une revalidation `If-None-Match` renvoie `304` sans rien recalculer. Les erreurs suivent la RFC 9457, en `application/problem+json`.","license":{"identifier":"MIT","name":"MIT (code)"},"summary":"Interrogation des données publiques des équidés enregistrés en France depuis 1976.","title":"API Équidés","version":"1.1.1"},"openapi":"3.1.0","paths":{"/":{"get":{"description":"Le point d'entrée : routes servies, gabarits d'URL, licence et provenance. Un client qui ne connaît que cette URL y trouve de quoi construire toutes les autres. La documentation destinée aux humains vit sur <https://docs.api-equides.org>.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Decouverte"}}},"description":"Document de découverte."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Document de découverte","tags":["Service"]}},"/healthz":{"get":{"description":"Reste sur le port public : un répartiteur de charge doit pouvoir l'interroger sans accès au plan d'administration. La télémétrie Prometheus, elle, n'est servie que sur l'écoute privée.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}},"description":"Service opérationnel."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}},"description":"Aucune donnée chargée : le service n'est pas prêt."}},"summary":"Sonde de vivacité","tags":["Service"]}},"/openapi.json":{"get":{"description":"La page de documentation est rendue depuis ce document : l'une ne peut pas diverger de l'autre.","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Document OpenAPI 3.1."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Description OpenAPI de ce service","tags":["Service"]}},"/readyz":{"get":{"description":"Identique à `/healthz` : l'image de données étant chargée avant la première écoute, vivacité et disponibilité se confondent ici. Les deux routes existent pour les orchestrateurs qui distinguent les deux sondes.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}},"description":"Service prêt."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sante"}}},"description":"Aucune donnée chargée."}},"summary":"Sonde de disponibilité","tags":["Service"]}},"/v1/equides":{"get":{"description":"Les filtres d'une même dimension se combinent en OU, les dimensions différentes en ET.\n\nLes lignes sont renvoyées en **résumé** par défaut ; `vue=complet` sert les fiches entières.\n\nAucune réponse ne porte de lien déductible d'un identifiant : les gabarits d'URL sont publiés par `GET /`.","parameters":[{"description":"Race, répétable pour un OU (`?race=A&race=B`) ou séparée par des virgules. Insensible à la casse et aux accents. Le jeu compte 11 747 races distinctes ; valeurs admises sur /v1/referentiels/races.","example":"Pur Sang","in":"query","name":"race","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Robe, mêmes règles que `race`. Valeurs admises : /v1/referentiels/robes.","example":"Bai","in":"query","name":"robe","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Sexe tel qu'écrit par la source : `Femelle`, `Male`, `Hongre`, `Indeter`.","example":"Femelle","in":"query","name":"sexe","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Restreint aux équidés portant des performances dans cette discipline. Valeurs admises : /v1/referentiels/disciplines.","example":"TROT COURSE","in":"query","name":"discipline","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Restreint aux équidés portant un indice de ce code (`BTR`, `ISO`, `ITR`…). Valeurs admises : /v1/referentiels/codes_indice.","example":"ISO","in":"query","name":"indice","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Millésime de naissance, répétable.","example":2015,"in":"query","name":"annee_naissance","required":false,"schema":{"items":{"type":"integer"},"type":"array"}},{"description":"Recherche sur le nom. Chaque mot de la requête est traité comme un préfixe et tous doivent être présents : `qabalah mer` retrouve « QABALAH MERCURY ».","example":"qabalah","in":"query","name":"nom","required":false,"schema":{"type":"string"}},{"description":"Millésime de naissance minimal, inclus.","example":2010,"in":"query","name":"annee_min","required":false,"schema":{"type":"integer"}},{"description":"Millésime de naissance maximal, inclus.","example":2020,"in":"query","name":"annee_max","required":false,"schema":{"type":"integer"}},{"description":"Restreint aux équidés portant (ou non) des indices de performance. Accepte `true`, `false`, `1`, `0`, `oui`, `non`. Attention : `false` ne signifie pas que l'équidé n'a jamais concouru, seulement qu'aucun indice n'est publié — 75,1 % du jeu est dans ce cas.","example":true,"in":"query","name":"avec_performances","required":false,"schema":{"type":"boolean"}},{"description":"Ordre : `naturel` (ordre du fichier source, défaut), `nom`, `annee`. Préfixer par `-` inverse le sens. Les millésimes absents sont toujours placés en fin de liste.","example":"-annee","in":"query","name":"tri","required":false,"schema":{"default":"naturel","enum":["naturel","nom","annee","-naturel","-nom","-annee"],"type":"string"}},{"description":"Niveau de détail des lignes renvoyées : `resume` (défaut, ~180 octets par ligne) ou `complet` (fiche entière, ~1,1 Kio par ligne).","example":"resume","in":"query","name":"vue","required":false,"schema":{"default":"resume","enum":["resume","complet"],"type":"string"}},{"description":"Lignes par page (1 à 100, défaut 20). Une valeur hors bornes est refusée par un `400`.","example":20,"in":"query","name":"limite","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Décalage, plafonné à 10000 ; au-delà, un `400`. La pagination profonde dégrade le service : pour parcourir le jeu entier, téléchargez le fichier publié.","example":0,"in":"query","name":"offset","required":false,"schema":{"default":0,"maximum":10000,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageEquides"}}},"description":"Page de résultats."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Paramètre inconnu, valeur hors bornes, ou modalité que le référentiel n'admet pas."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Rechercher des équidés","tags":["Équidés"]}},"/v1/equides/{id}":{"get":{"parameters":[{"description":"Identifiant renvoyé par la recherche : celui de l'IFCE, 22 caractères en base64 URL.","example":"Z4ogLhlkS2CeUdq0bZ0YFw","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Equide"}}},"description":"L'équidé demandé."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Identifiant inconnu ou mal formé — les deux cas donnent la même réponse."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Consulter un équidé","tags":["Équidés"]}},"/v1/equides/{id}/descendance":{"get":{"description":"Réponse symétrique au pedigree, servie par un index inverse bâti au chargement.\n\nNe renvoie que les produits **directs** : la descendance complète se parcourt en suivant les identifiants de proche en proche.","parameters":[{"example":"Z4ogLhlkS2CeUdq0bZ0YFw","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Produits par page (1 à 100, défaut 50). Une valeur hors bornes est ramenée au plafond, non refusée.","example":50,"in":"query","name":"limite","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"description":"Décalage dans la liste des produits. Un décalage au-delà du total renvoie une page vide, `total` restant le compte réel.","example":0,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Descendance"}}},"description":"Descendance directe, page courante."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Paramètre inconnu ou non entier."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Identifiant inconnu."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Produits directs","tags":["Généalogie"]}},"/v1/equides/{id}/pedigree":{"get":{"description":"En REST naïf, remonter un pedigree coûterait une requête par ancêtre — 31 allers-retours sur cinq générations. La filiation étant résolue en indices de ligne à l'ingestion, cet endpoint répond en une seule requête cacheable, au coût borné.\n\nUn parent référencé mais absent du jeu interrompt la branche : l'écart entre `noeuds` et `noeuds_theoriques` mesure ces lacunes.","parameters":[{"example":"Z4ogLhlkS2CeUdq0bZ0YFw","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Profondeur, 4 par défaut, 8 au maximum ; au-delà, un `400`. Un arbre double de taille à chaque rang : 8 générations représentent déjà jusqu'à 1 023 ancêtres.","example":5,"in":"query","name":"generations","required":false,"schema":{"default":4,"maximum":8,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pedigree"}}},"description":"Arbre d'ascendance. `noeuds` compte les ancêtres réellement connus, `noeuds_theoriques` ceux qu'un pedigree complet compterait."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Profondeur hors bornes."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Identifiant inconnu."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Ascendance sur N générations","tags":["Généalogie"]}},"/v1/meta":{"get":{"description":"La réutilisation impose de mentionner la source et la date de mise à jour : `source`, `ingere_le` et `empreinte_source` y pourvoient.\n\nLes `remarques` énoncent les défauts connus de la source et le régime de réutilisation applicable.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":"Métadonnées du jeu de données chargé."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Provenance, licence et qualité de la donnée servie","tags":["Service"]}},"/v1/referentiels/{dimension}":{"get":{"description":"Sans cette liste, un intégrateur ne peut pas deviner que la source écrit `Trotteur Francais` sans cédille ni accent, ni que le sexe se dit `Femelle` et non `F`.\n\nLes modalités sont rendues de la plus fréquente à la plus rare, et la liste est tronquée à 2000 entrées — `nombre_de_modalites` donne alors le total réel et `note` signale la troncature. `annees_naissance` fait exception : rendu en entier, par ordre chronologique.","parameters":[{"description":"Référentiel demandé. `races_lien` porte les 13 races propres déclarées sur les liens de filiation, là où `races` reflète un champ pollué par la source.","example":"races","in":"path","name":"dimension","required":true,"schema":{"enum":["races","robes","sexes","disciplines","codes_indice","races_lien","annees_naissance"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Referentiel"}}},"description":"Modalités et effectifs, du plus fréquent au plus rare."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Référentiel inconnu."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Lister les valeurs admises par un filtre","tags":["Référentiels"]}},"/v1/search":{"get":{"description":"Renvoie des suggestions **classées par pertinence**, pour alimenter un champ de saisie.\n\nÀ distinguer de `/v1/equides?nom=…`, qui filtre et pagine sans classer. Ici le coût est borné par `limite` et non par la popularité du préfixe : la réponse doit arriver avant la frappe suivante.","parameters":[{"description":"Début de nom, insensible à la casse et aux accents. Obligatoire et non vide.\n\nLes espaces comptent : chaque mot déjà saisi doit se retrouver dans le nom, seul le dernier est traité comme un début de mot. `INVICTUS DU F` ne suggère donc que des noms portant `INVICTUS`, `DU`, et un mot commençant par `F`.","example":"invictus du f","in":"query","name":"q","required":true,"schema":{"minLength":1,"type":"string"}},{"description":"Nombre de suggestions (1 à 100, défaut 10). Une valeur hors bornes est ramenée au plafond, non refusée.","example":10,"in":"query","name":"limite","required":false,"schema":{"default":10,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suggestions"}}},"description":"Suggestions, de la plus pertinente à la moins."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"`q` manquant ou vide, ou paramètre inconnu."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Autocomplétion sur le nom","tags":["Équidés"]}},"/v1/stats":{"get":{"description":"Effectifs globaux, sans filtre. Pour ventiler une sélection, voir `/v1/stats/repartition`.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}},"description":"Effectifs globaux."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Vue d'ensemble du jeu de données","tags":["Statistiques"]}},"/v1/stats/repartition":{"get":{"description":"Accepte les mêmes filtres que la recherche : la répartition porte sur la sélection filtrée.\n\nDe quoi peupler des facettes sans rapatrier les lignes : seuls les effectifs traversent le réseau.","parameters":[{"description":"Race, répétable pour un OU (`?race=A&race=B`) ou séparée par des virgules. Insensible à la casse et aux accents. Le jeu compte 11 747 races distinctes ; valeurs admises sur /v1/referentiels/races.","example":"Pur Sang","in":"query","name":"race","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Robe, mêmes règles que `race`. Valeurs admises : /v1/referentiels/robes.","example":"Bai","in":"query","name":"robe","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Sexe tel qu'écrit par la source : `Femelle`, `Male`, `Hongre`, `Indeter`.","example":"Femelle","in":"query","name":"sexe","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Restreint aux équidés portant des performances dans cette discipline. Valeurs admises : /v1/referentiels/disciplines.","example":"TROT COURSE","in":"query","name":"discipline","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Restreint aux équidés portant un indice de ce code (`BTR`, `ISO`, `ITR`…). Valeurs admises : /v1/referentiels/codes_indice.","example":"ISO","in":"query","name":"indice","required":false,"schema":{"items":{"type":"string"},"type":"array"}},{"description":"Millésime de naissance, répétable.","example":2015,"in":"query","name":"annee_naissance","required":false,"schema":{"items":{"type":"integer"},"type":"array"}},{"description":"Recherche sur le nom. Chaque mot de la requête est traité comme un préfixe et tous doivent être présents : `qabalah mer` retrouve « QABALAH MERCURY ».","example":"qabalah","in":"query","name":"nom","required":false,"schema":{"type":"string"}},{"description":"Millésime de naissance minimal, inclus.","example":2010,"in":"query","name":"annee_min","required":false,"schema":{"type":"integer"}},{"description":"Millésime de naissance maximal, inclus.","example":2020,"in":"query","name":"annee_max","required":false,"schema":{"type":"integer"}},{"description":"Restreint aux équidés portant (ou non) des indices de performance. Accepte `true`, `false`, `1`, `0`, `oui`, `non`. Attention : `false` ne signifie pas que l'équidé n'a jamais concouru, seulement qu'aucun indice n'est publié — 75,1 % du jeu est dans ce cas.","example":true,"in":"query","name":"avec_performances","required":false,"schema":{"type":"boolean"}},{"description":"Dimension à ventiler : `race`, `robe`, `sexe`, `discipline`, `annee_naissance`.","example":"race","in":"query","name":"dimension","required":false,"schema":{"default":"race","enum":["race","robe","sexe","discipline","annee_naissance"],"type":"string"}},{"description":"Nombre de modalités renvoyées, les plus fournies d'abord (1 à 1000, défaut 50). Une valeur hors bornes est ramenée au plafond, non refusée. Sans effet sur `annee_naissance`, rendue en entier.","example":20,"in":"query","name":"limite","required":false,"schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Repartition"}}},"description":"Effectifs par modalité."},"304":{"description":"Contenu inchangé depuis l'`ETag` fourni en `If-None-Match`. Aucun corps, et rien n'est recalculé côté service."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Dimension ou filtre invalide."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Quota de débit dépassé pour l'adresse appelante. `Retry-After` indique le délai."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Probleme"}}},"description":"Capacité de traitement simultané atteinte, délai maximal dépassé, ou données non chargées. `Retry-After` indique le délai."}},"summary":"Ventiler une sélection selon une dimension","tags":["Statistiques"]}}},"servers":[{"description":"Instance publique","url":"https://api-equides.org"},{"description":"Ce serveur","url":"/"}],"tags":[{"description":"Recherche et consultation.","name":"Équidés"},{"description":"Ascendance et descendance.","name":"Généalogie"},{"description":"Valeurs admises par les filtres.","name":"Référentiels"},{"description":"Agrégats et répartitions.","name":"Statistiques"},{"description":"Découverte, métadonnées et exploitation.","name":"Service"}],"x-erreurs":[{"ancre":"erreur-parametre-invalide","quand":"Un paramètre est inconnu, mal typé, hors bornes, ou porte une valeur que le référentiel n'admet pas. Le champ `parametre` le nomme et `indice` propose la correction — une faute de frappe reçoit la suggestion du paramètre le plus proche.","statut":400,"titre":"Paramètre invalide","uri":"https://docs.api-equides.org/guides/erreurs/#erreur-parametre-invalide"},{"ancre":"erreur-requete-invalide","quand":"La requête ne peut pas être traitée telle quelle, sans qu'un paramètre précis soit en cause.","statut":400,"titre":"Requête invalide","uri":"https://docs.api-equides.org/guides/erreurs/#erreur-requete-invalide"},{"ancre":"erreur-introuvable","quand":"L'identifiant ne correspond à aucune fiche du jeu de données, ou la route n'existe pas. Un identifiant mal formé donne le même résultat qu'un identifiant inconnu.","statut":404,"titre":"Ressource introuvable","uri":"https://docs.api-equides.org/guides/erreurs/#erreur-introuvable"},{"ancre":"erreur-trop-de-requetes","quand":"Le quota de débit de l'adresse appelante est dépassé. La réponse porte un `Retry-After` indiquant le délai à respecter.","statut":429,"titre":"Trop de requêtes","uri":"https://docs.api-equides.org/guides/erreurs/#erreur-trop-de-requetes"},{"ancre":"erreur-service-surcharge","quand":"La capacité de traitement simultané est atteinte, ou la requête a dépassé le délai maximal. Le service refuse tôt, avec un `Retry-After`, plutôt que de faire attendre une réponse qui expirerait.","statut":503,"titre":"Service momentanément surchargé","uri":"https://docs.api-equides.org/guides/erreurs/#erreur-service-surcharge"}]}