{"record":{"id":"ab590d6cdb05dc72","repo":"jackwener/OpenCLI","slug":"amazon-offer-surface-did-not-expose-seller-or-fulf","errorCode":null,"errorMessage":"amazon offer surface did not expose seller or fulfillment facts","messagePattern":"amazon offer surface did not expose seller or fulfillment facts","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/amazon/offer.js","lineNumber":131,"sourceCode":"    navigateBefore: false,\n    args: [\n        {\n            name: 'input',\n            required: true,\n            positional: true,\n            help: 'ASIN or product URL, for example B0FJS72893',\n        },\n    ],\n    columns: ['asin', 'price_text', 'sold_by', 'ships_from', 'is_amazon_sold', 'is_amazon_fulfilled'],\n    func: async (page, kwargs) => {\n        const input = String(kwargs.input ?? '');\n        const payload = await readOfferPayload(page, input);\n        const normalized = normalizeOfferPayload(payload);\n        if (!normalized.sold_by && !normalized.ships_from && !normalized.merchant_info_text) {\n            if (isDeliveryLocationBlocked(payload.buybox_text)) {\n                throw new CommandExecutionError('amazon offer buy box is blocked by the current delivery location', 'The shared Chrome profile is not set to the target US delivery address. Switch Amazon delivery location to the requested US destination, reopen the product page, and retry.');\n            }\n            throw new CommandExecutionError('amazon offer surface did not expose seller or fulfillment facts', 'The product page may have changed. Open the product page in Chrome, make sure the buy box is visible, and retry.');\n        }\n        return [normalized];\n    },\n});\nexport const __test__ = {\n    extractShipsFrom,\n    extractSoldBy,\n    isDeliveryLocationBlocked,\n    normalizeOfferPayload,\n};\n","sourceCodeStart":113,"sourceCodeEnd":142,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/amazon/offer.js#L113-L142","documentation":"CommandExecutionError thrown by the amazon offer command when the product page exposes none of sold_by, ships_from, or merchant_info_text and the failure is not explained by a delivery-location block. The library treats this as 'the offer surface is not readable' — usually a page layout change, a robot check, or a product with no active buy box.","triggerScenarios":"Running amazon offer where readOfferPayload returns a payload whose normalized fields sold_by, ships_from, and merchant_info_text are all empty and isDeliveryLocationBlocked(buybox_text) is false — reaching the fallback throw at offer.js:131.","commonSituations":"Amazon A/B test renaming buy box selectors (e.g. #sellerProfileTriggerId, #shipsFromSoldBy); robot/captcha interstitial; out-of-stock or unbuyable product with no offer box; landed on a page variant without the offer surface.","solutions":["Open the product page in Chrome, confirm the buy box with 'Sold by / Ships from' is visible, and retry","Complete any captcha/robot check shown, then rerun","Check whether the ASIN actually has an active offer (out-of-stock items show no seller info)","If persistent, update the offer extraction selectors in readOfferPayload for the new Amazon markup"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  return await opencli.call('amazon offer', { input: asin });\n} catch (e) {\n  if (/did not expose seller or fulfillment facts/.test(e.message)) {\n    // page may be a robot check or layout change; retry after manual verification\n    await sleep(5000);\n    return opencli.call('amazon offer', { input: asin });\n  }\n  throw e;\n}","preventionTips":["Confirm the ASIN has an active buy box / is in stock","Clear captcha interstitials in Chrome before retrying","Update offer extraction selectors if Amazon changes the buy box markup"],"tags":["amazon","buybox","scraping","dom-scraping"],"backgroundTag":"scrape-target-not-found","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}