eBextractor Extension Config

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

live 2026-10-01-1110 · rev 1 16 selector keys 1 release

What the extension reads

FilePurpose
version.jsonWhich release is live (rev, id) · no-cache
live/selectors.jsonThe live selectors · no-cache
r/<id>/selectors.jsonEvery release exactly as published, to check and compare · cached 1 year

Releases

ReleaseRevNote
2026-10-01-1110 live 1 First release: search page, item page, purchase history selectors json

Structure

ebextractor-extension-config/        (source repo)
├─ selectors.json        working copy — edit this
├─ releases/             every release (<id>.json + index.json), committed
├─ SELECTORS.md          what every key targets (this page is built from it)
└─ scripts/              build · release/rollback/diff · devtools · page
dist/                    what's served here (built by Cloudflare on push)
├─ index.html · _headers · version.json
├─ live/selectors.json
└─ r/<id>/selectors.json + index.html

How the extension uses it

Fix a breakage

  1. Find the broken key: pnpm devtools, paste devtools-check.js into the DevTools console on the broken page.
  2. Edit selectors.json — new selector first, keep the old ones.
  3. pnpm release "what changed" (numbers the release, records it, builds), then commit and push. Users pick it up within ~5 minutes of browsing eBay.
  4. Bad release? pnpm rollback <id> re-publishes an earlier release as a new one.

What each key in selectors.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.json (first in the list for priority keys; anywhere for any keys), keep the old ones, then pnpm release "what changed", commit and push.

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>
purchaseHistory, historyColumnsSold / offer history (needs sign-in)https://www.ebay.com/bin/purchaseHistory?item=<item id>
amazonAmazon search / product pagehttps://www.amazon.com/s?k=shoes, https://www.amazon.com/dp/<ASIN>
listingeBay create-listing formhttps://www.ebay.com/lstng?… (Sell → List an item)

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

Live selectors · 2026-10-01-1110ul.srp-results.srp-list.clearfixul.srp-results.srp-grid.clearfixul.su-grid.su-grid--is-listul.su-grid

search.card

Live selectors · 2026-10-01-1110li.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

Live selectors · 2026-10-01-1110li.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
Live selectors · 2026-10-01-1110a.s-item__linka.su-linka.s-card__linka.su-link.su-item-card__title

search.price

Live selectors · 2026-10-01-1110span.s-item__pricespan.s-card__pricespan.su-item-card__price

search.imageContainer

Live selectors · 2026-10-01-1110div.s-item__imagediv.su-media__imagediv.su-image

search.title

Live selectors · 2026-10-01-1110div.s-card__titlediv>a.su-item-card__titlediv>a

search.category

Live selectors · 2026-10-01-1110li.srp-refine__category__item

search.pageCards

Live selectors · 2026-10-01-1110ul.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

Live selectors · 2026-10-01-1110div.s-item__info.clearfixdiv.su-card-container__content

search.cardTitle

Live selectors · 2026-10-01-1110.s-card__title>span.primary.default.s-item__title.s-card__title.su-item-card__header>a

search.cardImage

Live selectors · 2026-10-01-1110.s-card__imagediv.su-image img

itemPage — listing page

itemPage.quantityAvailability

Live selectors · 2026-10-01-1110#qtyAvailabilitydiv.x-quantity__availability

itemPage.titleMount

Live selectors · 2026-10-01-1110

itemPage.title

Live selectors · 2026-10-01-1110

itemPage.itemId

Live selectors · 2026-10-01-1110

itemPage.imagePanel

Live selectors · 2026-10-01-1110

itemPage.imageItems

Live selectors · 2026-10-01-1110

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

Live selectors · 2026-10-01-1110div.app-table.fixed-price table.app-table__table

purchaseHistory.offerTable

Live selectors · 2026-10-01-1110div.app-table.offer table.app-table__table

purchaseHistory.itemDetails

Live selectors · 2026-10-01-1110dl.app-item-card__details

historyColumns — purchase history table headings

Not CSS. Each key lists the heading text of one column in every language; a column matches if its <th> text equals any entry, ignoring case. Add the new wording when eBay renames a column (keep the old one). If these break, sold history may still list rows but dates, prices, quantities read as empty: period filters show 0, revenue "—", units counted as 1 each.

Check: open /bin/purchaseHistory?item=<id>, run the DevTools checker — it prints each table's headings and which ones matched no column.

historyColumns.date_of_purchase

Live selectors · 2026-10-01-1110

historyColumns.date_of_offer

Live selectors · 2026-10-01-1110

historyColumns.buy_it_now_price

Live selectors · 2026-10-01-1110

historyColumns.offer_price

Live selectors · 2026-10-01-1110

historyColumns.offer_status

Live selectors · 2026-10-01-1110

historyColumns.quantity

Live selectors · 2026-10-01-1110

historyColumns.variation

Live selectors · 2026-10-01-1110

historyColumns.user_id

Live selectors · 2026-10-01-1110

amazon — Amazon search and product pages

The "Compare prices / Search on eBextractor" buttons. The content script only runs on /s…, /dp/… and /gp/product/… (allowlist in the extension's manifest) — these keys only decide where on those pages the buttons go.

amazon.searchResult

Live selectors · 2026-10-01-1110

amazon.cardSlot

Live selectors · 2026-10-01-1110

amazon.cardImage

Live selectors · 2026-10-01-1110

amazon.cardTitle

Live selectors · 2026-10-01-1110

amazon.productMount

Live selectors · 2026-10-01-1110

amazon.productTitle

Live selectors · 2026-10-01-1110

amazon.productImage

Live selectors · 2026-10-01-1110

listing — eBay create-listing form

listing.titleInput

Live selectors · 2026-10-01-1110

page — any eBay page

page.header

Live selectors · 2026-10-01-1110