Nimbryxo Studio

Facebook Marketplace Listing & Price Extractor

Extract public Facebook Marketplace listings by city feed, category, keyword search, or direct item URL, with price, location, photos, delivery method, seller, and listing status per item.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
modestringoptionalWhat to scrape. auto uses startUrls when present and otherwise builds a keyword search. search builds a search from searchQueries plus location. urls scrapes the given Marketplace search, category, or city-feed URLs. items fetches direct item URLs or numeric IDs.
startUrlsarrayoptionalMarketplace search, city-category, global-category, city-feed, or /marketplace/item/ URLs. In mode=items, a bare numeric listing ID is also accepted.
searchQueriesarrayoptionalOne to 20 keywords or phrases (mode=search or mode=auto without URLs). Each query becomes one source.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalWhat to scrape. auto uses startUrls when present and otherwise builds a keyword search. search builds a search from searchQueries plus location. urls scrapes the given Marketplace search, category, or city-feed URLs. items fetches direct item URLs or numeric IDs.
startUrlsarrayoptionalMarketplace search, city-category, global-category, city-feed, or /marketplace/item/ URLs. In mode=items, a bare numeric listing ID is also accepted.
searchQueriesarrayoptionalOne to 20 keywords or phrases (mode=search or mode=auto without URLs). Each query becomes one source.
locationstringoptionalMarketplace location slug, city, postal code, or address used by keyword search (mode=search or mode=auto without URLs). Examples: nyc, Austin, Texas, 90210, London.
countrystringoptionalISO 3166-1 alpha-2 country used when resolving a human location. Use GB for London, CA for Toronto, and so on.
latitudenumberoptionalOptional search center latitude. Provide longitude too.
longitudenumberoptionalOptional search center longitude. Provide latitude too.
radiusKmintegeroptionalSearch radius in kilometres for keyword or category search. URL mode keeps the radius in the URL unless you set this explicitly.
categorystringoptionalMarketplace category. If searchQueries is empty, the actor opens the city category feed (or the global category feed for a human location). Books, shoes, games, motorcycles, cell-phones, computers, video-games, and cameras were verified as category feeds but expose no server category ID, so they are not usable as keyword filters; use categoryId or a category URL for those.
categoryIdstringoptionalAdvanced numeric Facebook category ID. Takes precedence over category when set.
sortBystringoptionalServer-side sort where Marketplace supports it, plus a client-side re-sort by price or posting time. Rows without a price sort last.
minPricenumberoptionalOnly listings at or above this price. Rows without a price are dropped.
maxPricenumberoptionalOnly listings at or below this price. Rows without a price are dropped.
conditionstringoptionalServer-side condition filter in search/category modes. In deep mode the detail condition is checked too; fast URL rows without condition data are kept.
deliveryMethodstringoptionalClient-side filter over the listing's delivery types. Listings without delivery data are dropped when this filter is active. Legacy local_pickup is accepted as local.
daysSinceListedintegeroptionalOnly listings created within this many days. Rows without a posting time are dropped.
availabilitystringoptionalClient-side status filter. Search feeds are mostly available; sold and pending are more common on direct item pages.
exactMatchbooleanoptionalKeep only rows whose title (and description in deep mode) contains every query word.
maxItemsintegeroptionalGlobal output limit across all sources.
maxItemsPerUrlintegeroptionalPer-source output limit.
maxPagesPerUrlintegeroptionalCost guard for cursor pagination. The actor stops earlier on source exhaustion, a repeated cursor, two empty pages, or maxItems. There is no fixed row cap: a Phase 6 probe reached 1,694 unique search rows across 71 pages before Facebook returned an empty page 72.
scrapeModestringoptionalfast streams feed rows. deep fetches each listing page for description, condition, attributes, seller, coordinates, and photos. auto follows includeListingDetails and includeAllPhotos.
includeListingDetailsbooleanoptionalCompatibility alias that enables deep mode unless scrapeMode=fast is explicit.
includeAllPhotosbooleanoptionalEnables deep mode and adds the full photo gallery.
rehostImagesbooleanoptionalCopy primary photos and seller avatars into the actor key-value store so the emitted URLs do not expire. The original Facebook URL is kept in primaryPhotoUrlOriginal. When off, mediaUrlTemporary is emitted.
deduplicateAcrossInputsbooleanoptionalEmit each listing ID once across sources. Disable to preserve repeats from repeated input URLs.
proxyConfigurationobjectoptionalOptional advanced override. The actor works without a proxy and automatically escalates only when Facebook blocks a request. A missing value never stops a run.

Download the published input schema

View complete JSON
{
  "description": "Scrape public Facebook Marketplace listings without cookies or login. Search by keyword and location, scrape Marketplace URLs, or fetch direct item pages. Fast mode reads feed rows; deep mode adds descriptions, condition, seller, coordinates, and photos.",
  "properties": {
    "availability": {
      "default": "all",
      "description": "Client-side status filter. Search feeds are mostly available; sold and pending are more common on direct item pages.",
      "editor": "select",
      "enum": [
        "all",
        "available",
        "sold",
        "pending"
      ],
      "enumTitles": [
        "All listings",
        "Available",
        "Sold",
        "Pending"
      ],
      "prefill": "all",
      "title": "Availability",
      "type": "string"
    },
    "category": {
      "default": "all",
      "description": "Marketplace category. If searchQueries is empty, the actor opens the city category feed (or the global category feed for a human location). Books, shoes, games, motorcycles, cell-phones, computers, video-games, and cameras were verified as category feeds but expose no server category ID, so they are not usable as keyword filters; use categoryId or a category URL for those.",
      "editor": "select",
      "enum": [
        "all",
        "vehicles",
        "electronics",
        "furniture",
        "home",
        "tools",
        "sports",
        "toys",
        "appliances",
        "jewelry",
        "autoparts",
        "garden",
        "pets",
        "books",
        "shoes",
        "games",
        "motorcycles",
        "boats",
        "antiques",
        "arts",
        "health",
        "cell-phones",
        "computers",
        "video-games",
        "cameras"
      ],
      "enumTitles": [
        "All categories",
        "Vehicles",
        "Electronics",
        "Furniture",
        "Home goods",
        "Tools",
        "Sporting goods",
        "Toys and games",
        "Appliances",
        "Jewelry and watches",
        "Auto parts",
        "Garden and outdoor",
        "Pet supplies",
        "Books",
        "Shoes",
        "Games",
        "Motorcycles",
        "Boats",
        "Antiques and collectibles",
        "Arts and crafts",
        "Health and beauty",
        "Cell phones",
        "Computers",
        "Video games",
        "Cameras"
      ],
      "prefill": "all",
      "title": "Category",
      "type": "string"
    },
    "categoryId": {
      "description": "Advanced numeric Facebook category ID. Takes precedence over category when set.",
      "editor": "textfield",
      "title": "Category ID",
      "type": "string"
    },
    "condition": {
      "default": "any",
      "description": "Server-side condition filter in search/category modes. In deep mode the detail condition is checked too; fast URL rows without condition data are kept.",
      "editor": "select",
      "enum": [
        "any",
        "new",
        "used_like_new",
        "used_good",
        "used_fair"
      ],
      "enumTitles": [
        "Any condition",
        "New",
        "Used: like new",
        "Used: good",
        "Used: fair"
      ],
      "prefill": "any",
      "title": "Condition",
      "type": "string"
    },
    "country": {
      "default": "US",
      "description": "ISO 3166-1 alpha-2 country used when resolving a human location. Use GB for London, CA for Toronto, and so on.",
      "editor": "select",
      "enum": [
        "AD",
        "AE",
        "AF",
        "AG",
        "AI",
        "AL",
        "AM",
        "AO",
        "AQ",
        "AR",
        "AS",
        "AT",
        "AU",
        "AW",
        "AX",
        "AZ",
        "BA",
        "BB",
        "BD",
        "BE",
        "BF",
        "BG",
        "BH",
        "BI",
        "BJ",
        "BL",
        "BM",
        "BN",
        "BO",
        "BQ",
        "BR",
        "BS",
        "BT",
        "BV",
        "BW",
        "BY",
        "BZ",
        "CA",
        "CC",
        "CD",
        "CF",
        "CG",
        "CH",
        "CI",
        "CK",
        "CL",
        "CM",
        "CN",
        "CO",
        "CR",
        "CU",
        "CV",
        "CW",
        "CX",
        "CY",
        "CZ",
        "DE",
        "DJ",
        "DK",
        "DM",
        "DO",
        "DZ",
        "EC",
        "EE",
        "EG",
        "EH",
        "ER",
        "ES",
        "ET",
        "FI",
        "FJ",
        "FK",
        "FM",
        "FO",
        "FR",
        "GA",
        "GB",
        "GD",
        "GE",
        "GF",
        "GG",
        "GH",
        "GI",
        "GL",
        "GM",
        "GN",
        "GP",
        "GQ",
        "GR",
        "GS",
        "GT",
        "GU",
        "GW",
        "GY",
        "HK",
        "HM",
        "HN",
        "HR",
        "HT",
        "HU",
        "ID",
        "IE",
        "IL",
        "IM",
        "IN",
        "IO",
        "IQ",
        "IR",
        "IS",
        "IT",
        "JE",
        "JM",
        "JO",
        "JP",
        "KE",
        "KG",
        "KH",
        "KI",
        "KM",
        "KN",
        "KP",
        "KR",
        "KW",
        "KY",
        "KZ",
        "LA",
        "LB",
        "LC",
        "LI",
        "LK",
        "LR",
        "LS",
        "LT",
        "LU",
        "LV",
        "LY",
        "MA",
        "MC",
        "MD",
        "ME",
        "MF",
        "MG",
        "MH",
        "MK",
        "ML",
        "MM",
        "MN",
        "MO",
        "MP",
        "MQ",
        "MR",
        "MS",
        "MT",
        "MU",
        "MV",
        "MW",
        "MX",
        "MY",
        "MZ",
        "NA",
        "NC",
        "NE",
        "NF",
        "NG",
        "NI",
        "NL",
        "NO",
        "NP",
        "NR",
        "NU",
        "NZ",
        "OM",
        "PA",
        "PE",
        "PF",
        "PG",
        "PH",
        "PK",
        "PL",
        "PM",
        "PN",
        "PR",
        "PS",
        "PT",
        "PW",
        "PY",
        "QA",
        "RE",
        "RO",
        "RS",
        "RU",
        "RW",
        "SA",
        "SB",
        "SC",
        "SD",
        "SE",
        "SG",
        "SH",
        "SI",
        "SJ",
        "SK",
        "SL",
        "SM",
        "SN",
        "SO",
        "SR",
        "SS",
        "ST",
        "SV",
        "SX",
        "SY",
        "SZ",
        "TC",
        "TD",
        "TF",
        "TG",
        "TH",
        "TJ",
        "TK",
        "TL",
        "TM",
        "TN",
        "TO",
        "TR",
        "TT",
        "TV",
        "TW",
        "TZ",
        "UA",
        "UG",
        "UM",
        "US",
        "UY",
        "UZ",
        "VA",
        "VC",
        "VE",
        "VG",
        "VI",
        "VN",
        "VU",
        "WF",
        "WS",
        "XK",
        "YE",
        "YT",
        "ZA",
        "ZM",
        "ZW"
      ],
      "enumTitles": [
        "Andorra",
        "United Arab Emirates",
        "Afghanistan",
        "Antigua and Barbuda",
        "Anguilla",
        "Albania",
        "Armenia",
        "Angola",
        "Antarctica",
        "Argentina",
        "American Samoa",
        "Austria",
        "Australia",
        "Aruba",
        "Aland Islands",
        "Azerbaijan",
        "Bosnia and Herzegovina",
        "Barbados",
        "Bangladesh",
        "Belgium",
        "Burkina Faso",
        "Bulgaria",
        "Bahrain",
        "Burundi",
        "Benin",
        "Saint Barthelemy",
        "Bermuda",
        "Brunei",
        "Bolivia",
        "Caribbean Netherlands",
        "Brazil",
        "Bahamas",
        "Bhutan",
        "Bouvet Island",
        "Botswana",
        "Belarus",
        "Belize",
        "Canada",
        "Cocos Islands",
        "Democratic Republic of the Congo",
        "Central African Republic",
        "Republic of the Congo",
        "Switzerland",
        "Cote d'Ivoire",
        "Cook Islands",
        "Chile",
        "Cameroon",
        "China",
        "Colombia",
        "Costa Rica",
        "Cuba",
        "Cape Verde",
        "Curacao",
        "Christmas Island",
        "Cyprus",
        "Czechia",
        "Germany",
        "Djibouti",
        "Denmark",
        "Dominica",
        "Dominican Republic",
        "Algeria",
        "Ecuador",
        "Estonia",
        "Egypt",
        "Western Sahara",
        "Eritrea",
        "Spain",
        "Ethiopia",
        "Finland",
        "Fiji",
        "Falkland Islands",
        "Micronesia",
        "Faroe Islands",
        "France",
        "Gabon",
        "United Kingdom",
        "Grenada",
        "Georgia",
        "French Guiana",
        "Guernsey",
        "Ghana",
        "Gibraltar",
        "Greenland",
        "Gambia",
        "Guinea",
        "Guadeloupe",
        "Equatorial Guinea",
        "Greece",
        "South Georgia and the South Sandwich Islands",
        "Guatemala",
        "Guam",
        "Guinea-Bissau",
        "Guyana",
        "Hong Kong",
        "Heard Island and McDonald Islands",
        "Honduras",
        "Croatia",
        "Haiti",
        "Hungary",
        "Indonesia",
        "Ireland",
        "Israel",
        "Isle of Man",
        "India",
        "British Indian Ocean Territory",
        "Iraq",
        "Iran",
        "Iceland",
        "Italy",
        "Jersey",
        "Jamaica",
        "Jordan",
        "Japan",
        "Kenya",
        "Kyrgyzstan",
        "Cambodia",
        "Kiribati",
        "Comoros",
        "Saint Kitts and Nevis",
        "North Korea",
        "South Korea",
        "Kuwait",
        "Cayman Islands",
        "Kazakhstan",
        "Laos",
        "Lebanon",
        "Saint Lucia",
        "Liechtenstein",
        "Sri Lanka",
        "Liberia",
        "Lesotho",
        "Lithuania",
        "Luxembourg",
        "Latvia",
        "Libya",
        "Morocco",
        "Monaco",
        "Moldova",
        "Montenegro",
        "Saint Martin",
        "Madagascar",
        "Marshall Islands",
        "North Macedonia",
        "Mali",
        "Myanmar",
        "Mongolia",
        "Macao",
        "Northern Mariana Islands",
        "Martinique",
        "Mauritania",
        "Montserrat",
        "Malta",
        "Mauritius",
        "Maldives",
        "Malawi",
        "Mexico",
        "Malaysia",
        "Mozambique",
        "Namibia",
        "New Caledonia",
        "Niger",
        "Norfolk Island",
        "Nigeria",
        "Nicaragua",
        "Netherlands",
        "Norway",
        "Nepal",
        "Nauru",
        "Niue",
        "New Zealand",
        "Oman",
        "Panama",
        "Peru",
        "French Polynesia",
        "Papua New Guinea",
        "Philippines",
        "Pakistan",
        "Poland",
        "Saint Pierre and Miquelon",
        "Pitcairn Islands",
        "Puerto Rico",
        "Palestine",
        "Portugal",
        "Palau",
        "Paraguay",
        "Qatar",
        "Reunion",
        "Romania",
        "Serbia",
        "Russia",
        "Rwanda",
        "Saudi Arabia",
        "Solomon Islands",
        "Seychelles",
        "Sudan",
        "Sweden",
        "Singapore",
        "Saint Helena",
        "Slovenia",
        "Svalbard and Jan Mayen",
        "Slovakia",
        "Sierra Leone",
        "San Marino",
        "Senegal",
        "Somalia",
        "Suriname",
        "South Sudan",
        "Sao Tome and Principe",
        "El Salvador",
        "Sint Maarten",
        "Syria",
        "Eswatini",
        "Turks and Caicos Islands",
        "Chad",
        "French Southern Territories",
        "Togo",
        "Thailand",
        "Tajikistan",
        "Tokelau",
        "Timor-Leste",
        "Turkmenistan",
        "Tunisia",
        "Tonga",
        "Turkiye",
        "Trinidad and Tobago",
        "Tuvalu",
        "Taiwan",
        "Tanzania",
        "Ukraine",
        "Uganda",
        "United States Minor Outlying Islands",
        "United States",
        "Uruguay",
        "Uzbekistan",
        "Vatican City",
        "Saint Vincent and the Grenadines",
        "Venezuela",
        "British Virgin Islands",
        "U.S. Virgin Islands",
        "Vietnam",
        "Vanuatu",
        "Wallis and Futuna",
        "Samoa",
        "Kosovo",
        "Yemen",
        "Mayotte",
        "South Africa",
        "Zambia",
        "Zimbabwe"
      ],
      "prefill": "US",
      "title": "Country",
      "type": "string"
    },
    "daysSinceListed": {
      "description": "Only listings created within this many days. Rows without a posting time are dropped.",
      "editor": "number",
      "maximum": 365,
      "minimum": 1,
      "title": "Listed Within (days)",
      "type": "integer"
    },
    "deduplicateAcrossInputs": {
      "default": true,
      "description": "Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs.",
      "prefill": true,
      "title": "Deduplicate Across Inputs",
      "type": "boolean"
    },
    "deliveryMethod": {
      "default": "all",
      "description": "Client-side filter over the listing's delivery types. Listings without delivery data are dropped when this filter is active. Legacy local_pickup is accepted as local.",
      "editor": "select",
      "enum": [
        "all",
        "shipping",
        "local"
      ],
      "enumTitles": [
        "All methods",
        "Shipping",
        "Local pickup or meetup"
      ],
      "prefill": "all",
      "title": "Delivery Method",
      "type": "string"
    },
    "exactMatch": {
      "default": false,
      "description": "Keep only rows whose title (and description in deep mode) contains every query word.",
      "prefill": false,
      "title": "Exact Keyword Match",
      "type": "boolean"
    },
    "includeAllPhotos": {
      "default": false,
      "description": "Enables deep mode and adds the full photo gallery.",
      "prefill": false,
      "title": "Include All Photos",
      "type": "boolean"
    },
    "includeListingDetails": {
      "default": false,
      "description": "Compatibility alias that enables deep mode unless scrapeMode=fast is explicit.",
      "prefill": false,
      "title": "Include Listing Details",
      "type": "boolean"
    },
    "latitude": {
      "description": "Optional search center latitude. Provide longitude too.",
      "editor": "number",
      "maximum": 90,
      "minimum": -90,
      "title": "Latitude",
      "type": "number"
    },
    "location": {
      "description": "Marketplace location slug, city, postal code, or address used by keyword search (mode=search or mode=auto without URLs). Examples: nyc, Austin, Texas, 90210, London.",
      "editor": "textfield",
      "example": "Austin, Texas",
      "prefill": "nyc",
      "title": "Location",
      "type": "string"
    },
    "longitude": {
      "description": "Optional search center longitude. Provide latitude too.",
      "editor": "number",
      "maximum": 180,
      "minimum": -180,
      "title": "Longitude",
      "type": "number"
    },
    "maxItems": {
      "default": 50,
      "description": "Global output limit across all sources.",
      "editor": "number",
      "maximum": 10000,
      "minimum": 1,
      "prefill": 3,
      "title": "Maximum Listings",
      "type": "integer"
    },
    "maxItemsPerUrl": {
      "default": 50,
      "description": "Per-source output limit.",
      "editor": "number",
      "maximum": 10000,
      "minimum": 1,
      "prefill": 3,
      "title": "Maximum Listings Per URL",
      "type": "integer"
    },
    "maxPagesPerUrl": {
      "default": 100,
      "description": "Cost guard for cursor pagination. The actor stops earlier on source exhaustion, a repeated cursor, two empty pages, or maxItems. There is no fixed row cap: a Phase 6 probe reached 1,694 unique search rows across 71 pages before Facebook returned an empty page 72.",
      "editor": "number",
      "maximum": 500,
      "minimum": 1,
      "prefill": 1,
      "title": "Maximum Pages Per URL",
      "type": "integer"
    },
    "maxPrice": {
      "description": "Only listings at or below this price. Rows without a price are dropped.",
      "editor": "number",
      "minimum": 0,
      "title": "Maximum Price",
      "type": "number"
    },
    "minPrice": {
      "description": "Only listings at or above this price. Rows without a price are dropped.",
      "editor": "number",
      "minimum": 0,
      "title": "Minimum Price",
      "type": "number"
    },
    "mode": {
      "default": "auto",
      "description": "What to scrape. auto uses startUrls when present and otherwise builds a keyword search. search builds a search from searchQueries plus location. urls scrapes the given Marketplace search, category, or city-feed URLs. items fetches direct item URLs or numeric IDs.",
      "editor": "select",
      "enum": [
        "auto",
        "search",
        "urls",
        "items"
      ],
      "enumTitles": [
        "Auto (use URLs first, then keyword search)",
        "Search by keyword and location",
        "Scrape these Marketplace URLs",
        "Fetch these listing URLs or IDs"
      ],
      "prefill": "urls",
      "title": "Mode",
      "type": "string"
    },
    "proxyConfiguration": {
      "description": "Optional advanced override. The actor works without a proxy and automatically escalates only when Facebook blocks a request. A missing value never stops a run.",
      "editor": "proxy",
      "title": "Proxy Configuration",
      "type": "object"
    },
    "radiusKm": {
      "default": 65,
      "description": "Search radius in kilometres for keyword or category search. URL mode keeps the radius in the URL unless you set this explicitly.",
      "editor": "number",
      "maximum": 500,
      "minimum": 1,
      "prefill": 65,
      "title": "Radius (km)",
      "type": "integer"
    },
    "rehostImages": {
      "default": true,
      "description": "Copy primary photos and seller avatars into the actor key-value store so the emitted URLs do not expire. The original Facebook URL is kept in primaryPhotoUrlOriginal. When off, mediaUrlTemporary is emitted.",
      "prefill": false,
      "title": "Rehost Images",
      "type": "boolean"
    },
    "scrapeMode": {
      "default": "fast",
      "description": "fast streams feed rows. deep fetches each listing page for description, condition, attributes, seller, coordinates, and photos. auto follows includeListingDetails and includeAllPhotos.",
      "editor": "select",
      "enum": [
        "fast",
        "deep",
        "auto"
      ],
      "enumTitles": [
        "Fast (feed data only)",
        "Deep (fetch each listing page)",
        "Auto (deep only when details or photos are requested)"
      ],
      "prefill": "fast",
      "title": "Scrape Mode",
      "type": "string"
    },
    "searchQueries": {
      "default": [],
      "description": "One to 20 keywords or phrases (mode=search or mode=auto without URLs). Each query becomes one source.",
      "editor": "stringList",
      "example": [
        "laptop",
        "office chair"
      ],
      "prefill": [
        "laptop"
      ],
      "title": "Search Queries",
      "type": "array"
    },
    "sortBy": {
      "default": "relevance",
      "description": "Server-side sort where Marketplace supports it, plus a client-side re-sort by price or posting time. Rows without a price sort last.",
      "editor": "select",
      "enum": [
        "relevance",
        "newest",
        "oldest",
        "price_asc",
        "price_desc",
        "distance"
      ],
      "enumTitles": [
        "Relevance",
        "Newest first",
        "Oldest first",
        "Price: low to high",
        "Price: high to low",
        "Distance (requires coordinates)"
      ],
      "prefill": "relevance",
      "title": "Sort Order",
      "type": "string"
    },
    "startUrls": {
      "default": [],
      "description": "Marketplace search, city-category, global-category, city-feed, or /marketplace/item/ URLs. In mode=items, a bare numeric listing ID is also accepted.",
      "editor": "requestListSources",
      "example": [
        {
          "url": "https://www.facebook.com/marketplace/nyc/search/?query=laptop"
        }
      ],
      "items": {
        "properties": {
          "url": {
            "description": "A valid Facebook Marketplace URL or a listing ID in mode=items.",
            "title": "URL",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "prefill": [
        {
          "url": "https://www.facebook.com/marketplace/nyc/search/?query=laptop"
        }
      ],
      "title": "Marketplace URLs or Item IDs",
      "type": "array"
    }
  },
  "schemaVersion": 1,
  "title": "Facebook Marketplace Input",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
listingsstringoptionalDefault dataset containing one JSON object per Marketplace listing, including normalized canonical fields, legacy Facebook aliases, and source attribution.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "One JSON object per Facebook Marketplace listing. Canonical groups: identity and provenance (id, listingUrl, sourceUrl, sourceType, inputIndex, searchQuery, locationQueried, recordType, scrapedAt), core fields (title, description, price, strikethroughPrice, condition, conditionLabel, attributes, categoryId, categoryName, categorySlug, categoryPath), location (locationText, city, state, latitude, longitude, distanceKm when radius filtering had coordinates), delivery and status (deliveryTypes, shippingAvailable, localPickupAvailable, creationTime, createdAt, listingAgeDays, isLive, isSold, isPending, isHidden, listingStatus), seller (seller with optional profileUrl and dealer, sellerDataAvailability), media (primaryPhotoUrl, primaryPhotoUrlOriginal, mediaUrlTemporary, photos, videoUrl, videos), vehicleDetails (including conditional specs, numberOfOwners, isPaidOff), vehicleVin and vehicleVinSource, and quality/access (dataMode, extractionSource, qualityStatus, missingFields, accessState, detailFetchStatus). Facebook field-name aliases such as marketplace_listing_title, listing_price, marketplace_listing_seller, location, delivery_types, creation_time, primary_listing_photo, listingPhotos, listingVideo, and vehicle are kept when present. Private-seller contact, vehicle features/Carfax/plate/website, and permanent video URLs are not available logged out. Empty values are omitted.",
  "properties": {
    "listings": {
      "description": "Default dataset containing one JSON object per Marketplace listing, including normalized canonical fields, legacy Facebook aliases, and source attribution.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Marketplace Listings Dataset",
      "type": "string"
    }
  },
  "title": "Facebook Marketplace Listing & Price Extractor Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "title": "Facebook Marketplace Listings",
  "views": {
    "detailed": {
      "display": {
        "component": "table",
        "properties": {
          "accessState": {
            "format": "text",
            "label": "Access State"
          },
          "city": {
            "format": "text",
            "label": "City"
          },
          "delivery_types": {
            "format": "text",
            "label": "Delivery"
          },
          "extractionSource": {
            "format": "text",
            "label": "Extraction Source"
          },
          "facebookUrl": {
            "format": "link",
            "label": "Facebook URL"
          },
          "id": {
            "format": "text",
            "label": "ID"
          },
          "is_live": {
            "format": "text",
            "label": "Live"
          },
          "is_pending": {
            "format": "text",
            "label": "Pending"
          },
          "is_sold": {
            "format": "text",
            "label": "Sold"
          },
          "listingUrl": {
            "format": "link",
            "label": "Listing URL"
          },
          "listing_price": {
            "format": "text",
            "label": "Facebook Price"
          },
          "listing_video": {
            "format": "text",
            "label": "Video"
          },
          "location": {
            "format": "text",
            "label": "Location"
          },
          "marketplace_listing_category_id": {
            "format": "text",
            "label": "Category ID"
          },
          "marketplace_listing_seller": {
            "format": "text",
            "label": "Seller"
          },
          "marketplace_listing_title": {
            "format": "text",
            "label": "Facebook Title"
          },
          "price": {
            "format": "text",
            "label": "Price"
          },
          "primary_listing_photo": {
            "format": "text",
            "label": "Photo"
          },
          "qualityStatus": {
            "format": "text",
            "label": "Quality"
          },
          "redacted_description": {
            "format": "text",
            "label": "Description"
          },
          "sourceType": {
            "format": "text",
            "label": "Source Type"
          },
          "sourceUrl": {
            "format": "link",
            "label": "Input Source"
          },
          "state": {
            "format": "text",
            "label": "State"
          },
          "title": {
            "format": "text",
            "label": "Title"
          }
        }
      },
      "title": "Detailed View",
      "transformation": {
        "fields": [
          "id",
          "title",
          "price",
          "description",
          "condition",
          "conditionLabel",
          "attributes",
          "categoryId",
          "categoryName",
          "categorySlug",
          "categoryPath",
          "city",
          "state",
          "locationText",
          "latitude",
          "longitude",
          "distanceKm",
          "deliveryTypes",
          "shippingAvailable",
          "localPickupAvailable",
          "creationTime",
          "createdAt",
          "listingAgeDays",
          "isLive",
          "isSold",
          "isPending",
          "isHidden",
          "listingStatus",
          "seller",
          "sellerDataAvailability",
          "primaryPhotoUrl",
          "primaryPhotoUrlOriginal",
          "mediaUrlTemporary",
          "photos",
          "videoUrl",
          "videos",
          "vehicleDetails",
          "vehicleVin",
          "vehicleVinSource",
          "sourceUrl",
          "sourceType",
          "inputIndex",
          "searchQuery",
          "locationQueried",
          "dataMode",
          "detailFetchStatus",
          "extractionSource",
          "qualityStatus",
          "missingFields",
          "accessState",
          "recordType",
          "scrapedAt",
          "marketplace_listing_title",
          "listing_price",
          "strikethrough_price",
          "location",
          "is_sold",
          "is_pending",
          "is_live",
          "marketplace_listing_seller",
          "delivery_types",
          "marketplace_listing_category_id",
          "primary_listing_photo",
          "listing_video",
          "redacted_description",
          "creation_time",
          "item_location",
          "attribute_data",
          "commerce_badges_info",
          "cross_post_info",
          "share_uri",
          "shipping_offered",
          "search_pivots",
          "listingUrl",
          "facebookUrl"
        ]
      }
    },
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "accessState": {
            "format": "text",
            "label": "Access State"
          },
          "city": {
            "format": "text",
            "label": "City"
          },
          "condition": {
            "format": "text",
            "label": "Condition"
          },
          "deliveryTypes": {
            "format": "text",
            "label": "Delivery"
          },
          "listingUrl": {
            "format": "link",
            "label": "Listing URL"
          },
          "locationText": {
            "format": "text",
            "label": "Location"
          },
          "marketplace_listing_seller": {
            "format": "text",
            "label": "Seller"
          },
          "price": {
            "format": "text",
            "label": "Price"
          },
          "primaryPhotoUrl": {
            "format": "link",
            "label": "Photo"
          },
          "qualityStatus": {
            "format": "text",
            "label": "Quality"
          },
          "seller": {
            "format": "text",
            "label": "Seller"
          },
          "sourceType": {
            "format": "text",
            "label": "Source Type"
          },
          "sourceUrl": {
            "format": "link",
            "label": "Input Source"
          },
          "state": {
            "format": "text",
            "label": "State"
          },
          "title": {
            "format": "text",
            "label": "Title"
          }
        }
      },
      "title": "Listings Overview",
      "transformation": {
        "fields": [
          "title",
          "price",
          "city",
          "state",
          "locationText",
          "condition",
          "deliveryTypes",
          "seller",
          "primaryPhotoUrl",
          "sourceUrl",
          "sourceType",
          "qualityStatus",
          "accessState",
          "marketplace_listing_title",
          "listing_price",
          "location",
          "is_sold",
          "is_pending",
          "marketplace_listing_seller",
          "listingUrl"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

Facebook Marketplace Listing & Price Extractor

Extract public Facebook Marketplace listings without cookies, login, or a proxy of your own. Point the actor at Marketplace search, category, city-feed, or direct item URLs, or give it a keyword plus a city, and get one structured row per listing with price, location, delivery, status, seller, photos, and optional detail fields.

What this actor does

  • Scrapes keyword searches, city categories, global categories, city/location feeds, and direct item pages in one run.
  • Builds a Marketplace search from searchQueries + location, resolving city names, postal codes, and addresses server-side.
  • Paginates search and category feeds with Facebook's cursor, stopping on source exhaustion, a repeated cursor, two empty pages, maxPagesPerUrl, or maxItems. There is no fixed row cap: the Phase 6 probe reached 1,694 unique search rows across 71 pages before Facebook returned an empty page 72.
  • Reads feed rows in fast mode and fetches each listing page in deep mode for description, condition, attributes, seller, coordinates, gallery, and vehicle fields.
  • Applies price, condition, delivery, age, availability, category, and exact-keyword filters against the data each row actually carries.
  • Rehosts the primary photo into the actor key-value store by default so the emitted URL does not expire; the original signed URL is retained. If a download fails, the original signed URL is kept and flagged mediaUrlTemporary: true.
  • Empty fields are omitted: null, empty-string, empty-list, and empty-object values are never emitted. 0 and false are preserved.
  • Works without user cookies. The proxy ladder starts direct and only escalates when Facebook blocks a request; residential is a hardcoded last resort after free rungs fail, never a schema default.

Input

Field Type Default Description
mode string auto auto uses startUrls when present, otherwise keyword search. search builds searches from searchQueries + location. urls scrapes Marketplace URLs. items fetches direct item URLs or numeric IDs.
startUrls array none Marketplace search, city-category, global-category, city-feed, or /marketplace/item/ URLs. In items mode a bare numeric listing ID is also accepted.
searchQueries array [] One to 20 keywords or phrases. Each query becomes one source. Legacy searchQuery is mapped in code.
location string none Marketplace slug, city, postal code, or address, e.g. nyc, Austin, Texas, 90210, London. Required for keyword search unless coordinates are provided.
country string US ISO 3166-1 alpha-2 country used when resolving a human location. Use GB for London, CA for Toronto, and so on.
latitude number none Optional search center latitude. Provide longitude too. Overrides location when both are set.
longitude number none Optional search center longitude. Provide latitude too.
radiusKm integer 65 Search radius in kilometres (1-500). Sent server-side (search uses kilometres; category and city queries convert to metres) and enforced client-side over listing coordinates. Rows whose coordinates are absent cannot be distance-checked and are kept; the status message reports how many were kept that way. URL-mode sources use the radius embedded in the page unless radiusKm is set explicitly.
category string all Curated Marketplace category: vehicles, electronics, furniture, home, tools, sports, toys, appliances, jewelry, autoparts, garden, pets, books, shoes, games, motorcycles, boats, antiques, arts, health, cell-phones, computers, video-games, cameras, or all. With no searchQueries, opens the city or global category feed instead. Books, shoes, games, motorcycles, cell-phones, computers, video-games, and cameras were verified as category feeds but expose no server category ID, so they cannot be used as keyword filters; use categoryId or a category URL instead. Cameras returned rows in the city feed but 0 rows globally in the probe.
categoryId string none Advanced numeric Facebook category ID. Takes precedence over category.
sortBy string relevance relevance, newest, oldest, price_asc, price_desc, or distance. Sent server-side where Marketplace supports it; price and time are re-sorted client-side, with rows missing a price or date last.
minPrice number none Minimum price. Listings without a readable price are dropped when set.
maxPrice number none Maximum price. Listings without a readable price are dropped when set.
condition string any any, new, used_like_new, used_good, or used_fair. Sent server-side in search/category modes; checked again in deep mode. Fast rows without condition data are kept.
deliveryMethod string all all, shipping, or local. Client-side over delivery_types; legacy local_pickup is accepted and normalized to local. Rows without delivery data are dropped while this filter is active.
daysSinceListed integer none Only listings created within this many days (1–365). Rows without a posting time are dropped.
availability string all all, available, sold, or pending. Client-side over is_live/is_sold/is_pending.
exactMatch boolean false Keep only rows whose title (and description in deep mode) contains every query word.
maxItems integer 50 Global output limit across all sources (1–10000).
maxItemsPerUrl integer 50 Per-source output limit (1–10000).
maxPagesPerUrl integer 100 Cost guard for cursor pagination (1–500). The actor stops earlier on source exhaustion, a repeated cursor, two empty pages, or maxItems. The observed search ceiling was 1,694 unique rows over 71 pages; this is not an enforced cap.
scrapeMode string fast fast streams feed rows. deep fetches each listing page for description, condition, attributes, seller, coordinates, and photos. auto follows includeListingDetails/includeAllPhotos.
includeListingDetails boolean false Compatibility alias that enables deep mode unless scrapeMode is explicitly fast.
includeAllPhotos boolean false Enables deep mode and emits the full photo gallery.
rehostImages boolean true Copy primary photos and seller avatars into the actor key-value store. When off, signed Facebook URLs are emitted as-is (including the seller avatar) with mediaUrlTemporary: true.
deduplicateAcrossInputs boolean true Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs.
proxyConfiguration object none Optional advanced override. The actor works without a proxy and escalates only after a real block. Explicit user configuration is respected exactly.

Legacy inputs

searchQuery is mapped to searchQueries when the new field is absent. resultsLimit is still accepted from API clients and maps to maxItemsPerUrl when that field is absent; it is intentionally not shown in the schema. deliveryMethod: "local_pickup" is normalized to local. The old production input with a US residential proxyConfiguration still runs unchanged, although it is no longer the default.

Output per listing

Every dataset row is one listing object. Empty values are omitted at every depth; consumers should treat a missing field as unknown rather than null.

Identity and provenance

  • id, title, listingUrl, sourceUrl, facebookUrl
  • sourceType (search, category, location, or direct-item), inputIndex
  • searchQuery, locationQueried, categoryQueried
  • recordType (listing), scrapedAt

Core fields

  • price — { amount, currency, formatted, amountWithOffset }; currency is usually absent in fast feed rows and present in deep mode
  • strikethroughPrice, description, condition, conditionLabel
  • attributes — { name, value, label } entries
  • categoryId, categoryName, categorySlug, categoryPath

Location

  • locationText, city, state, latitude, longitude, distanceKm (when the radius filter ran and the listing has coordinates)

Delivery, status, and age

  • deliveryTypes, shippingAvailable, localPickupAvailable
  • creationTime, createdAt, listingAgeDays
  • isLive, isSold, isPending, isHidden, isViewerSeller, listingStatus

Seller

  • seller — { id, name, profileUrl, profilePictureUrl, rating, ratingCount, ratingsPrivate, dealer }
  • profileUrl is emitted only for stable numeric Facebook user IDs as https://www.facebook.com/profile.php?id=<numeric id>. pfbid... Marketplace seller IDs are session-scoped opaque tokens that often resolve to dead or restricted pages, so they are never turned into profile links.
  • dealer is emitted only for dealer/business rows (DIRECT_DEALERSHIP or dealer fields present, never PRIVATE_SELLER): { name, street, city, region, postalCode, country, phone, phoneUniversal }. Private-seller phone/email is never fabricated or collected.
  • sellerDataAvailability (exposed or not_exposed)

Media and vehicle

  • primaryPhotoUrl (rehosted KV URL when rehosting succeeds), primaryPhotoUrlOriginal, mediaUrlTemporary; failed primary, avatar, and gallery rehosts fall back to the original signed URL with the temporary flag set instead of dropping the media.
  • photos — { id, url, width, height, caption }; only when includeAllPhotos is enabled
  • videoUrl, videos
  • vehicleDetails — { make, model, trim, odometer, transmission, fuelType, exteriorColor, interiorColor, titleStatus, sellerType, condition, specs, numberOfOwners, isPaidOff } for vehicle listings; conditional fields are omitted when Facebook does not expose them
  • specs — { gasMileageCity, gasMileageCombined, gasMileageHighway, safetyRatingFront, safetyRatingOverall, safetyRatingRollover, safetyRatingSide, safetyRatingSideBarrier, co2Emissions, engineSize, horsePower }, each as { value, unit } when present
  • vehicleVin and vehicleVinSource — structured when Facebook supplies the field, otherwise description only for a checksum-valid 17-character VIN found in the listing text. Invalid VIN-shaped prose is never emitted.

Quality and access

  • dataMode (fast or deep), extractionSource, qualityStatus (complete or partial)
  • missingFields — expected canonical fields that were absent
  • accessState, detailFetchStatus (deep/direct rows)

Facebook compatibility aliases

The actor also emits, when present: marketplace_listing_title, listing_price (amount, formatted_amount, amount_with_offset_in_currency, currency), strikethrough_price, location, is_hidden, is_live, is_pending, is_sold, is_viewer_seller, delivery_types, marketplace_listing_category_id, marketplace_listing_seller, primary_listing_photo, listingPhotos, listingVideo, vehicle, custom_title, custom_sub_titles_with_rendering_flags, origin_group, parent_listing, comparable_price, comparable_price_type, min_listing_price, max_listing_price, redacted_description, attribute_data, creation_time, share_uri, shipping_offered, commerce_badges_info, cross_post_info, search_pivots, and created_with_seller_app. shipping_offered is a raw Facebook compatibility value and can be false even when deliveryTypes contains a shipping value; use the derived shippingAvailable flag instead.

Example: daily prefill

{
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.facebook.com/marketplace/nyc/search/?query=laptop" }
  ],
  "maxItems": 3,
  "maxItemsPerUrl": 3,
  "maxPagesPerUrl": 1,
  "scrapeMode": "fast",
  "includeListingDetails": false,
  "includeAllPhotos": false,
  "rehostImages": false,
  "deduplicateAcrossInputs": true
}

Example: keyword search by city

{
  "mode": "search",
  "searchQueries": ["laptop", "office chair"],
  "location": "Austin, Texas",
  "country": "US",
  "radiusKm": 40,
  "condition": "used_good",
  "minPrice": 50,
  "maxPrice": 500,
  "maxItems": 100
}

Example: deep detail scrape

{
  "mode": "urls",
  "startUrls": [
    { "url": "https://www.facebook.com/marketplace/nyc/electronics" }
  ],
  "scrapeMode": "deep",
  "includeAllPhotos": true,
  "maxItemsPerUrl": 20
}

Example: direct item

{
  "mode": "items",
  "startUrls": [
    { "url": "https://www.facebook.com/marketplace/item/772594759027016/" }
  ],
  "includeAllPhotos": true
}

Use cases

  • Price monitoring — track asking prices for a product or category across cities over time.
  • Resale and arbitrage — scan multiple city feeds for underpriced items.
  • Vehicle shopping — pull vehicle listings by location, price range, and condition.
  • Apartment hunting — collect rental and furniture listings from several neighborhoods.
  • Market research — compare listing volume and pricing across regions.

Verified hard limits

These limits were measured in the Phase 6 research and are not configurable away:

  • 24 listings per search page. count 24/50/100/250 all return 24; the cursor still advances.
  • City feed: 20 listings, no cursor. The actor keeps the mode for compatibility, warns in the status message, and returns at most 20 rows. Use a keyword or category URL for volume.
  • Delivery filter is client-side. Facebook's delivery server parameters are no-ops (shipping-only returned 0 rows, local-only did not filter). The actor filters on delivery_types after fetching.
  • Private-seller contact is not exposed. No phone, email, or messaging path appears logged out. The actor never fabricates contact data. Dealer rows with DIRECT_DEALERSHIP can expose dealership_name, listing_address, and seller_phone_number; those are emitted in seller.dealer only for dealer rows.
  • Vehicle features, Carfax, registration plate, and website link are null logged out. They are not emitted. VIN is different: structured VIN is always null, but a checksum-valid VIN pasted in the description is emitted with vehicleVinSource: "description".
  • Signed media URLs expire in roughly 4.3–4.5 days. Primary photos and avatars are rehosted when rehostImages is true; gallery photos are rehosted when includeAllPhotos is enabled. If a download fails (including CDN blocking one network path), the actor retries over an alternate proxy and then keeps the original signed URL with mediaUrlTemporary: true. Videos remain signed and temporary (mediaUrlTemporary: true); safe video rehosting is not implemented.
  • Property rentals category is unsupported. /marketplace/<city>/propertyrentals redirects without usable variables. Use a keyword search such as query=apartment as the workaround.
  • Cloud free proxy rungs are blocked. Direct, fresh-session, and Apify Proxy AUTO returned the login wall on the cloud; residential is the hardcoded last resort after those free rungs and is never a schema default.

FAQ

Why did I get fewer rows than maxItems? maxItems and maxItemsPerUrl are ceilings, not guarantees. The source may have fewer matches, Facebook may stop paginating, or client filters may remove rows that lack the evidence they check. If nothing can be returned and no source produced a valid empty result, the run fails with the access states in its status message.

What is the difference between fast and deep mode? fast reads only the search/category feed and streams rows. deep also fetches each listing page for description, condition, attributes, seller, coordinates, photos, and vehicle detail. Deep rows keep the fast row if a detail fetch fails, with detailFetchStatus set.

Why is the seller or currency missing on some rows? Facebook does not expose every field in every view. Feed rows usually omit currency, condition, and some seller details; deep mode fills them when available. price.currency is intentionally absent when it cannot be determined rather than guessed.

Does this need Facebook login or cookies? No. It reads publicly accessible Marketplace pages without signing in. Private-seller contact details and private profile scraping are not available logged out and are not collected. A seller.profileUrl is derived only from stable numeric seller IDs; session-scoped pfbid... tokens are not linked. Dealer name/address/phone are emitted only for dealer rows that expose them.

Do I need to configure a proxy? No. The actor starts with a direct TLS-impersonated request and escalates to a fresh session and then Apify Proxy AUTO only when a request is actually blocked. Cloud verification showed all free rungs still return Facebook's login wall, so residential is the hardcoded last resort after them; it is never a schema default. An explicit proxyConfiguration is honored as provided.

Why is the city feed capped at 20 listings? Facebook's city/location feed returns one page of about 20 listings with no cursor. The actor keeps the mode for compatibility and warns in the status message. Use a keyword or category URL for volume.

How many listings can a search return? Search and category feeds paginate with a 24-item page. There is no hardcoded 600-row stop. Phase 6 reached 71 pages / 1,694 unique rows, then page 72 returned an empty payload while still reporting has_next_page. The actor stops on source exhaustion, a repeated cursor, two consecutive empty pages, maxPagesPerUrl, or maxItems, so larger jobs need a higher maxPagesPerUrl and maxItems rather than price/category splitting.

Do photo URLs expire? Facebook CDN URLs are signed and expire in roughly 4.3–4.5 days. With rehostImages: true the primary photo and seller avatar are copied into the actor key-value store so primaryPhotoUrl and the avatar URL are stable; the signed primary URL remains in primaryPhotoUrlOriginal. With rehostImages: false, signed primary and avatar URLs are emitted as-is with mediaUrlTemporary: true. Gallery photos are also rehosted with includeAllPhotos; any photo whose download fails keeps its original signed URL and the row is marked mediaUrlTemporary: true, so the gallery is never silently dropped. Video URLs always remain temporary and are marked with mediaUrlTemporary.

Is this affiliated with Facebook or Meta? No. This is an independent third-party actor that reads publicly accessible Facebook Marketplace pages. It is not affiliated with or endorsed by Meta.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build hZnF0rAlhJEPRa5AQ. Documentation is regenerated from the default published build; private drafts are not included.