DEV Community

Cover image for Comment utiliser les APIs eBay ?
Antoine Laurent
Antoine Laurent

Posted on • Originally published at apidog.com

Comment utiliser les APIs eBay ?

En bref

Les API eBay permettent une gestion automatisée de l'inventaire, des annonces, des commandes et des paiements sur la marketplace mondiale. Authentifiez-vous via OAuth 2.0, interagissez avec les endpoints api.ebay.com/sell et surveillez les limites de débit. Pour des tests rapides, utilisez Apidog pour valider les payloads d’annonces, tester le traitement des commandes et vérifier la gestion des limites d’API.

Essayez Apidog dès aujourd'hui

Introduction

eBay connecte acheteurs et vendeurs dans le monde entier. L’API offre tout ce qu’il faut pour automatiser la gestion des stocks, créer massivement des annonces, traiter les commandes, gérer expéditions et retours. L’API est scalable pour tous les vendeurs.

Principaux domaines de l’API :

  • API d'inventaire : gestion des produits
  • API d'annonces : création/gestion d’annonces
  • API de commande : traitement commandes/expéditions
  • API d'exécution (Fulfillment) : expédition et suivi
  • API d’analyse : extraction de rapports

💡 Si vous développez des intégrations eBay, Apidog facilite le test des annonces, la validation des réponses de commandes et la gestion des quotas ou erreurs API.

Testez les API eBay avec Apidog — gratuit.

À la fin de ce guide, vous saurez :

  • Authentifier via OAuth 2.0
  • Créer/gérer l’inventaire
  • Publier des annonces
  • Traiter commandes et expéditions
  • Gérer retours/remboursements
  • Tester votre intégration avec Apidog

Authentification avec OAuth 2.0

eBay utilise OAuth 2.0 pour sécuriser ses API. Commencez par créer une application via le programme eBay Developers.

eBay OAuth

Créer une application

  1. Rendez-vous sur developers.ebay.com
  2. Inscrivez-vous comme développeur
  3. Créez une application dans la console
  4. Récupérez client ID et client secret

Flux OAuth

Étape 1 : Autorisation utilisateur

https://auth.ebay.com/oauth2/authorize?
  client_id=YOUR_APP_ID&
  response_type=code&
  redirect_uri=YOUR_SIGNIN_REDIRECT_URI&
  scope=https://api.ebay.com/oauth/api_scope/sell.inventory
Enter fullscreen mode Exit fullscreen mode

Étape 2 : Obtenir le code d’autorisation

L’utilisateur autorise et vous recevez un code dans votre URI de redirection.

Étape 3 : Échanger le code contre un access_token

const response = await fetch('https://api.ebay.com/identity/v1/oauth2/token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'Basic ' + Buffer.from(APP_ID + ':' + CERT_ID).toString('base64')
  },
  body: new URLSearchParams({
    grant_type: 'authorization_code',
    code: AUTHORIZATION_CODE,
    redirect_uri: 'YOUR_SIGNIN_REDIRECT_URI'
  })
})

const { access_token, refresh_token, expires_in } = await response.json()
Enter fullscreen mode Exit fullscreen mode

Portées requises

  • https://api.ebay.com/oauth/api_scope/sell.inventory — Gestion des stocks
  • https://api.ebay.com/oauth/api_scope/sell.listings — Annonces
  • https://api.ebay.com/oauth/api_scope/sell.orders — Commandes
  • https://api.ebay.com/oauth/api_scope/sell.fulfillment — Fulfillment
  • https://api.ebay.com/oauth/api_scope/sell.account — Compte

Gestion des stocks

L’inventaire correspond à vos produits en vente.

Créer un lieu d’inventaire

curl -X POST "https://api.ebay.com/sell/inventory/v1/location_inventory_location" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "locationId": "WAREHOUSE_1",
    "name": "Main Warehouse",
    "address": {
      "addressLine1": "123 Main St",
      "city": "San Jose",
      "stateOrProvince": "CA",
      "postalCode": "95101",
      "countryCode": "US"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Créer un article d’inventaire

curl -X POST "https://api.ebay.com/sell/inventory/v1/inventory_item" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "product": {
      "title": "Vintage Leather Messenger Bag",
      "description": "Genuine leather messenger bag, perfect for work or school.",
      "aspects": {
        "Brand": ["Vintage"],
        "Material": ["Leather"],
        "Color": ["Brown"]
      },
      "imageUrls": [
        "https://example.com/images/bag1.jpg",
        "https://example.com/images/bag2.jpg"
      ]
    },
    "condition": "USED_GOOD",
    "conditionNotes": "Minor wear on corners",
    "availability": {
      "shipToLocationAvailability": {
        "quantity": 25
      }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Mettre à jour l’inventaire

curl -X PUT "https://api.ebay.com/sell/inventory/v1/inventory_item/SKU123" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "availability": {
      "shipToLocationAvailability": {
        "quantity": 30
      }
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Obtenir un article d’inventaire

curl -X GET "https://api.ebay.com/sell/inventory/v1/inventory_item/SKU123" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Mettre des articles en vente

Créer une offre

curl -X POST "https://api.ebay.com/sell/inventory/v1/offer" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": "SKU123",
    "marketplaceId": "EBAY_US",
    "format": "FIXED_PRICE",
    "product": {
      "title": "Vintage Leather Messenger Bag"
    },
    "pricingSummary": {
      "price": {
        "currency": "USD",
        "value": "89.99"
      }
    },
    "listing": {
      "listingDuration": "GTC",
      "listingType": "CLASSIC"
    },
    " fulfillment": {
      "shippingProfileId": "SHIPPING_PROFILE_ID",
      " fulfillmentPolicyId": "FULFILLMENT_POLICY_ID",
      "paymentPolicyId": "PAYMENT_POLICY_ID"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Champs clés :

  • sku : UGS d’inventaire
  • marketplaceId : ex. EBAY_US, EBAY_UK, EBAY_DE
  • format : FIXED_PRICE ou AUCTION
  • listingDuration : GTC (Good ‘Til Cancelled), etc.
  • price : prix demandé

Publier l’offre

curl -X POST "https://api.ebay.com/sell/inventory/v1/offer/OFFER_ID/publish" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Retirer une annonce

curl -X POST "https://api.ebay.com/sell/inventory/v1/offer/OFFER_ID/withdraw" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Gestion des commandes

Obtenir les commandes

curl -X GET "https://api.ebay.com/sell/fulfillment/v1/order?orderIds=ORDER_ID_1,ORDER_ID_2" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Filtrer par date :

curl -X GET "https://api.ebay.com/sell/fulfillment/v1/order?filter=creation_date_range:from:2026-01-01T00:00:00Z,to:2026-03-24T00:00:00Z" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Obtenir les détails de la commande

curl -X GET "https://api.ebay.com/sell/fulfillment/v1/order/ORDER_ID" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Exemple de réponse :

{
  "orderId": "12-34567-89012",
  "orderPaymentStatus": "PAID",
  "pricingSummary": {
    "total": {
      "currency": "USD",
      "value": "94.99"
    }
  },
  "fulfillmentStartInstructions": [
    {
      "shippingStep": {
        "shipTo": {
          "fullName": "John Doe",
          "contactAddress": {
            "addressLine1": "123 Main St",
            "city": "Anytown",
            "stateOrProvince": "CA",
            "postalCode": "12345",
            "countryCode": "US"
          }
        }
      }
    }
  ],
  "lineItems": [
    {
      "lineItemId": "LINE_ITEM_ID",
      "sku": "SKU123",
      "quantity": 1,
      "title": "Vintage Leather Messenger Bag",
      "lineItemCost": {
        "currency": "USD",
        "value": "89.99"
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Expédition et exécution (Fulfillment)

Créer une étiquette d'expédition

curl -X POST "https://api.ebay.com/sell/fulfillment/v1/order/ORDER_ID/shipping_fulfillment" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "lineItems": [
      {
        "lineItemId": "LINE_ITEM_ID",
        "quantity": 1
      }
    ],
    "shippingStep": {
      "shipFrom": {
        "fullName": "Your Name",
        "companyName": "Your Company",
        "contactAddress": {
          "addressLine1": "456 Warehouse Rd",
          "city": "San Jose",
          "stateOrProvince": "CA",
          "postalCode": "95101",
          "countryCode": "US"
        }
      }
    },
    "shippingCarrierCode": "USPS",
    "shippingMethodCode": "PRIORITY_MAIL",
    "trackingNumber": "9400111899223056789012"
  }'
Enter fullscreen mode Exit fullscreen mode

Transporteurs supportés :

  • USPS
  • UPS
  • FedEx
  • DHL

Gestion des retours

Obtenir les détails du retour

curl -X GET "https://api.ebay.com/sell/fulfillment/v1/return/RETURN_ID" \
  -H "Authorization: Bearer ACCESS_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Traiter un retour

curl -X POST "https://api.ebay.com/sell/fulfillment/v1/return/RETURN_ID/decide" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "decision": "ACCEPT",
    "shipment": {
      "carrierId": "CARRIER_ID",
      "trackingNumber": "TRACKING_NUMBER"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Limites de débit et gestion

eBay impose des limites d’appels API. Vérifiez toujours les en-têtes suivants :

  • X-RateLimit-Limit : nombre maximal de requêtes autorisées
  • X-RateLimit-Remaining : nombre de requêtes restantes
  • X-RateLimit-Reset : timestamp Unix pour la réinitialisation

Implémentez un backoff automatique :

async function makeEbayRequest(url, options, retries = 3) {
  for (let i = 0; i < retries; i++) {
    const response = await fetch(url, options)

    const remaining = response.headers.get('X-RateLimit-Remaining')
    if (remaining && parseInt(remaining) < 10) {
      console.warn('Rate limit low:', remaining)
    }

    if (response.status === 429) {
      const resetTime = response.headers.get('X-RateLimit-Reset')
      const waitTime = (parseInt(resetTime) - Date.now() / 1000) * 1000
      await sleep(waitTime)
      continue
    }

    return response
  }
  throw new Error('Rate limited')
}
Enter fullscreen mode Exit fullscreen mode

Tester avec Apidog

Les API eBay sont critiques en production. Testez systématiquement avant chaque mise en production.

Test avec Apidog

1. Configuration de l’environnement

EBAY_APP_ID: your_app_id
EBAY_CERT_ID: your_cert_id
EBAY_ACCESS_TOKEN: stored_token
EBAY_REFRESH_TOKEN: stored_refresh
EBAY_MARKETPLACE_ID: EBAY_US
BASE_URL: https://api.ebay.com
Enter fullscreen mode Exit fullscreen mode

2. Valider les payloads d’annonces

pm.test('Listing has required fields', () => {
  const requestBody = JSON.parse(pm.request.body.raw)
  pm.expect(requestBody).to.have.property('sku')
  pm.expect(requestBody).to.have.property('marketplaceId')
  pm.expect(requestBody.pricingSummary).to.have.property('price')
})

pm.test('Price is valid', () => {
  const requestBody = JSON.parse(pm.request.body.raw)
  const price = parseFloat(requestBody.pricingSummary.price.value)
  pm.expect(price).to.be.above(0)
})
Enter fullscreen mode Exit fullscreen mode

3. Tester le traitement des commandes

pm.test('Order response is valid', () => {
  const response = pm.response.json()
  pm.expect(response).to.have.property('orderId')
  pm.expect(response.orderPaymentStatus).to.eql('PAID')
  pm.expect(response.lineItems).to.be.an('array')
})
Enter fullscreen mode Exit fullscreen mode

Testez les API eBay avec Apidog — gratuit.


Erreurs courantes et correctifs

401 Non autorisé

Cause : Jeton expiré ou invalide.

Correction : Rafraîchissez le jeton via le refresh_token :

const response = await fetch('https://api.ebay.com/identity/v1/oauth2/token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'Basic ' + Buffer.from(APP_ID + ':' + CERT_ID).toString('base64')
  },
  body: new URLSearchParams({
    grant_type: 'refresh_token',
    refresh_token: storedRefreshToken
  })
})
Enter fullscreen mode Exit fullscreen mode

10002 : Jeton d'accès invalide

Cause : Jeton expiré.

Correction : Rafraîchissez immédiatement le token.

21916684 : L’article n’existe pas

Cause : UGS non présente dans l’inventaire.

Correction : Créez l’article avant de créer l’offre.

10003 : UGS invalide

Cause : Format incorrect.

Correction : UGS unique, caractères alphanumériques, tirets, underscores uniquement.

Limite de débit (429)

Cause : Trop de requêtes.

Correction : Implémentez un backoff exponentiel.


Alternatives et comparaisons

Fonctionnalité eBay Amazon SP-API Etsy
API d'inventaire Limité
API d'annonces
API de commande
API d'exécution (Fulfillment) Limité
Niveau gratuit Programme développeur Limité Limité
Complexité API Moyenne Élevée Faible

L’API eBay est plus accessible que celle d’Amazon mais reste moins complète. Etsy est la plus simple, mais limitée pour les gros vendeurs.


Cas d’utilisation réels

Vente multicanal : Synchronisez automatiquement l’inventaire sur eBay, Amazon et votre site. Toute vente sur un canal décrémente la quantité partout.

Repricing automatisé : Surveillez les prix concurrents, ajustez vos prix via l’API pour rester compétitif.

Annonces en masse : Automatisez la publication de milliers d’annonces via CSV et l’API.


Conclusion

Ce que vous savez faire maintenant :

  • Authentification OAuth 2.0 avec vos identifiants
  • Gestion d’inventaire avec UGS
  • Création/publication d’annonces
  • Traitement commandes/expéditions
  • Gestion des retours
  • Tests robustes avec Apidog avant production

Prochaines étapes :

  1. Inscrivez-vous au programme eBay Developers
  2. Créez une application et récupérez vos identifiants
  3. Implémentez OAuth
  4. Créez votre premier article d’inventaire
  5. Publiez une annonce de test

Testez les API eBay avec Apidog — gratuit.


FAQ

Ai-je besoin d’un compte professionnel pour utiliser les API ?

Oui. Les API eBay nécessitent un compte vendeur vérifié.

Quelle est la différence entre inventaire et offres ?

L’inventaire stocke les infos produit (titre, description, images). Les offres relient l’inventaire à la marketplace, avec prix et exécution. Plusieurs offres peuvent référencer le même inventaire.

Combien de temps les annonces restent-elles actives ?

Les annonces GTC (“Good ‘Til Cancelled”) restent jusqu’à retrait manuel ou rupture de stock.

Puis-je vendre à l’international via l’API ?

Oui. Utilisez différents marketplaceId (EBAY_US, EBAY_UK…) et respectez les règles de chaque pays.

Quelle est la limite de débit de l’API ?

Variable selon endpoint et niveau de compte. Vérifiez les headers de réponse pour vos limites.

Comment obtenir des étiquettes d’expédition ?

eBay génère des étiquettes à prix réduit via l’API Fulfillment après création de l’expédition.

Top comments (0)