API

API eBay pour ebay.fr : les annonces en cours, leurs prix et leurs enchères en JSON

Avec `"domain": "fr"`, chaque appel interroge ebay.fr et renvoie ce qu'un acheteur voit sur le site : titre, prix en euros, état (« Occasion », « Neuf »), achat immédiat ou enchères avec le nombre d'enchères, frais de livraison, puis, sur la fiche, les caractéristiques saisies par le vendeur et la date de fin. Les API officielles d'eBay (programme eBay Developers) demandent d'enregistrer une application et d'obtenir des jetons OAuth, et servent notamment aux vendeurs pour gérer leurs annonces, leurs commandes ou leur stock ; ici, rien de tel : on lit les annonces publiques, côté acheteur. Une précision pour ceux qui cherchent le « prix vendu » : la recherche ne couvre que les annonces en cours, pas les objets déjà vendus.

Endpoints

endpointCe qui est renvoyéObligatoires
searchRecherche par mot-clé sur le site choisi (`domain`) : prix, état dans les mots du site, format d'achat (`buying_format` tel qu'affiché, `buying_format_code` pour filtrer), frais de livraison en texte. Filtres : état, catégorie, prix minimum et maximum, achat immédiat ou enchères seulement, livraison gratuite, retours acceptés, « Faire une offre » accepté. Tris : pertinence, nouveautés, fin la plus proche, prix croissant ou décroissant. 240 annonces au maximum par page.query
item_detailUne annonce par numéro d'objet ou URL : prix, état, caractéristiques de l'objet (`item_specifics`, en français), catégorie, photos, frais de livraison avec le pays de destination, fin de l'enchère et enchère en cours, quantités, variantes, et `listing_status` (active / ended) pour ne pas confondre une annonce terminée avec un objet disponible. Description du vendeur en option.tous optionnels
items_batchJusqu'à 40 numéros d'objet en un seul appel, chacun avec la même fiche que `item_detail`. Les numéros qu'eBay ne trouve plus reviennent dans `not_found`.item_ids
seller_itemsLes annonces en cours d'une boutique, à partir du pseudo du vendeur, avec les mêmes lignes, filtres et pages que la recherche.seller
seller_profileLa réputation d'un vendeur : score et pourcentage d'évaluations positives, évaluations sur 1, 6 et 12 mois, objets vendus, membre depuis, vendeur professionnel ou non.seller
dealsLes offres du jour d'eBay (/deals) : prix, prix barré, frais de livraison.tous optionnels
categoriesL'arborescence des catégories, avec une recherche par nom pour retrouver l'identifiant à passer au filtre `category`.tous optionnels

Chaque appel est facturé en crédits. Les appels en échec ou bloqués sont gratuits.

Exemple qui fonctionne

Sur ces 20 premières lignes, 10 étaient des enchères, dont 9 à « 0 enchères » : le prix affiché est alors la mise à prix fixée par le vendeur, pas un prix de marché. `buying_format` garde le libellé d'ebay.fr et `buying_format_code` donne une valeur stable (`auction`, `buy_it_now`) pour filtrer. Les frais de port n'existent qu'en texte (« +2,78 EUR pour la livraison »). Et 8 lignes n'avaient ni état, ni format, ni frais de port : la fiche de l'une d'elles, ouverte avec `item_detail`, donnait bien l'état (« New »), mais toujours pas de frais de port.

Requête
curl -X POST https://api.reefapi.com/ebay/v1/search \
  -H "x-api-key: VOTRE_CLE" \
  -H "content-type: application/json" \
  -d '{"query": "vinyle johnny hallyday", "domain": "fr", "max_results": 20}'
Réponse (abrégée)
{
  "ok": true,
  "data": {
    "query": "vinyle johnny hallyday",
    "results": [
      {
        "item_id": "840061201435",
        "title": "Johnny Hallyday – 24.000 Baisers, EP 45 tours 17 cm, chanson française",
        "price": { "raw": "2,74 EUR", "value": 2.74, "currency": "EUR" },
        "condition": "Occasion",
        "buying_format": "0 enchères",
        "buying_format_code": "auction",
        "shipping": "+2,78 EUR pour la livraison",
        "url": "https://www.ebay.fr/itm/840061201435",
        "in_stock": true
      },
      {
        "item_id": "128155969867",
        "title": "Johnny Hallyday Album 2 Disques - 2x LP 33T Fra 1977. Médias x2 N.Mint.",
        "price": { "raw": "10,00 EUR", "value": 10.0, "currency": "EUR" },
        "condition": "Occasion",
        "buying_format": "Achat immédiat",
        "buying_format_code": "buy_it_now",
        "shipping": "+3,98 EUR pour la livraison",
        "url": "https://www.ebay.fr/itm/128155969867",
        "in_stock": true
      },
      ...
      {
        "item_id": "317251386866",
        "title": "JOHNNY HALLYDAY LE SPECIALISTE 45 TOURS PICTURE Lmtd 0570/1000 Vinyle RARE NEUF",
        "price": { "raw": "47,94 EUR", "value": 47.94, "currency": "EUR" },
        "url": "https://www.ebay.fr/itm/317251386866",
        "in_stock": true
      },
      ...
    ]
  },
  "meta": { "record_count": 20, "domain": "fr", "pagination": { "page": 1, "has_more": true }, "cache_hit": false, "mode": "live" }
}

Scraper ebay.fr en Python : ventes réussies, libellés français, mises à prix

Beaucoup de scrapers eBay servent à relever les prix des objets vendus. Ce chemin est fermé aux visiteurs non connectés : nous l'avons constaté en août 2026, puis revérifié en octobre sur onze sites eBay. La recherche filtrée sur les ventes réussies et terminées (`LH_Sold=1&LH_Complete=1`) renvoie vers la page de connexion d'eBay, intitulée « Sign in or Register | eBay », sans aucune annonce. Le même résultat s'obtient dans un navigateur ordinaire, sans être connecté : c'est un choix d'eBay, pas un blocage. Un script qui ne vérifie que le nombre de lignes conclut simplement qu'il n'y a rien.

Les cartes de résultats d'ebay.fr ne parlent pas comme celles d'ebay.com. En septembre 2026, notre propre parser ne reconnaissait le format d'achat qu'en anglais : « Achat immédiat », « ou Faire une offre » et « 0 enchères » lui échappaient, et le champ restait vide. Les libellés ont été relevés sur les sites eux-mêmes, puis `buying_format_code` a été ajouté pour filtrer de la même façon sur tous les pays. Le lieu où se trouve l'objet, lui, ne ressort toujours pas des cartes d'ebay.fr (voir les limites).

Dernier piège, propre aux enchères : une annonce sans enchère affiche sa mise à prix comme n'importe quel prix. Sur notre recherche limitée aux enchères et triée par fin la plus proche, 18 annonces sur 20 en étaient à « 0 enchères ». Un relevé qui stocke `price` sans `buying_format` mélange des prix demandés et des prix disputés.

Une « cote » calculée sur ces données reste une cote de prix demandés : la recherche ne voit que ce qui est encore proposé, jamais ce qui a trouvé preneur. Si votre projet repose sur les prix de vente réels, c'est par là qu'il faut commencer, pas par le parser.

Limites et remarques honnêtes

  • Rien d'officiel : ce service ne fait pas partie de l'eBay Developers Program, et ReefAPI n'a conclu aucun accord avec eBay.
  • Sans `domain`, la requête part sur ebay.com avec des prix en dollars ; pour la France, passez `"domain": "fr"` à chaque appel.
  • Pas de recherche dans les objets vendus : eBay la réserve aux membres connectés (constaté en août 2026), et nous ne lisons pas eBay avec un compte. Les endpoints de cette API portent sur des annonces en cours, ou sur une annonce précise via `item_detail`, même terminée. Une API distincte, eBay Sold Listings (`ebay-sold`), lit ce qu'eBay publie encore sans connexion : la fiche d'une annonce vendue à partir de son numéro et les ventes passées d'un vendeur.
  • Dans la recherche sur ebay.fr, `location` est resté vide sur les 40 lignes de nos deux requêtes, et aucune ligne ne nommait le vendeur. Les frais de port ne sont qu'un texte, et 8 lignes sur 20 sont arrivées sans état, sans format d'achat et sans frais de port.
  • `item_detail` donne l'état en anglais (« Used », « New ») alors que la recherche l'affiche en français (« Occasion », « Neuf ») ; les caractéristiques, elles, restent en français (« État », « Vitesse : 45 tours »). Sur nos trois fiches, `return_policy` était vide et `seller` manquait deux fois.
  • Les frais de port d'`item_detail` sont calculés pour le pays indiqué dans `shipping.country`, qui n'est pas forcément la France : sur une de nos trois fiches, c'était « USA » pour 9,60 €, alors que la carte de recherche affichait « +5,90 EUR pour la livraison ».
  • Sur une enchère sans enchérisseur, `current_bid` contient la mise à prix (40,88 € sur une annonce à « 0 enchères ») et la fiche ne donne pas le nombre d'enchères : il faut le lire dans `buying_format` côté recherche. `time_left` n'est qu'un libellé tronqué (« Se termine dans ») ; l'heure de fin exacte est dans `end_time`.
  • Coût : `search`, `deals` et `categories` 1 crédit, `item_detail` et `seller_items` 2, `seller_profile` 3, et `items_batch` 2 crédits par numéro d'objet envoyé.