Forfait Free

API de catégories d'aliments

Parcourez toutes les catégories alimentaires avec leur nombre de produits — la base de vos filtres, facettes et menus de navigation. Du JSON paginé sur tout le catalogue, servi depuis une vue précalculée pour rester rapide.

200 OK
GET /v1/categories
curl -H "X-API-Key: food_•••" \
  "https://foodbase.dev/v1/categories"

{
  "data": [
    { "category": "Popcorn, Peanuts, Seeds & Related Snacks", "product_count": 95496 },
    { "category": "Candy", "product_count": 92693 },
    { "category": "Cheese", "product_count": 85564 }
  ],
  "total": 306779
}

Vous préférez cliquer ? Essayez l'explorateur de produits ou le bac à sable photo.

Ce que vous obtenez

category

Le nom de la catégorie.

product_count

Le nombre de produits qu'elle contient.

total

Nombre de catégories distinctes.

Prête pour les filtres

Combinez-la avec la recherche pour restreindre les résultats par catégorie.

Inclus dans le forfait gratuit — 100 requêtes/jour, sans carte bancaire. Voir les forfaits →

Exemples de code

La même requête en curl, JavaScript et Python. Remplacez YOUR_API_KEY par une clé de votre tableau de bord.


              curl "https://foodbase.dev/v1/categories?q=chocolate&limit=10" \
  -H "X-API-Key: YOUR_API_KEY"
            

Comment ça marche

Ce que renvoie une requête

GET /v1/categories lit une table précalculée de toutes les chaînes de catégorie distinctes du catalogue avec le nombre de produits qui les portent ; les produits sans catégorie sont exclus. Les lignes sont triées par product_count décroissant sans tri secondaire : ne comptez pas sur l'ordre des lignes à nombre égal.

q est un filtre de sous-chaîne insensible à la casse, pas un préfixe : q=chocolate trouve aussi bien "Chocolate", "en:chocolates" que "Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks", ce qui réduit la réponse capturée à un total de 11303 chaînes distinctes. Les espaces en bord sont supprimés, % et _ sont pris littéralement, et q est limité à 200 caractères.

limit va de 1 à 100 (20 par défaut) et offset de 0 à 10000 : avec limit=100 vous atteignez au plus les 10 100 premières lignes ; affinez avec q plutôt que de paginer plus loin. Les réponses portent Cache-Control: public, max-age=600, le serveur met en cache pendant une heure, et la table n'est reconstruite que lors d'une réimportation complète : récupérez-la une fois au démarrage ou pendant le build et stockez le résultat.

Deux formes de chaîne de catégorie

Les produits Open Food Facts portent une hiérarchie jointe par des virgules, du général au précis : "Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates". Les segments peuvent être des tags de taxonomie bruts avec un préfixe de langue à deux lettres ("en:chocolate-candies"), être dans la langue de l'étiquette ("Botanas, Snacks dulces, Cacao y sus productos, Chocolates, Chocolates negros"), et se terminent souvent par un fourre-tout comme en:groceries qui n'est pas le niveau le plus précis.

Les produits USDA portent une seule catégorie de distribution à plat, dont le nom peut lui-même contenir des virgules ("Chips, Pretzels & Snacks") ; ne la découpez jamais. Les lignes ici ne portent pas de source : si vous en avez besoin, récupérez un produit de la catégorie avec l'API de base de données alimentaire et lisez source à côté de category et categories_tags.

Une même hiérarchie peut apparaître sur plusieurs lignes : la réponse capturée liste séparément "Snacks, Sweet snacks, Cocoa and its products, Chocolates, Dark chocolates" (497 produits) et le même chemin sans espaces après les virgules (339). Fusionnez sur les segments nettoyés, pas sur la chaîne brute.

Construire un arbre de navigation ou une interface de filtres

Appliquez le nettoyage qu'utilise le site : découpez sur les virgules, supprimez les espaces, retirez un tag xx: en tête, remplacez les tirets par des espaces, mettez la première lettre en majuscule et supprimez les segments répétés sans tenir compte de la casse. Le premier segment nettoyé est la racine ; le dernier qui n'est pas un fourre-tout (groceries, food, foods, products, unknown, none) est la feuille. Le nombre d'un nœud est la somme des product_count de toutes les chaînes brutes qui y mènent.

  • Nœuds racines : regroupez par premier segment nettoyé ("Snacks", "Beverages", "Botanas").
  • Puces de feuille : le dernier segment qui n'est pas un fourre-tout ("Dark chocolates", "Chocolate milks").
  • Noms USDA à plat : la chaîne entière est à la fois racine et feuille.
  • Langue : les hiérarchies dans des langues différentes restent des nœuds séparés ; pour les traductions par produit, passez lang= à l'API de recherche alimentaire et lisez category_localized et category_segments_localized.
  • L'arbre de navigation du site sur /categories/ applique les mêmes règles de nettoyage à ces données (et ne garde que les plus grandes feuilles) : servez-vous-en pour vérifier votre résultat.

D'une catégorie à ses produits

La recherche n'a pas de paramètre de catégorie. L'API de recherche alimentaire compare d'abord les noms de produits et les marques, et seulement si cela ne trouve rien, compare les mots de votre requête aux chaînes de catégorie. Envoyez comme q un segment nettoyé complet qui n'est pas lui-même un nom de produit, comme "Seeds & Related Snacks", et vous obtenez les produits de cette catégorie triés par popularité.

Le repli fonctionne par mots : "Seeds & Related Snacks" correspond donc à toute chaîne de catégorie contenant ces mots, dans n'importe quelle langue, et un segment qui est aussi un mot de produit courant ("Chocolate" ou "Dark chocolates") ne l'atteint jamais, car les noms de produits correspondent en premier. Pour une liste stricte, filtrez chaque résultat sur son champ category, qui est la chaîne brute renvoyée par cet endpoint.

Ce que vous pouvez créer

Filtres et facettes

Affichez une navigation par catégories avec le nombre de produits à jour.

Vues d'ensemble du catalogue

Montrez aux utilisateurs la forme du jeu de données avant qu'ils ne cherchent.

Tableaux de bord analytiques

Visualisez la répartition des produits entre les catégories.

Limites par forfait

Free 100 requêtes/jour partagées entre les endpoints, 1/s (rafale de 5) ; de quoi rafraîchir un arbre en cache plusieurs fois par jour.
Starter 5 000 requêtes/jour, 5/s (rafale de 25).
Pro 25 000 requêtes/jour, 20/s (rafale de 100).
Enterprise 100 000 requêtes/jour, 50/s (rafale de 250).

Chaque réponse contient des en-têtes X-RateLimit-* indiquant le budget restant ; chaque 429 contient Retry-After . Comparer les forfaits →

Erreurs et comment les gérer

401 — X-API-Key est absent, invalide ou révoqué.

Envoyez une clé du tableau de bord ; le champ error du corps précise le cas.

422 — limit hors de 1–100, offset hors de 0–10000, ou q de plus de 200 caractères.

Bornez les valeurs côté client ; la validation renvoie ici 422, pas 400.

429 — La limite par seconde de la clé ou le quota quotidien du compte est épuisé.

Attendez Retry-After et servez votre copie en cache entre-temps.

Comparaison avec d'autres API

Il s'agit d'une liste des chaînes de catégorie telles que stockées, avec leurs nombres, pas d'une taxonomie organisée. Les contributeurs d'Open Food Facts et l'import USDA fournissent chacun leur propre forme, espacement, langue et tags, et l'endpoint ne les fusionne pas ; les règles de nettoyage ci-dessus sont à appliquer de votre côté. En échange, les nombres correspondent exactement au catalogue et chaque chaîne peut être renvoyée telle quelle à la recherche ou comparée au champ category d'un produit. Construisez un arbre normalisé à partir de cette liste et mettez-le en cache, car les données ne changent qu'à la réimportation.

Voir la comparaison complète des API de données alimentaires →

Questions fréquentes

q est-il une correspondance par préfixe ou par sous-chaîne ? +

Par sous-chaîne, insensible à la casse, n'importe où dans la chaîne ; q=chocolate renvoie "Beverages, Dairies, Dairy drinks, Flavoured milks, Chocolate milks" aussi bien que "Chocolate". Il n'est pas possible de l'ancrer au début.

Pourquoi vois-je la même hiérarchie plusieurs fois ? +

Les chaînes stockées diffèrent par l'espacement, le balisage ("en:chocolates" contre "Chocolates") ou la langue, et l'endpoint compte par chaîne brute. Fusionnez sur les segments nettoyés pour les regrouper.

Puis-je lister uniquement les catégories USDA ou uniquement celles d'Open Food Facts ? +

Non : il n'y a pas de filtre par source et les lignes ne portent pas de source. Récupérez un produit de la catégorie avec l'API de base de données alimentaire et lisez son champ source.

Puis-je filtrer la recherche par catégorie ? +

Pas avec un paramètre. Envoyez le segment comme q à l'API de recherche alimentaire, qui ne se replie sur les catégories que si aucun nom de produit ni aucune marque ne correspond ; filtrez sur le champ category de chaque résultat pour une correspondance exacte.

total compte-t-il des produits ou des catégories ? +

Les chaînes de catégorie distinctes qui correspondent à q : dans la réponse capturée, total vaut 11303 pour q=chocolate alors que la première ligne à elle seule compte 46110 produits. Additionnez vous-même les product_count pour obtenir un total de produits.

Commencez à développer avec l'API de catégories d'aliments

Gratuit pour démarrer. Sans carte bancaire.

Obtenir une clé API Aller au tableau de bord