eBextractor Extension Config

Remote eBay selectors for the eBextractor Chrome extension. Static files on Cloudflare Pages — no Workers, no code, data only.

schema v1 · rev 1 16 selector keys built 2026-10-01 11:10 UTC

Published files

FilePurpose
v1/version.json Checked by the extension for a newer rev · no-cache
v1/selectors-r1.json The selectors (schema 1, rev 1) · cached 1 year, immutable

Structure

ebextractor-extension-config/         (source repo)
├─ selectors/v1.json      source of truth for schema 1 — edit this
├─ SELECTORS.md           what every key targets (this page is built from it)
├─ scripts/build.mjs      validate → dist/   (fails if a key is undocumented)
├─ scripts/devtools.mjs   paste-in DevTools checker
└─ dist/                  what's served here
   ├─ index.html          this page
   ├─ _headers            cache rules
   └─ v1/
      ├─ version.json            {schema, rev, file}
      └─ selectors-r<rev>.json   the config

How the extension uses it

Fix a breakage

  1. Find the broken key: run pnpm devtools and paste devtools-check.js into the DevTools console on the broken eBay page.
  2. Edit selectors/v1.json — new selector first, keep the old ones.
  3. Bump "rev" by 1, then pnpm release. Users pick it up within ~5 minutes of browsing eBay.

What each key in selectors/v1.json targets, where to find that HTML, and what breaks when it stops matching. Not published — the build only uploads the JSON, but it fails if a key in the JSON isn't documented here.

When something breaks

  1. Open the page type below in Chrome (signed in to eBay).
  2. Run pnpm devtools, paste the printed file's contents into the DevTools console. It lists every key for that page with how many elements each selector matches; ✖ = nothing matched.
  3. For a ✖ key: right-click the element on the page → Inspect, find a stable class/attribute, test it with document.querySelectorAll('…').length.
  4. Add the new selector to selectors/v1.json (first in the list for priority keys; anywhere for any keys), keep the old ones, bump rev, pnpm release.

Match modes (fixed in the extension code):

Pages

SectionPageExample URL
searchSearch resultshttps://www.ebay.com/sch/i.html?_nkw=shoes (also sold: &LH_Sold=1&LH_Complete=1)
itemPageListing pagehttps://www.ebay.com/itm/<item id>
purchaseHistorySold / offer history (needs sign-in)https://www.ebay.com/bin/purchaseHistory?item=<item id>

Check list and grid view (&_dmd=2) and at least one non-US site (ebay.de, ebay.pl) — eBay rolls markup out per site. Per-site lists go under "sites": { "www.ebay.de": { "search": { … } } }.


search — search results page

The search page has two consumers: the parser (reads a copy of the page HTML to build the price analysis sidebar) and the live page features (hide items, per-card buttons) that work on the real DOM.

search.resultsContainer

Current selectors · rev 1ul.srp-results.srp-list.clearfixul.srp-results.srp-grid.clearfixul.su-grid.su-grid--is-listul.su-grid

search.card

Current selectors · rev 1li.s-item.s-item__dsa-on-bottomli.s-item.s-item__pl-on-bottomli.s-item.s-item__before-answer.s-item__pl-on-bottomli.s-card.s-card--horizontalli.s-card.s-card--verticalli.su-grid__item

search.skipCard

Current selectors · rev 1li.srp-river-answer.srp-river-answer--SPECTRUM_OF_VALUE_CAROUSELli>div.srp-river-answer--START_LISTING_BANNERli>div.srp-river-answer--LIVE_EVENTS_CAROUSELli>div.srp-river-answer--NAVIGATION_ANSWER_COLLAPSIBLE_CAROUSELli>div.srp-river-answer--RIGHT_ALIGNED_MESSAGEli>div.srp-river-answer--BASIC_PAGINATION_V2li>div.srp-river-answer--REWRITE_STARTli>script
Current selectors · rev 1a.s-item__linka.su-linka.s-card__linka.su-link.su-item-card__title

search.price

Current selectors · rev 1span.s-item__pricespan.s-card__pricespan.su-item-card__price

search.imageContainer

Current selectors · rev 1div.s-item__imagediv.su-media__imagediv.su-image

search.title

Current selectors · rev 1div.s-card__titlediv>a.su-item-card__titlediv>a

search.category

Current selectors · rev 1li.srp-refine__category__item

search.pageCards

Current selectors · rev 1ul.srp-results>li.s-item__pl-on-bottom:not(.srp-river-answer--ITEMS_CAROUSEL_WITH_COLOR)ul.srp-results>li.s-card.s-card--horizontal:not(.srp-river-answer--ITEMS_CAROUSEL_WITH_COLOR)ul.srp-results>li.s-card.s-card--vertical:not(.srp-river-answer--ITEMS_CAROUSEL_WITH_COLOR)ul.su-grid>li.su-grid__item:not(.srp-river-answer--ITEMS_CAROUSEL_WITH_COLOR)

search.cardActionsMount

Current selectors · rev 1div.s-item__info.clearfixdiv.su-card-container__content

search.cardTitle

Current selectors · rev 1.s-card__title>span.primary.default.s-item__title.s-card__title.su-item-card__header>a

search.cardImage

Current selectors · rev 1.s-card__imagediv.su-image img

itemPage — listing page

itemPage.quantityAvailability

Current selectors · rev 1#qtyAvailabilitydiv.x-quantity__availability

purchaseHistory — /bin/purchaseHistory?item=<id>

The extension fetches this page with the user's own eBay session. Signed out → eBay redirects to sign-in and the extension asks the user to sign in.

purchaseHistory.soldTable

Current selectors · rev 1div.app-table.fixed-price table.app-table__table

purchaseHistory.offerTable

Current selectors · rev 1div.app-table.offer table.app-table__table

purchaseHistory.itemDetails

Current selectors · rev 1dl.app-item-card__details