Skip to content

Retries & rate limits

Automatic retries

429 Too Many Requests and transient 5xx (500/502/503/504) responses are retried with exponential backoff + full jitter, honoring Retry-After when eBay sends one. Retries are method-aware: idempotent methods (GET/HEAD/OPTIONS/PUT/DELETE) are replayed on both 429 and 5xx; non-idempotent POST only on 429 (the request was rejected before processing). Connection errors retry for idempotent methods.

EbayConfig(
    max_retries=2,                       # 0 disables retries
    retry_statuses=(429, 500, 502, 503, 504),
    retry_backoff=0.5,                   # base seconds; delay = backoff * 2**attempt
    retry_max_backoff=60.0,
    respect_retry_after=True,
)

Scoped override without touching the base client:

client.with_options(max_retries=0, timeout=5.0).sell.fulfillment.get_orders(limit=5)

Retries are visible at WARNING on the bidkit.retry logger — see Logging.

Checking your remaining quota

eBay does not send quota headers on responses. Remaining call quota lives behind two Developer Analytics lookups that need different token types:

# Application quota — requires an application token (client credentials, base scope)
app = client.with_options(refresh_token=None, scopes=("https://api.ebay.com/oauth/api_scope",))
for rl in app.developer.analytics.get_rate_limits().rate_limits or []:
    ...

# Per-user quota — requires the user token
for rl in client.developer.analytics.get_user_rate_limits().rate_limits or []:
    ...

Filter quirks

The api_context/api_name server-side filters are case-sensitive and unreliable, and eBay's payload mixes casings ("Sell", "commerce", "TradingAPI"). Fetch unfiltered and filter client-side.