{
  "data": {
    "id": "hZnF0rAlhJEPRa5AQ",
    "actId": "DTj8k33mijt0OfkpR",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-10-29T06:56:00.398Z",
    "finishedAt": "2026-10-29T06:56:09.767Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9290,
      "runTimeSecs": 9.29,
      "computeUnits": 0.010322222222222222,
      "imageSizeBytes": 359272960
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Facebook Marketplace Input\",\n  \"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.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"search\",\n        \"urls\",\n        \"items\"\n      ],\n      \"enumTitles\": [\n        \"Auto (use URLs first, then keyword search)\",\n        \"Search by keyword and location\",\n        \"Scrape these Marketplace URLs\",\n        \"Fetch these listing URLs or IDs\"\n      ],\n      \"default\": \"auto\",\n      \"prefill\": \"urls\",\n      \"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.\"\n    },\n    \"startUrls\": {\n      \"title\": \"Marketplace URLs or Item IDs\",\n      \"type\": \"array\",\n      \"editor\": \"requestListSources\",\n      \"default\": [],\n      \"description\": \"Marketplace search, city-category, global-category, city-feed, or /marketplace/item/ URLs. In mode=items, a bare numeric listing ID is also accepted.\",\n      \"items\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"url\"\n        ],\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"title\": \"URL\",\n            \"description\": \"A valid Facebook Marketplace URL or a listing ID in mode=items.\"\n          }\n        }\n      },\n      \"prefill\": [\n        {\n          \"url\": \"https://www.facebook.com/marketplace/nyc/search/?query=laptop\"\n        }\n      ],\n      \"example\": [\n        {\n          \"url\": \"https://www.facebook.com/marketplace/nyc/search/?query=laptop\"\n        }\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Search Queries\",\n      \"type\": \"array\",\n      \"editor\": \"stringList\",\n      \"description\": \"One to 20 keywords or phrases (mode=search or mode=auto without URLs). Each query becomes one source.\",\n      \"default\": [],\n      \"prefill\": [\n        \"laptop\"\n      ],\n      \"example\": [\n        \"laptop\",\n        \"office chair\"\n      ]\n    },\n    \"location\": {\n      \"title\": \"Location\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"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.\",\n      \"prefill\": \"nyc\",\n      \"example\": \"Austin, Texas\"\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"AD\",\n        \"AE\",\n        \"AF\",\n        \"AG\",\n        \"AI\",\n        \"AL\",\n        \"AM\",\n        \"AO\",\n        \"AQ\",\n        \"AR\",\n        \"AS\",\n        \"AT\",\n        \"AU\",\n        \"AW\",\n        \"AX\",\n        \"AZ\",\n        \"BA\",\n        \"BB\",\n        \"BD\",\n        \"BE\",\n        \"BF\",\n        \"BG\",\n        \"BH\",\n        \"BI\",\n        \"BJ\",\n        \"BL\",\n        \"BM\",\n        \"BN\",\n        \"BO\",\n        \"BQ\",\n        \"BR\",\n        \"BS\",\n        \"BT\",\n        \"BV\",\n        \"BW\",\n        \"BY\",\n        \"BZ\",\n        \"CA\",\n        \"CC\",\n        \"CD\",\n        \"CF\",\n        \"CG\",\n        \"CH\",\n        \"CI\",\n        \"CK\",\n        \"CL\",\n        \"CM\",\n        \"CN\",\n        \"CO\",\n        \"CR\",\n        \"CU\",\n        \"CV\",\n        \"CW\",\n        \"CX\",\n        \"CY\",\n        \"CZ\",\n        \"DE\",\n        \"DJ\",\n        \"DK\",\n        \"DM\",\n        \"DO\",\n        \"DZ\",\n        \"EC\",\n        \"EE\",\n        \"EG\",\n        \"EH\",\n        \"ER\",\n        \"ES\",\n        \"ET\",\n        \"FI\",\n        \"FJ\",\n        \"FK\",\n        \"FM\",\n        \"FO\",\n        \"FR\",\n        \"GA\",\n        \"GB\",\n        \"GD\",\n        \"GE\",\n        \"GF\",\n        \"GG\",\n        \"GH\",\n        \"GI\",\n        \"GL\",\n        \"GM\",\n        \"GN\",\n        \"GP\",\n        \"GQ\",\n        \"GR\",\n        \"GS\",\n        \"GT\",\n        \"GU\",\n        \"GW\",\n        \"GY\",\n        \"HK\",\n        \"HM\",\n        \"HN\",\n        \"HR\",\n        \"HT\",\n        \"HU\",\n        \"ID\",\n        \"IE\",\n        \"IL\",\n        \"IM\",\n        \"IN\",\n        \"IO\",\n        \"IQ\",\n        \"IR\",\n        \"IS\",\n        \"IT\",\n        \"JE\",\n        \"JM\",\n        \"JO\",\n        \"JP\",\n        \"KE\",\n        \"KG\",\n        \"KH\",\n        \"KI\",\n        \"KM\",\n        \"KN\",\n        \"KP\",\n        \"KR\",\n        \"KW\",\n        \"KY\",\n        \"KZ\",\n        \"LA\",\n        \"LB\",\n        \"LC\",\n        \"LI\",\n        \"LK\",\n        \"LR\",\n        \"LS\",\n        \"LT\",\n        \"LU\",\n        \"LV\",\n        \"LY\",\n        \"MA\",\n        \"MC\",\n        \"MD\",\n        \"ME\",\n        \"MF\",\n        \"MG\",\n        \"MH\",\n        \"MK\",\n        \"ML\",\n        \"MM\",\n        \"MN\",\n        \"MO\",\n        \"MP\",\n        \"MQ\",\n        \"MR\",\n        \"MS\",\n        \"MT\",\n        \"MU\",\n        \"MV\",\n        \"MW\",\n        \"MX\",\n        \"MY\",\n        \"MZ\",\n        \"NA\",\n        \"NC\",\n        \"NE\",\n        \"NF\",\n        \"NG\",\n        \"NI\",\n        \"NL\",\n        \"NO\",\n        \"NP\",\n        \"NR\",\n        \"NU\",\n        \"NZ\",\n        \"OM\",\n        \"PA\",\n        \"PE\",\n        \"PF\",\n        \"PG\",\n        \"PH\",\n        \"PK\",\n        \"PL\",\n        \"PM\",\n        \"PN\",\n        \"PR\",\n        \"PS\",\n        \"PT\",\n        \"PW\",\n        \"PY\",\n        \"QA\",\n        \"RE\",\n        \"RO\",\n        \"RS\",\n        \"RU\",\n        \"RW\",\n        \"SA\",\n        \"SB\",\n        \"SC\",\n        \"SD\",\n        \"SE\",\n        \"SG\",\n        \"SH\",\n        \"SI\",\n        \"SJ\",\n        \"SK\",\n        \"SL\",\n        \"SM\",\n        \"SN\",\n        \"SO\",\n        \"SR\",\n        \"SS\",\n        \"ST\",\n        \"SV\",\n        \"SX\",\n        \"SY\",\n        \"SZ\",\n        \"TC\",\n        \"TD\",\n        \"TF\",\n        \"TG\",\n        \"TH\",\n        \"TJ\",\n        \"TK\",\n        \"TL\",\n        \"TM\",\n        \"TN\",\n        \"TO\",\n        \"TR\",\n        \"TT\",\n        \"TV\",\n        \"TW\",\n        \"TZ\",\n        \"UA\",\n        \"UG\",\n        \"UM\",\n        \"US\",\n        \"UY\",\n        \"UZ\",\n        \"VA\",\n        \"VC\",\n        \"VE\",\n        \"VG\",\n        \"VI\",\n        \"VN\",\n        \"VU\",\n        \"WF\",\n        \"WS\",\n        \"XK\",\n        \"YE\",\n        \"YT\",\n        \"ZA\",\n        \"ZM\",\n        \"ZW\"\n      ],\n      \"enumTitles\": [\n        \"Andorra\",\n        \"United Arab Emirates\",\n        \"Afghanistan\",\n        \"Antigua and Barbuda\",\n        \"Anguilla\",\n        \"Albania\",\n        \"Armenia\",\n        \"Angola\",\n        \"Antarctica\",\n        \"Argentina\",\n        \"American Samoa\",\n        \"Austria\",\n        \"Australia\",\n        \"Aruba\",\n        \"Aland Islands\",\n        \"Azerbaijan\",\n        \"Bosnia and Herzegovina\",\n        \"Barbados\",\n        \"Bangladesh\",\n        \"Belgium\",\n        \"Burkina Faso\",\n        \"Bulgaria\",\n        \"Bahrain\",\n        \"Burundi\",\n        \"Benin\",\n        \"Saint Barthelemy\",\n        \"Bermuda\",\n        \"Brunei\",\n        \"Bolivia\",\n        \"Caribbean Netherlands\",\n        \"Brazil\",\n        \"Bahamas\",\n        \"Bhutan\",\n        \"Bouvet Island\",\n        \"Botswana\",\n        \"Belarus\",\n        \"Belize\",\n        \"Canada\",\n        \"Cocos Islands\",\n        \"Democratic Republic of the Congo\",\n        \"Central African Republic\",\n        \"Republic of the Congo\",\n        \"Switzerland\",\n        \"Cote d'Ivoire\",\n        \"Cook Islands\",\n        \"Chile\",\n        \"Cameroon\",\n        \"China\",\n        \"Colombia\",\n        \"Costa Rica\",\n        \"Cuba\",\n        \"Cape Verde\",\n        \"Curacao\",\n        \"Christmas Island\",\n        \"Cyprus\",\n        \"Czechia\",\n        \"Germany\",\n        \"Djibouti\",\n        \"Denmark\",\n        \"Dominica\",\n        \"Dominican Republic\",\n        \"Algeria\",\n        \"Ecuador\",\n        \"Estonia\",\n        \"Egypt\",\n        \"Western Sahara\",\n        \"Eritrea\",\n        \"Spain\",\n        \"Ethiopia\",\n        \"Finland\",\n        \"Fiji\",\n        \"Falkland Islands\",\n        \"Micronesia\",\n        \"Faroe Islands\",\n        \"France\",\n        \"Gabon\",\n        \"United Kingdom\",\n        \"Grenada\",\n        \"Georgia\",\n        \"French Guiana\",\n        \"Guernsey\",\n        \"Ghana\",\n        \"Gibraltar\",\n        \"Greenland\",\n        \"Gambia\",\n        \"Guinea\",\n        \"Guadeloupe\",\n        \"Equatorial Guinea\",\n        \"Greece\",\n        \"South Georgia and the South Sandwich Islands\",\n        \"Guatemala\",\n        \"Guam\",\n        \"Guinea-Bissau\",\n        \"Guyana\",\n        \"Hong Kong\",\n        \"Heard Island and McDonald Islands\",\n        \"Honduras\",\n        \"Croatia\",\n        \"Haiti\",\n        \"Hungary\",\n        \"Indonesia\",\n        \"Ireland\",\n        \"Israel\",\n        \"Isle of Man\",\n        \"India\",\n        \"British Indian Ocean Territory\",\n        \"Iraq\",\n        \"Iran\",\n        \"Iceland\",\n        \"Italy\",\n        \"Jersey\",\n        \"Jamaica\",\n        \"Jordan\",\n        \"Japan\",\n        \"Kenya\",\n        \"Kyrgyzstan\",\n        \"Cambodia\",\n        \"Kiribati\",\n        \"Comoros\",\n        \"Saint Kitts and Nevis\",\n        \"North Korea\",\n        \"South Korea\",\n        \"Kuwait\",\n        \"Cayman Islands\",\n        \"Kazakhstan\",\n        \"Laos\",\n        \"Lebanon\",\n        \"Saint Lucia\",\n        \"Liechtenstein\",\n        \"Sri Lanka\",\n        \"Liberia\",\n        \"Lesotho\",\n        \"Lithuania\",\n        \"Luxembourg\",\n        \"Latvia\",\n        \"Libya\",\n        \"Morocco\",\n        \"Monaco\",\n        \"Moldova\",\n        \"Montenegro\",\n        \"Saint Martin\",\n        \"Madagascar\",\n        \"Marshall Islands\",\n        \"North Macedonia\",\n        \"Mali\",\n        \"Myanmar\",\n        \"Mongolia\",\n        \"Macao\",\n        \"Northern Mariana Islands\",\n        \"Martinique\",\n        \"Mauritania\",\n        \"Montserrat\",\n        \"Malta\",\n        \"Mauritius\",\n        \"Maldives\",\n        \"Malawi\",\n        \"Mexico\",\n        \"Malaysia\",\n        \"Mozambique\",\n        \"Namibia\",\n        \"New Caledonia\",\n        \"Niger\",\n        \"Norfolk Island\",\n        \"Nigeria\",\n        \"Nicaragua\",\n        \"Netherlands\",\n        \"Norway\",\n        \"Nepal\",\n        \"Nauru\",\n        \"Niue\",\n        \"New Zealand\",\n        \"Oman\",\n        \"Panama\",\n        \"Peru\",\n        \"French Polynesia\",\n        \"Papua New Guinea\",\n        \"Philippines\",\n        \"Pakistan\",\n        \"Poland\",\n        \"Saint Pierre and Miquelon\",\n        \"Pitcairn Islands\",\n        \"Puerto Rico\",\n        \"Palestine\",\n        \"Portugal\",\n        \"Palau\",\n        \"Paraguay\",\n        \"Qatar\",\n        \"Reunion\",\n        \"Romania\",\n        \"Serbia\",\n        \"Russia\",\n        \"Rwanda\",\n        \"Saudi Arabia\",\n        \"Solomon Islands\",\n        \"Seychelles\",\n        \"Sudan\",\n        \"Sweden\",\n        \"Singapore\",\n        \"Saint Helena\",\n        \"Slovenia\",\n        \"Svalbard and Jan Mayen\",\n        \"Slovakia\",\n        \"Sierra Leone\",\n        \"San Marino\",\n        \"Senegal\",\n        \"Somalia\",\n        \"Suriname\",\n        \"South Sudan\",\n        \"Sao Tome and Principe\",\n        \"El Salvador\",\n        \"Sint Maarten\",\n        \"Syria\",\n        \"Eswatini\",\n        \"Turks and Caicos Islands\",\n        \"Chad\",\n        \"French Southern Territories\",\n        \"Togo\",\n        \"Thailand\",\n        \"Tajikistan\",\n        \"Tokelau\",\n        \"Timor-Leste\",\n        \"Turkmenistan\",\n        \"Tunisia\",\n        \"Tonga\",\n        \"Turkiye\",\n        \"Trinidad and Tobago\",\n        \"Tuvalu\",\n        \"Taiwan\",\n        \"Tanzania\",\n        \"Ukraine\",\n        \"Uganda\",\n        \"United States Minor Outlying Islands\",\n        \"United States\",\n        \"Uruguay\",\n        \"Uzbekistan\",\n        \"Vatican City\",\n        \"Saint Vincent and the Grenadines\",\n        \"Venezuela\",\n        \"British Virgin Islands\",\n        \"U.S. Virgin Islands\",\n        \"Vietnam\",\n        \"Vanuatu\",\n        \"Wallis and Futuna\",\n        \"Samoa\",\n        \"Kosovo\",\n        \"Yemen\",\n        \"Mayotte\",\n        \"South Africa\",\n        \"Zambia\",\n        \"Zimbabwe\"\n      ],\n      \"default\": \"US\",\n      \"prefill\": \"US\",\n      \"description\": \"ISO 3166-1 alpha-2 country used when resolving a human location. Use GB for London, CA for Toronto, and so on.\"\n    },\n    \"latitude\": {\n      \"title\": \"Latitude\",\n      \"type\": \"number\",\n      \"editor\": \"number\",\n      \"minimum\": -90,\n      \"maximum\": 90,\n      \"description\": \"Optional search center latitude. Provide longitude too.\"\n    },\n    \"longitude\": {\n      \"title\": \"Longitude\",\n      \"type\": \"number\",\n      \"editor\": \"number\",\n      \"minimum\": -180,\n      \"maximum\": 180,\n      \"description\": \"Optional search center longitude. Provide latitude too.\"\n    },\n    \"radiusKm\": {\n      \"title\": \"Radius (km)\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 65,\n      \"prefill\": 65,\n      \"description\": \"Search radius in kilometres for keyword or category search. URL mode keeps the radius in the URL unless you set this explicitly.\"\n    },\n    \"category\": {\n      \"title\": \"Category\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"vehicles\",\n        \"electronics\",\n        \"furniture\",\n        \"home\",\n        \"tools\",\n        \"sports\",\n        \"toys\",\n        \"appliances\",\n        \"jewelry\",\n        \"autoparts\",\n        \"garden\",\n        \"pets\",\n        \"books\",\n        \"shoes\",\n        \"games\",\n        \"motorcycles\",\n        \"boats\",\n        \"antiques\",\n        \"arts\",\n        \"health\",\n        \"cell-phones\",\n        \"computers\",\n        \"video-games\",\n        \"cameras\"\n      ],\n      \"enumTitles\": [\n        \"All categories\",\n        \"Vehicles\",\n        \"Electronics\",\n        \"Furniture\",\n        \"Home goods\",\n        \"Tools\",\n        \"Sporting goods\",\n        \"Toys and games\",\n        \"Appliances\",\n        \"Jewelry and watches\",\n        \"Auto parts\",\n        \"Garden and outdoor\",\n        \"Pet supplies\",\n        \"Books\",\n        \"Shoes\",\n        \"Games\",\n        \"Motorcycles\",\n        \"Boats\",\n        \"Antiques and collectibles\",\n        \"Arts and crafts\",\n        \"Health and beauty\",\n        \"Cell phones\",\n        \"Computers\",\n        \"Video games\",\n        \"Cameras\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"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.\"\n    },\n    \"categoryId\": {\n      \"title\": \"Category ID\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Advanced numeric Facebook category ID. Takes precedence over category when set.\"\n    },\n    \"sortBy\": {\n      \"title\": \"Sort Order\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"newest\",\n        \"oldest\",\n        \"price_asc\",\n        \"price_desc\",\n        \"distance\"\n      ],\n      \"enumTitles\": [\n        \"Relevance\",\n        \"Newest first\",\n        \"Oldest first\",\n        \"Price: low to high\",\n        \"Price: high to low\",\n        \"Distance (requires coordinates)\"\n      ],\n      \"default\": \"relevance\",\n      \"prefill\": \"relevance\",\n      \"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.\"\n    },\n    \"minPrice\": {\n      \"title\": \"Minimum Price\",\n      \"type\": \"number\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"description\": \"Only listings at or above this price. Rows without a price are dropped.\"\n    },\n    \"maxPrice\": {\n      \"title\": \"Maximum Price\",\n      \"type\": \"number\",\n      \"editor\": \"number\",\n      \"minimum\": 0,\n      \"description\": \"Only listings at or below this price. Rows without a price are dropped.\"\n    },\n    \"condition\": {\n      \"title\": \"Condition\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"new\",\n        \"used_like_new\",\n        \"used_good\",\n        \"used_fair\"\n      ],\n      \"enumTitles\": [\n        \"Any condition\",\n        \"New\",\n        \"Used: like new\",\n        \"Used: good\",\n        \"Used: fair\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\",\n      \"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.\"\n    },\n    \"deliveryMethod\": {\n      \"title\": \"Delivery Method\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"shipping\",\n        \"local\"\n      ],\n      \"enumTitles\": [\n        \"All methods\",\n        \"Shipping\",\n        \"Local pickup or meetup\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"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.\"\n    },\n    \"daysSinceListed\": {\n      \"title\": \"Listed Within (days)\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 365,\n      \"description\": \"Only listings created within this many days. Rows without a posting time are dropped.\"\n    },\n    \"availability\": {\n      \"title\": \"Availability\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"all\",\n        \"available\",\n        \"sold\",\n        \"pending\"\n      ],\n      \"enumTitles\": [\n        \"All listings\",\n        \"Available\",\n        \"Sold\",\n        \"Pending\"\n      ],\n      \"default\": \"all\",\n      \"prefill\": \"all\",\n      \"description\": \"Client-side status filter. Search feeds are mostly available; sold and pending are more common on direct item pages.\"\n    },\n    \"exactMatch\": {\n      \"title\": \"Exact Keyword Match\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Keep only rows whose title (and description in deep mode) contains every query word.\"\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum Listings\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 3,\n      \"description\": \"Global output limit across all sources.\"\n    },\n    \"maxItemsPerUrl\": {\n      \"title\": \"Maximum Listings Per URL\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 3,\n      \"description\": \"Per-source output limit.\"\n    },\n    \"maxPagesPerUrl\": {\n      \"title\": \"Maximum Pages Per URL\",\n      \"type\": \"integer\",\n      \"editor\": \"number\",\n      \"minimum\": 1,\n      \"maximum\": 500,\n      \"default\": 100,\n      \"prefill\": 1,\n      \"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.\"\n    },\n    \"scrapeMode\": {\n      \"title\": \"Scrape Mode\",\n      \"type\": \"string\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"fast\",\n        \"deep\",\n        \"auto\"\n      ],\n      \"enumTitles\": [\n        \"Fast (feed data only)\",\n        \"Deep (fetch each listing page)\",\n        \"Auto (deep only when details or photos are requested)\"\n      ],\n      \"default\": \"fast\",\n      \"prefill\": \"fast\",\n      \"description\": \"fast streams feed rows. deep fetches each listing page for description, condition, attributes, seller, coordinates, and photos. auto follows includeListingDetails and includeAllPhotos.\"\n    },\n    \"includeListingDetails\": {\n      \"title\": \"Include Listing Details\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Compatibility alias that enables deep mode unless scrapeMode=fast is explicit.\"\n    },\n    \"includeAllPhotos\": {\n      \"title\": \"Include All Photos\",\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"prefill\": false,\n      \"description\": \"Enables deep mode and adds the full photo gallery.\"\n    },\n    \"rehostImages\": {\n      \"title\": \"Rehost Images\",\n      \"type\": \"boolean\",\n      \"default\": true,\n      \"prefill\": false,\n      \"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.\"\n    },\n    \"deduplicateAcrossInputs\": {\n      \"title\": \"Deduplicate Across Inputs\",\n      \"type\": \"boolean\",\n      \"default\": true,\n      \"prefill\": true,\n      \"description\": \"Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs.\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy Configuration\",\n      \"type\": \"object\",\n      \"editor\": \"proxy\",\n      \"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.\"\n    }\n  }\n}",
    "readme": "# Facebook Marketplace Listing & Price Extractor\r\n\r\nExtract 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.\r\n\r\n## What this actor does\r\n\r\n- Scrapes keyword searches, city categories, global categories, city/location feeds, and direct item pages in one run.\r\n- Builds a Marketplace search from `searchQueries` + `location`, resolving city names, postal codes, and addresses server-side.\r\n- 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.\r\n- Reads feed rows in `fast` mode and fetches each listing page in `deep` mode for description, condition, attributes, seller, coordinates, gallery, and vehicle fields.\r\n- Applies price, condition, delivery, age, availability, category, and exact-keyword filters against the data each row actually carries.\r\n- 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`.\r\n- Empty fields are omitted: null, empty-string, empty-list, and empty-object values are never emitted. `0` and `false` are preserved.\r\n- 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.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `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. |\r\n| `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. |\r\n| `searchQueries` | array | `[]` | One to 20 keywords or phrases. Each query becomes one source. Legacy `searchQuery` is mapped in code. |\r\n| `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. |\r\n| `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. |\r\n| `latitude` | number | none | Optional search center latitude. Provide `longitude` too. Overrides `location` when both are set. |\r\n| `longitude` | number | none | Optional search center longitude. Provide `latitude` too. |\r\n| `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. |\r\n| `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. |\r\n| `categoryId` | string | none | Advanced numeric Facebook category ID. Takes precedence over `category`. |\r\n| `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. |\r\n| `minPrice` | number | none | Minimum price. Listings without a readable price are dropped when set. |\r\n| `maxPrice` | number | none | Maximum price. Listings without a readable price are dropped when set. |\r\n| `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. |\r\n| `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. |\r\n| `daysSinceListed` | integer | none | Only listings created within this many days (1–365). Rows without a posting time are dropped. |\r\n| `availability` | string | `all` | `all`, `available`, `sold`, or `pending`. Client-side over `is_live`/`is_sold`/`is_pending`. |\r\n| `exactMatch` | boolean | `false` | Keep only rows whose title (and description in deep mode) contains every query word. |\r\n| `maxItems` | integer | `50` | Global output limit across all sources (1–10000). |\r\n| `maxItemsPerUrl` | integer | `50` | Per-source output limit (1–10000). |\r\n| `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. |\r\n| `scrapeMode` | string | `fast` | `fast` streams feed rows. `deep` fetches each listing page for description, condition, attributes, seller, coordinates, and photos. `auto` follows `includeListingDetails`/`includeAllPhotos`. |\r\n| `includeListingDetails` | boolean | `false` | Compatibility alias that enables deep mode unless `scrapeMode` is explicitly `fast`. |\r\n| `includeAllPhotos` | boolean | `false` | Enables deep mode and emits the full photo gallery. |\r\n| `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`. |\r\n| `deduplicateAcrossInputs` | boolean | `true` | Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs. |\r\n| `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. |\r\n\r\n### Legacy inputs\r\n\r\n`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.\r\n\r\n## Output per listing\r\n\r\nEvery dataset row is one listing object. Empty values are omitted at every depth; consumers should treat a missing field as unknown rather than `null`.\r\n\r\n**Identity and provenance**\r\n\r\n- `id`, `title`, `listingUrl`, `sourceUrl`, `facebookUrl`\r\n- `sourceType` (`search`, `category`, `location`, or `direct-item`), `inputIndex`\r\n- `searchQuery`, `locationQueried`, `categoryQueried`\r\n- `recordType` (`listing`), `scrapedAt`\r\n\r\n**Core fields**\r\n\r\n- `price` — `{ amount, currency, formatted, amountWithOffset }`; `currency` is usually absent in fast feed rows and present in deep mode\r\n- `strikethroughPrice`, `description`, `condition`, `conditionLabel`\r\n- `attributes` — `{ name, value, label }` entries\r\n- `categoryId`, `categoryName`, `categorySlug`, `categoryPath`\r\n\r\n**Location**\r\n\r\n- `locationText`, `city`, `state`, `latitude`, `longitude`, `distanceKm` (when the radius filter ran and the listing has coordinates)\r\n\r\n**Delivery, status, and age**\r\n\r\n- `deliveryTypes`, `shippingAvailable`, `localPickupAvailable`\r\n- `creationTime`, `createdAt`, `listingAgeDays`\r\n- `isLive`, `isSold`, `isPending`, `isHidden`, `isViewerSeller`, `listingStatus`\r\n\r\n**Seller**\r\n\r\n- `seller` — `{ id, name, profileUrl, profilePictureUrl, rating, ratingCount, ratingsPrivate, dealer }`\r\n- `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.\r\n- `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.\r\n- `sellerDataAvailability` (`exposed` or `not_exposed`)\r\n\r\n**Media and vehicle**\r\n\r\n- `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.\r\n- `photos` — `{ id, url, width, height, caption }`; only when `includeAllPhotos` is enabled\r\n- `videoUrl`, `videos`\r\n- `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\r\n- `specs` — `{ gasMileageCity, gasMileageCombined, gasMileageHighway, safetyRatingFront, safetyRatingOverall, safetyRatingRollover, safetyRatingSide, safetyRatingSideBarrier, co2Emissions, engineSize, horsePower }`, each as `{ value, unit }` when present\r\n- `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.\r\n\r\n**Quality and access**\r\n\r\n- `dataMode` (`fast` or `deep`), `extractionSource`, `qualityStatus` (`complete` or `partial`)\r\n- `missingFields` — expected canonical fields that were absent\r\n- `accessState`, `detailFetchStatus` (deep/direct rows)\r\n\r\n**Facebook compatibility aliases**\r\n\r\nThe 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.\r\n\r\n## Example: daily prefill\r\n\r\n```json\r\n{\r\n  \"mode\": \"urls\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/nyc/search/?query=laptop\" }\r\n  ],\r\n  \"maxItems\": 3,\r\n  \"maxItemsPerUrl\": 3,\r\n  \"maxPagesPerUrl\": 1,\r\n  \"scrapeMode\": \"fast\",\r\n  \"includeListingDetails\": false,\r\n  \"includeAllPhotos\": false,\r\n  \"rehostImages\": false,\r\n  \"deduplicateAcrossInputs\": true\r\n}\r\n```\r\n\r\n## Example: keyword search by city\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQueries\": [\"laptop\", \"office chair\"],\r\n  \"location\": \"Austin, Texas\",\r\n  \"country\": \"US\",\r\n  \"radiusKm\": 40,\r\n  \"condition\": \"used_good\",\r\n  \"minPrice\": 50,\r\n  \"maxPrice\": 500,\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n## Example: deep detail scrape\r\n\r\n```json\r\n{\r\n  \"mode\": \"urls\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/nyc/electronics\" }\r\n  ],\r\n  \"scrapeMode\": \"deep\",\r\n  \"includeAllPhotos\": true,\r\n  \"maxItemsPerUrl\": 20\r\n}\r\n```\r\n\r\n## Example: direct item\r\n\r\n```json\r\n{\r\n  \"mode\": \"items\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/item/772594759027016/\" }\r\n  ],\r\n  \"includeAllPhotos\": true\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Price monitoring** — track asking prices for a product or category across cities over time.\r\n- **Resale and arbitrage** — scan multiple city feeds for underpriced items.\r\n- **Vehicle shopping** — pull vehicle listings by location, price range, and condition.\r\n- **Apartment hunting** — collect rental and furniture listings from several neighborhoods.\r\n- **Market research** — compare listing volume and pricing across regions.\r\n\r\n## Verified hard limits\r\n\r\nThese limits were measured in the Phase 6 research and are not configurable away:\r\n\r\n- **24 listings per search page.** `count` 24/50/100/250 all return 24; the cursor still advances.\r\n- **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.\r\n- **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.\r\n- **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.\r\n- **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\"`.\r\n- **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.\r\n- **Property rentals category is unsupported.** `/marketplace/<city>/propertyrentals` redirects without usable variables. Use a keyword search such as `query=apartment` as the workaround.\r\n- **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.\r\n\r\n## FAQ\r\n\r\n**Why did I get fewer rows than `maxItems`?**\r\n`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.\r\n\r\n**What is the difference between fast and deep mode?**\r\n`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.\r\n\r\n**Why is the seller or currency missing on some rows?**\r\nFacebook 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.\r\n\r\n**Does this need Facebook login or cookies?**\r\nNo. 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.\r\n\r\n**Do I need to configure a proxy?**\r\nNo. 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.\r\n\r\n**Why is the city feed capped at 20 listings?**\r\nFacebook'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.\r\n\r\n**How many listings can a search return?**\r\nSearch 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.\r\n\r\n**Do photo URLs expire?**\r\nFacebook 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`.\r\n\r\n**Is this affiliated with Facebook or Meta?**\r\nNo. This is an independent third-party actor that reads publicly accessible Facebook Marketplace pages. It is not affiliated with or endorsed by Meta.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "facebook-marketplace-listing-and-price-extractor",
      "title": "Facebook Marketplace Listing & Price Extractor",
      "description": "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.",
      "version": "1.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-playwright"
      },
      "input": {
        "title": "Facebook Marketplace Input",
        "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.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "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"
            ],
            "default": "auto",
            "prefill": "urls",
            "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."
          },
          "startUrls": {
            "title": "Marketplace URLs or Item IDs",
            "type": "array",
            "editor": "requestListSources",
            "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.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL",
                  "description": "A valid Facebook Marketplace URL or a listing ID in mode=items."
                }
              }
            },
            "prefill": [
              {
                "url": "https://www.facebook.com/marketplace/nyc/search/?query=laptop"
              }
            ],
            "example": [
              {
                "url": "https://www.facebook.com/marketplace/nyc/search/?query=laptop"
              }
            ]
          },
          "searchQueries": {
            "title": "Search Queries",
            "type": "array",
            "editor": "stringList",
            "description": "One to 20 keywords or phrases (mode=search or mode=auto without URLs). Each query becomes one source.",
            "default": [],
            "prefill": [
              "laptop"
            ],
            "example": [
              "laptop",
              "office chair"
            ]
          },
          "location": {
            "title": "Location",
            "type": "string",
            "editor": "textfield",
            "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.",
            "prefill": "nyc",
            "example": "Austin, Texas"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "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"
            ],
            "default": "US",
            "prefill": "US",
            "description": "ISO 3166-1 alpha-2 country used when resolving a human location. Use GB for London, CA for Toronto, and so on."
          },
          "latitude": {
            "title": "Latitude",
            "type": "number",
            "editor": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Optional search center latitude. Provide longitude too."
          },
          "longitude": {
            "title": "Longitude",
            "type": "number",
            "editor": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Optional search center longitude. Provide latitude too."
          },
          "radiusKm": {
            "title": "Radius (km)",
            "type": "integer",
            "editor": "number",
            "minimum": 1,
            "maximum": 500,
            "default": 65,
            "prefill": 65,
            "description": "Search radius in kilometres for keyword or category search. URL mode keeps the radius in the URL unless you set this explicitly."
          },
          "category": {
            "title": "Category",
            "type": "string",
            "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"
            ],
            "default": "all",
            "prefill": "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."
          },
          "categoryId": {
            "title": "Category ID",
            "type": "string",
            "editor": "textfield",
            "description": "Advanced numeric Facebook category ID. Takes precedence over category when set."
          },
          "sortBy": {
            "title": "Sort Order",
            "type": "string",
            "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)"
            ],
            "default": "relevance",
            "prefill": "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."
          },
          "minPrice": {
            "title": "Minimum Price",
            "type": "number",
            "editor": "number",
            "minimum": 0,
            "description": "Only listings at or above this price. Rows without a price are dropped."
          },
          "maxPrice": {
            "title": "Maximum Price",
            "type": "number",
            "editor": "number",
            "minimum": 0,
            "description": "Only listings at or below this price. Rows without a price are dropped."
          },
          "condition": {
            "title": "Condition",
            "type": "string",
            "editor": "select",
            "enum": [
              "any",
              "new",
              "used_like_new",
              "used_good",
              "used_fair"
            ],
            "enumTitles": [
              "Any condition",
              "New",
              "Used: like new",
              "Used: good",
              "Used: fair"
            ],
            "default": "any",
            "prefill": "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."
          },
          "deliveryMethod": {
            "title": "Delivery Method",
            "type": "string",
            "editor": "select",
            "enum": [
              "all",
              "shipping",
              "local"
            ],
            "enumTitles": [
              "All methods",
              "Shipping",
              "Local pickup or meetup"
            ],
            "default": "all",
            "prefill": "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."
          },
          "daysSinceListed": {
            "title": "Listed Within (days)",
            "type": "integer",
            "editor": "number",
            "minimum": 1,
            "maximum": 365,
            "description": "Only listings created within this many days. Rows without a posting time are dropped."
          },
          "availability": {
            "title": "Availability",
            "type": "string",
            "editor": "select",
            "enum": [
              "all",
              "available",
              "sold",
              "pending"
            ],
            "enumTitles": [
              "All listings",
              "Available",
              "Sold",
              "Pending"
            ],
            "default": "all",
            "prefill": "all",
            "description": "Client-side status filter. Search feeds are mostly available; sold and pending are more common on direct item pages."
          },
          "exactMatch": {
            "title": "Exact Keyword Match",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Keep only rows whose title (and description in deep mode) contains every query word."
          },
          "maxItems": {
            "title": "Maximum Listings",
            "type": "integer",
            "editor": "number",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 3,
            "description": "Global output limit across all sources."
          },
          "maxItemsPerUrl": {
            "title": "Maximum Listings Per URL",
            "type": "integer",
            "editor": "number",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 3,
            "description": "Per-source output limit."
          },
          "maxPagesPerUrl": {
            "title": "Maximum Pages Per URL",
            "type": "integer",
            "editor": "number",
            "minimum": 1,
            "maximum": 500,
            "default": 100,
            "prefill": 1,
            "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."
          },
          "scrapeMode": {
            "title": "Scrape Mode",
            "type": "string",
            "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)"
            ],
            "default": "fast",
            "prefill": "fast",
            "description": "fast streams feed rows. deep fetches each listing page for description, condition, attributes, seller, coordinates, and photos. auto follows includeListingDetails and includeAllPhotos."
          },
          "includeListingDetails": {
            "title": "Include Listing Details",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Compatibility alias that enables deep mode unless scrapeMode=fast is explicit."
          },
          "includeAllPhotos": {
            "title": "Include All Photos",
            "type": "boolean",
            "default": false,
            "prefill": false,
            "description": "Enables deep mode and adds the full photo gallery."
          },
          "rehostImages": {
            "title": "Rehost Images",
            "type": "boolean",
            "default": true,
            "prefill": false,
            "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."
          },
          "deduplicateAcrossInputs": {
            "title": "Deduplicate Across Inputs",
            "type": "boolean",
            "default": true,
            "prefill": true,
            "description": "Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs."
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "editor": "proxy",
            "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."
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Facebook Marketplace Listing & Price Extractor Output",
        "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": {
            "type": "string",
            "title": "Marketplace Listings Dataset",
            "description": "Default dataset containing one JSON object per Marketplace listing, including normalized canonical fields, legacy Facebook aliases, and source attribution.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# Facebook Marketplace Listing & Price Extractor\r\n\r\nExtract 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.\r\n\r\n## What this actor does\r\n\r\n- Scrapes keyword searches, city categories, global categories, city/location feeds, and direct item pages in one run.\r\n- Builds a Marketplace search from `searchQueries` + `location`, resolving city names, postal codes, and addresses server-side.\r\n- 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.\r\n- Reads feed rows in `fast` mode and fetches each listing page in `deep` mode for description, condition, attributes, seller, coordinates, gallery, and vehicle fields.\r\n- Applies price, condition, delivery, age, availability, category, and exact-keyword filters against the data each row actually carries.\r\n- 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`.\r\n- Empty fields are omitted: null, empty-string, empty-list, and empty-object values are never emitted. `0` and `false` are preserved.\r\n- 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.\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `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. |\r\n| `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. |\r\n| `searchQueries` | array | `[]` | One to 20 keywords or phrases. Each query becomes one source. Legacy `searchQuery` is mapped in code. |\r\n| `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. |\r\n| `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. |\r\n| `latitude` | number | none | Optional search center latitude. Provide `longitude` too. Overrides `location` when both are set. |\r\n| `longitude` | number | none | Optional search center longitude. Provide `latitude` too. |\r\n| `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. |\r\n| `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. |\r\n| `categoryId` | string | none | Advanced numeric Facebook category ID. Takes precedence over `category`. |\r\n| `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. |\r\n| `minPrice` | number | none | Minimum price. Listings without a readable price are dropped when set. |\r\n| `maxPrice` | number | none | Maximum price. Listings without a readable price are dropped when set. |\r\n| `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. |\r\n| `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. |\r\n| `daysSinceListed` | integer | none | Only listings created within this many days (1–365). Rows without a posting time are dropped. |\r\n| `availability` | string | `all` | `all`, `available`, `sold`, or `pending`. Client-side over `is_live`/`is_sold`/`is_pending`. |\r\n| `exactMatch` | boolean | `false` | Keep only rows whose title (and description in deep mode) contains every query word. |\r\n| `maxItems` | integer | `50` | Global output limit across all sources (1–10000). |\r\n| `maxItemsPerUrl` | integer | `50` | Per-source output limit (1–10000). |\r\n| `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. |\r\n| `scrapeMode` | string | `fast` | `fast` streams feed rows. `deep` fetches each listing page for description, condition, attributes, seller, coordinates, and photos. `auto` follows `includeListingDetails`/`includeAllPhotos`. |\r\n| `includeListingDetails` | boolean | `false` | Compatibility alias that enables deep mode unless `scrapeMode` is explicitly `fast`. |\r\n| `includeAllPhotos` | boolean | `false` | Enables deep mode and emits the full photo gallery. |\r\n| `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`. |\r\n| `deduplicateAcrossInputs` | boolean | `true` | Emit each listing ID once across sources. Disable to preserve repeats from repeated input URLs. |\r\n| `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. |\r\n\r\n### Legacy inputs\r\n\r\n`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.\r\n\r\n## Output per listing\r\n\r\nEvery dataset row is one listing object. Empty values are omitted at every depth; consumers should treat a missing field as unknown rather than `null`.\r\n\r\n**Identity and provenance**\r\n\r\n- `id`, `title`, `listingUrl`, `sourceUrl`, `facebookUrl`\r\n- `sourceType` (`search`, `category`, `location`, or `direct-item`), `inputIndex`\r\n- `searchQuery`, `locationQueried`, `categoryQueried`\r\n- `recordType` (`listing`), `scrapedAt`\r\n\r\n**Core fields**\r\n\r\n- `price` — `{ amount, currency, formatted, amountWithOffset }`; `currency` is usually absent in fast feed rows and present in deep mode\r\n- `strikethroughPrice`, `description`, `condition`, `conditionLabel`\r\n- `attributes` — `{ name, value, label }` entries\r\n- `categoryId`, `categoryName`, `categorySlug`, `categoryPath`\r\n\r\n**Location**\r\n\r\n- `locationText`, `city`, `state`, `latitude`, `longitude`, `distanceKm` (when the radius filter ran and the listing has coordinates)\r\n\r\n**Delivery, status, and age**\r\n\r\n- `deliveryTypes`, `shippingAvailable`, `localPickupAvailable`\r\n- `creationTime`, `createdAt`, `listingAgeDays`\r\n- `isLive`, `isSold`, `isPending`, `isHidden`, `isViewerSeller`, `listingStatus`\r\n\r\n**Seller**\r\n\r\n- `seller` — `{ id, name, profileUrl, profilePictureUrl, rating, ratingCount, ratingsPrivate, dealer }`\r\n- `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.\r\n- `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.\r\n- `sellerDataAvailability` (`exposed` or `not_exposed`)\r\n\r\n**Media and vehicle**\r\n\r\n- `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.\r\n- `photos` — `{ id, url, width, height, caption }`; only when `includeAllPhotos` is enabled\r\n- `videoUrl`, `videos`\r\n- `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\r\n- `specs` — `{ gasMileageCity, gasMileageCombined, gasMileageHighway, safetyRatingFront, safetyRatingOverall, safetyRatingRollover, safetyRatingSide, safetyRatingSideBarrier, co2Emissions, engineSize, horsePower }`, each as `{ value, unit }` when present\r\n- `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.\r\n\r\n**Quality and access**\r\n\r\n- `dataMode` (`fast` or `deep`), `extractionSource`, `qualityStatus` (`complete` or `partial`)\r\n- `missingFields` — expected canonical fields that were absent\r\n- `accessState`, `detailFetchStatus` (deep/direct rows)\r\n\r\n**Facebook compatibility aliases**\r\n\r\nThe 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.\r\n\r\n## Example: daily prefill\r\n\r\n```json\r\n{\r\n  \"mode\": \"urls\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/nyc/search/?query=laptop\" }\r\n  ],\r\n  \"maxItems\": 3,\r\n  \"maxItemsPerUrl\": 3,\r\n  \"maxPagesPerUrl\": 1,\r\n  \"scrapeMode\": \"fast\",\r\n  \"includeListingDetails\": false,\r\n  \"includeAllPhotos\": false,\r\n  \"rehostImages\": false,\r\n  \"deduplicateAcrossInputs\": true\r\n}\r\n```\r\n\r\n## Example: keyword search by city\r\n\r\n```json\r\n{\r\n  \"mode\": \"search\",\r\n  \"searchQueries\": [\"laptop\", \"office chair\"],\r\n  \"location\": \"Austin, Texas\",\r\n  \"country\": \"US\",\r\n  \"radiusKm\": 40,\r\n  \"condition\": \"used_good\",\r\n  \"minPrice\": 50,\r\n  \"maxPrice\": 500,\r\n  \"maxItems\": 100\r\n}\r\n```\r\n\r\n## Example: deep detail scrape\r\n\r\n```json\r\n{\r\n  \"mode\": \"urls\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/nyc/electronics\" }\r\n  ],\r\n  \"scrapeMode\": \"deep\",\r\n  \"includeAllPhotos\": true,\r\n  \"maxItemsPerUrl\": 20\r\n}\r\n```\r\n\r\n## Example: direct item\r\n\r\n```json\r\n{\r\n  \"mode\": \"items\",\r\n  \"startUrls\": [\r\n    { \"url\": \"https://www.facebook.com/marketplace/item/772594759027016/\" }\r\n  ],\r\n  \"includeAllPhotos\": true\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Price monitoring** — track asking prices for a product or category across cities over time.\r\n- **Resale and arbitrage** — scan multiple city feeds for underpriced items.\r\n- **Vehicle shopping** — pull vehicle listings by location, price range, and condition.\r\n- **Apartment hunting** — collect rental and furniture listings from several neighborhoods.\r\n- **Market research** — compare listing volume and pricing across regions.\r\n\r\n## Verified hard limits\r\n\r\nThese limits were measured in the Phase 6 research and are not configurable away:\r\n\r\n- **24 listings per search page.** `count` 24/50/100/250 all return 24; the cursor still advances.\r\n- **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.\r\n- **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.\r\n- **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.\r\n- **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\"`.\r\n- **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.\r\n- **Property rentals category is unsupported.** `/marketplace/<city>/propertyrentals` redirects without usable variables. Use a keyword search such as `query=apartment` as the workaround.\r\n- **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.\r\n\r\n## FAQ\r\n\r\n**Why did I get fewer rows than `maxItems`?**\r\n`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.\r\n\r\n**What is the difference between fast and deep mode?**\r\n`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.\r\n\r\n**Why is the seller or currency missing on some rows?**\r\nFacebook 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.\r\n\r\n**Does this need Facebook login or cookies?**\r\nNo. 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.\r\n\r\n**Do I need to configure a proxy?**\r\nNo. 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.\r\n\r\n**Why is the city feed capped at 20 listings?**\r\nFacebook'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.\r\n\r\n**How many listings can a search return?**\r\nSearch 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.\r\n\r\n**Do photo URLs expire?**\r\nFacebook 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`.\r\n\r\n**Is this affiliated with Facebook or Meta?**\r\nNo. This is an independent third-party actor that reads publicly accessible Facebook Marketplace pages. It is not affiliated with or endorsed by Meta.\r\n",
      "dockerfile": "../Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Facebook Marketplace Listings",
          "views": {
            "overview": {
              "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"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "state": {
                    "label": "State",
                    "format": "text"
                  },
                  "locationText": {
                    "label": "Location",
                    "format": "text"
                  },
                  "condition": {
                    "label": "Condition",
                    "format": "text"
                  },
                  "deliveryTypes": {
                    "label": "Delivery",
                    "format": "text"
                  },
                  "seller": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "primaryPhotoUrl": {
                    "label": "Photo",
                    "format": "link"
                  },
                  "sourceUrl": {
                    "label": "Input Source",
                    "format": "link"
                  },
                  "sourceType": {
                    "label": "Source Type",
                    "format": "text"
                  },
                  "qualityStatus": {
                    "label": "Quality",
                    "format": "text"
                  },
                  "accessState": {
                    "label": "Access State",
                    "format": "text"
                  },
                  "marketplace_listing_seller": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "listingUrl": {
                    "label": "Listing URL",
                    "format": "link"
                  }
                }
              }
            },
            "detailed": {
              "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"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "id": {
                    "label": "ID",
                    "format": "text"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "state": {
                    "label": "State",
                    "format": "text"
                  },
                  "sourceUrl": {
                    "label": "Input Source",
                    "format": "link"
                  },
                  "sourceType": {
                    "label": "Source Type",
                    "format": "text"
                  },
                  "extractionSource": {
                    "label": "Extraction Source",
                    "format": "text"
                  },
                  "qualityStatus": {
                    "label": "Quality",
                    "format": "text"
                  },
                  "accessState": {
                    "label": "Access State",
                    "format": "text"
                  },
                  "marketplace_listing_title": {
                    "label": "Facebook Title",
                    "format": "text"
                  },
                  "listing_price": {
                    "label": "Facebook Price",
                    "format": "text"
                  },
                  "location": {
                    "label": "Location",
                    "format": "text"
                  },
                  "is_sold": {
                    "label": "Sold",
                    "format": "text"
                  },
                  "is_pending": {
                    "label": "Pending",
                    "format": "text"
                  },
                  "is_live": {
                    "label": "Live",
                    "format": "text"
                  },
                  "marketplace_listing_seller": {
                    "label": "Seller",
                    "format": "text"
                  },
                  "delivery_types": {
                    "label": "Delivery",
                    "format": "text"
                  },
                  "marketplace_listing_category_id": {
                    "label": "Category ID",
                    "format": "text"
                  },
                  "primary_listing_photo": {
                    "label": "Photo",
                    "format": "text"
                  },
                  "listing_video": {
                    "label": "Video",
                    "format": "text"
                  },
                  "redacted_description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "listingUrl": {
                    "label": "Listing URL",
                    "format": "link"
                  },
                  "facebookUrl": {
                    "label": "Facebook URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "25c21821fc66418d722b1c8600600b94b54a6e4bd033cec3028814df65ab012b",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.010322222222222222
    }
  }
}