Facebook Marketplace Search

Site facebook.comTask search-marketplaceVersion v2Updated Aug 18, 2026Category marketplace

Search Facebook Marketplace with URL-based filters and pagination, or resolve a supplied Marketplace item URL into structured listing details, including property-price evidence useful for explaining unusually low prices. This skill was captured from a live agent session on facebook.com and publishes here verbatim, exactly as an agent receives it.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Purpose

Read-only extraction of Facebook Marketplace listings. Resolve a supplied /marketplace/item/{item-id}/ URL directly, or search by canonical city slug and query using URL parameters. Return normalized listing data including price, original price, description, condition, seller-provided attributes, location, timestamps, photos, and delivery information. For unusually cheap houses or other properties, distinguish visible facts from supported explanations such as deposit pricing, monthly/per-room pricing, auction or assignment language, major repairs, occupancy restrictions, land-only or manufactured-home status, or other listing-specific evidence. Never message sellers, make offers, save, share, report, authenticate, or follow outbound links.

When to Use

  • The caller supplies a direct Marketplace item URL or opaque item ID.
  • The caller wants Marketplace inventory by query, city, category, price, condition, radius, delivery method, date, or sort order.
  • The caller needs multiple pages of results stitched together.
  • The caller wants to investigate why a property or other listing appears unusually cheap.
  • Use a residential proxy when Facebook serves an empty logged-out shell, regional-unavailability page, or anti-bot response.

Workflow

  1. Branch on the input. For a supplied item URL or ID, navigate immediately to https://www.facebook.com/marketplace/item/{item-id}/; never invent an opaque ID. For a full Marketplace search URL, use it as-is. For free-form search, resolve a canonical city slug first, then construct the search URL.

  2. Construct searches directly as: https://www.facebook.com/marketplace/{city-slug}/search/?query={urlencoded-query} Optional parameters are minPrice, maxPrice, daysSinceListed=1|7|30, itemCondition=new,used_like_new,used_good,used_fair, availability=in stock|out of stock|all, deliveryMethod=local_pick_up|shipping, radius=1|2|5|10|20|40|60|80|100|250|500, sortBy=creation_time_descend|distance_ascend|price_ascend|price_descend, exact=true|false, and category=vehicles|propertyrentals|apparel|electronics|family|free|garden|hobbies|home|homeimprovement|musicalinstruments|officesupplies|petsupplies|sportinggoods|toys|bookmoviesmusic. Vehicle modifiers include make, model, carType, transmissionType, minYear, maxYear, minMileage, maxMileage, vehicleExteriorColors, vehicleInteriorColors, and titleStatus. Rental/property modifiers include minBedrooms, maxBedrooms, minBathrooms, maxBathrooms, minAreaSize, maxAreaSize, propertyType, and privateRoomBathroomType.

  3. Use canonical city slugs only. Known slugs include nyc, la, sanfrancisco, chicago, austin, boston, seattle, atlanta, miami, and portland. For an unknown city or ZIP, use the Marketplace location picker once, then read the pathname segment after /marketplace/. If the requested path redirects to /marketplace/category/search/, stop with location_resolution_failed; do not accept IP-geolocated results.

  4. In one browser-agent call, pass {"proxy":{"proxy":"residential","proxyCountry":"us"}}, navigate directly, wait 2–3 seconds, and evaluate the loaded page. For a direct item page, use this self-contained extractor:

(() => {
 const clean=v=>(v||'').replace(/\\s+/g,' ').trim();
 const scripts=[...document.scripts].map(s=>s.textContent||'');
 const walk=(x,path='')=>{if(!x||typeof x!=='object')return null;if(x.marketplace_listing_renderable)return{value:x.marketplace_listing_renderable,path:path+'.marketplace_listing_renderable'};if(x.__typename==='MarketplaceListingRenderable'||x.marketplace_listing_title||x.description)return{value:x,path};for(const[k,v]of Object.entries(x)){const r=walk(v,path+'.'+k);if(r)return r}return null};
 let found=null;for(const raw of scripts){try{const x=JSON.parse(raw);found=walk(x);if(found)break}catch{}}
 const v=found?.value||{},text=clean(document.body?.innerText||''),price=v.listing_price||v.price||{},loc=v.location||{},rg=loc.reverse_geocode||{},seller=v.marketplace_listing_seller||v.seller||{},attrs=v.custom_attributes||v.attributes||{};
 const photos=(v.listing_photos||v.photos||[]).map(p=>p?.image?.uri||p?.uri||p?.url).filter(Boolean);
 const evidenceRe=/(foreclosure|auction|cash only|as[- ]is|lot rent|land lease|mobile|manufactured|fixer|repair|needs? (?:work|repairs)|down payment|rent to own|lease|hoa|lien|tenant|occupied|assignment|deposit|per month|\/mo|per room|shared|no financing|rehab)/ig;
 const evidence=[...new Set((text.match(evidenceRe)||[]).map(clean))];
 const reasons=[];if(/deposit|down payment|per month|\\/mo|per room/i.test(text))reasons.push('price may be a deposit, monthly, or per-room amount');if(/auction|foreclosure|assignment|cash only|no financing/i.test(text))reasons.push('auction, foreclosure, assignment, or financing restriction is stated');if(/as[- ]is|fixer|repair|needs? (?:work|repairs)|rehab/i.test(text))reasons.push('property condition or repair work may explain the price');if(/lot rent|land lease|mobile|manufactured/i.test(text))reasons.push('land-lease or manufactured-home status may affect the price');if(/tenant|occupied|hoa|lien|shared/i.test(text))reasons.push('occupancy, HOA, lien, or shared-property restriction is stated');
 return {single_item:true,url:location.href,canonical_url:document.querySelector('link[rel="canonical"]')?.href||null,final_url:location.href,listing:{listing_id:String(v.id||location.pathname.match(/item\\/(\\d+)/)?.[1]||'')||null,title:v.marketplace_listing_title||v.title||null,price:{formatted:price.formatted_amount||price.formatted||null,amount:price.amount??null,minor_units:price.amount_with_offset_in_currency??null,strikethrough_amount:v.strikethrough_price||null},description:v.description||v.redacted_description||null,condition:v.condition_description||v.condition||null,location:{text:v.location_text||null,city:rg.city||null,state:rg.state||null,latitude:loc.latitude??null,longitude:loc.longitude??null},posted_at:v.creation_time??null,seller:{name:seller.name||null,facebook_id:seller.id||null,profile_url:seller.id?'https://www.facebook.com/'+seller.id+'/':null},photos,primary_photo_url:photos[0]||v.primary_listing_photo?.image?.uri||null,delivery_methods:v.delivery_types||[],vehicle:null,apparel:null,rental:null,custom_attributes:attrs,is_sold:!!v.is_sold,is_pending:!!v.is_pending},price_assessment:{observed_facts:{asking_price:price.formatted_amount||price.formatted||null,original_price:v.strikethrough_price||null,evidence_terms:evidence},supported_reasons:reasons,warning_signals:[],insufficient_information:reasons.length===0?'No visible listing evidence explains the low price; do not infer a cause.':null},visible_text_excerpt:text.slice(0,7000),login_required:/log in to facebook|log in or sign up|create an account|inicia sesión/i.test(text+' '+document.title),blocked:/security check|challenge|required to continue|marketplace isn't available/i.test(text+' '+document.title),partial:!found,partial_reason:found?null:'ssr_listing_payload_not_found'};
})()
  1. For search pages, extract marketplace_search.feed_units.edges from the SSR script payload. Map each node.listing to its ID, title, formatted and numeric price, strikethrough price, city/state, thumbnail, numeric category ID, delivery types, live/sold/pending flags, and canonical https://www.facebook.com/marketplace/item/{id}/ URL. Also read page_info.end_cursor and the server-resolved location/filter parameters.

  2. For larger collections, batch downward scrolls, 1.5–2 second waits, and extraction in the same browser session. Merge by listing ID. Detect login_form, Log in or sign up, or a login interstitial after each batch; return collected records with partial:true and a page-specific reason rather than attempting authentication or bypassing the wall. Never replay a cursor in a different session or issue cookieless GraphQL requests.

  3. For price-analysis requests, report only observations supported by visible description, attributes, price formatting, or seller text. Include observed_facts, supported_reasons, warning_signals, and insufficient_information. A low displayed value alone is not evidence of a foreclosure, scam, deposit, or monthly price. Treat seller requests to move off-platform, mismatched location, missing property details, and implausibly low prices as warning signals, not proof of fraud.

  4. Return the original requested URL, final URL, and canonical URL. If Facebook redirects to /login/?next=..., report the partial login-wall state without authenticating or following the redirect to bypass it.

Site-Specific Gotchas

  • A residential proxy is required on every browser call; changing or omitting it can produce a sparse shell or empty SSR payload.
  • Direct item URLs contain opaque numeric IDs and are safe only when supplied by the caller or extracted from a visible Marketplace result.
  • Marketplace paths accept canonical city slugs only. ZIPs, numeric location IDs, and variants such as sf, new-york, newyork, losangeles, and san-francisco may silently redirect to the IP-geolocated category route.
  • /marketplace/category/search/ is not location-locked; refuse to treat it as a successful city search.
  • radius is miles in the URL but is represented internally in kilometers; the omitted default is about 40 miles.
  • Search-result payloads commonly omit full descriptions, seller details, exact condition, timestamps, coordinates, and full-resolution photos; resolve item URLs when those fields are required.
  • Search-result delivery_types may omit SHIPPING; verify the detail page when delivery matters.
  • marketplace_listing_category_id is a numeric leaf category ID, not the top-level category slug.
  • CDN photo URLs are signed and temporary; preserve observed URLs and do not reconstruct them.
  • Non-authenticated pagination commonly reaches a login wall after several cursor pages. Return partial results rather than dismissing it.
  • The item page may expose a compact marketplace_listing_renderable JSON object in a script tag; parse it in-page instead of dumping the potentially very large HTML response.
  • Property listings may display a deposit, monthly amount, per-room amount, land-only price, auction amount, or assignment price. Preserve the exact raw price and wording; do not normalize it to a presumed whole-property sale price.
  • Keyword matches such as foreclosure, cash, as-is, repair, lot rent, tenant, or HOA are evidence leads only. Confirm them in the returned description or visible text and distinguish facts from hypotheses.
  • Marketplace may be unavailable in the proxy region; detect Marketplace isn't available and return region_unavailable.
  • Read-only operation only: never click Message, Make Offer, Save, Share, Report, seller profiles, CTAs, or outbound links.

Expected Output

{
  "single_item": true,
  "requested_url": "https://www.facebook.com/marketplace/item/{item-id}/",
  "final_url": "{final URL}",
  "canonical_url": "{canonical URL or null}",
  "listing": {
    "listing_id": "{id}",
    "title": "{title}",
    "price": {"formatted":"{raw price}","amount":null,"minor_units":null,"strikethrough_amount":null},
    "description": "{description or null}",
    "condition": "{condition or null}",
    "location": {},
    "posted_at": null,
    "seller": {},
    "photos": [],
    "delivery_methods": [],
    "custom_attributes": {},
    "is_sold": false,
    "is_pending": false
  },
  "price_assessment": {
    "observed_facts": {"asking_price":"{raw price}","original_price":null,"evidence_terms":[]},
    "supported_reasons": [],
    "warning_signals": [],
    "insufficient_information": "{why the public page is insufficient, if applicable}"
  },
  "partial": false,
  "partial_reason": null
}

For searches, return single_item:false, the query, canonical city slug, applied filters, result count, normalized listings, next_cursor, and partial status. Set partial:true for login walls, challenges, unavailable Marketplace, failed lazy loading, or incomplete requested pagination.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=facebook.com&task=search-marketplace