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
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.Construct searches directly as:
https://www.facebook.com/marketplace/{city-slug}/search/?query={urlencoded-query}Optional parameters areminPrice,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, andcategory=vehicles|propertyrentals|apparel|electronics|family|free|garden|hobbies|home|homeimprovement|musicalinstruments|officesupplies|petsupplies|sportinggoods|toys|bookmoviesmusic. Vehicle modifiers includemake,model,carType,transmissionType,minYear,maxYear,minMileage,maxMileage,vehicleExteriorColors,vehicleInteriorColors, andtitleStatus. Rental/property modifiers includeminBedrooms,maxBedrooms,minBathrooms,maxBathrooms,minAreaSize,maxAreaSize,propertyType, andprivateRoomBathroomType.Use canonical city slugs only. Known slugs include
nyc,la,sanfrancisco,chicago,austin,boston,seattle,atlanta,miami, andportland. 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 withlocation_resolution_failed; do not accept IP-geolocated results.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'};
})()For search pages, extract
marketplace_search.feed_units.edgesfrom the SSR script payload. Map eachnode.listingto its ID, title, formatted and numeric price, strikethrough price, city/state, thumbnail, numeric category ID, delivery types, live/sold/pending flags, and canonicalhttps://www.facebook.com/marketplace/item/{id}/URL. Also readpage_info.end_cursorand the server-resolved location/filter parameters.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 withpartial:trueand 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.For price-analysis requests, report only observations supported by visible description, attributes, price formatting, or seller text. Include
observed_facts,supported_reasons,warning_signals, andinsufficient_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.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, andsan-franciscomay silently redirect to the IP-geolocated category route. /marketplace/category/search/is not location-locked; refuse to treat it as a successful city search.radiusis 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_typesmay omitSHIPPING; verify the detail page when delivery matters. marketplace_listing_category_idis 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_renderableJSON 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, orHOAare 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 availableand returnregion_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.