Incollect Dealer & Listing Scraper avatar

Incollect Dealer & Listing Scraper

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Incollect Dealer & Listing Scraper

Incollect Dealer & Listing Scraper

Scrape Incollect.com fine-art, decorative-arts, furniture, and jewelry listings from vetted dealers (price, dimensions, images, dealer link) and dealer/professional profiles (bio, address, tracked inventory), with built-in delta mode. No login required.

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Artsiom Kunitsyn

Artsiom Kunitsyn

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

incollect-scraper

Scrapes both listings (fine art, furniture & lighting, decorative arts, and jewelry pieces from vetted dealers โ€” price, dimensions, images, and a dealer link) and dealer/professional profiles from Incollect.com, a US-based marketplace for fine art, antiques, and high-end design sourced from vetted dealers. No login required.

Contents

๐Ÿ”‘ Key features

  • Two entity types, one Actor. Set entityType to listings or dealers.
  • Choose which categories to include. Set categories to one or more of the site's real top-level categories (Fine Art, Furniture & Lighting, Decorative Arts, Jewelry) to filter the results, or leave it empty to include all 4. This is a real discovery-level filter โ€” a non-matching category is never fetched at all.
  • A real per-dealer inventory rollup, fed as your listings runs go. Dealer profiles report a tracked_listing_count/tracked_categories accumulated from every listings run over time โ€” genuine numbers, honestly labeled as "tracked so far", not a capped or guessed total.
  • Real dealer bio, full postal address, and logo โ€” read from each dealer's own page, not approximated from listing text.
  • Delta mode built in for listings. Every run classifies each item as new, changed, unchanged, or delisted against a persisted baseline โ€” pay for what changed, not a full re-scrape every time.
  • maxItems defaults to 50 โ€” a fast, cheap preview, and what keeps an unconfigured run within Apify's automated 5-minute QA check. Clear it (null) for a full crawl, or narrow categories instead.
  • No proxy needed. A real burst test (up to 100 concurrent requests from a single IP) found no IP-based rate limiting at all โ€” see the FAQ.

๐Ÿ“‹ Output

One dataset item per listing or dealer, depending on entityType โ€” see .actor/dataset_schema.json for the full field list.

Example listing record:

{
"source": "incollect",
"entity_type": "listings",
"external_id": "177922",
"url": "https://www.incollect.com/listings/fine-art/sculpture/alex-katz-maine-cow-177922",
"category": "fine-art",
"subcategory": "sculpture",
"name": "Maine Cow",
"maker_name": "Alex Katz",
"width_value": 72.5,
"width_unit": "INH",
"height_value": 49,
"height_unit": "INH",
"depth_value": 10.25,
"depth_unit": "INH",
"currency": "USD",
"price": null,
"price_on_request": true,
"dealer_name": "RoGallery",
"dealer_url": "https://www.incollect.com/node/144054",
"change_type": "new"
}

Example dealer record:

{
"source": "incollect",
"entity_type": "dealers",
"external_id": "rogallery",
"url": "https://www.incollect.com/professionals/dealers/rogallery",
"name": "RoGallery",
"city": "Long Island City, NY",
"region": "New York",
"country": "United States",
"tracked_listing_count": 14,
"tracked_categories": ["fine-art"]
}

๐Ÿ”ง Input

FieldTypeDefaultDescription
entityTypestringlistingslistings or dealers.
categoriesarrayโ€”Listings only. Only crawl these categories (real discovery-level filter). Leave empty for all 4.
startUrlsarrayโ€”Listings only. Specific listing URLs to scrape directly instead of the normal category-driven discovery.
maxItemsinteger50Stop after pushing this many items. Set to null for a full crawl.
modestringautoListings only. auto / full / incremental โ€” see Incremental mode.
concurrencyinteger25How many pages to fetch in parallel.
impersonatestringchromecurl_cffi TLS-impersonation target.
proxyConfigurationobjectoffApify Proxy config โ€” see FAQ for why this isn't needed by default.

๐Ÿ“ฅ Input examples

Default preview (50 listings):

{ "entityType": "listings" }

Every fine-art listing:

{ "entityType": "listings", "categories": ["fine-art"], "maxItems": null }

Dealer profiles (with tracked inventory):

{ "entityType": "dealers", "maxItems": null }

๐Ÿ” Incremental (delta) mode

auto mode does a full scan the first time it runs for a given categories scope, then only pushes new/changed items on later runs โ€” including price changes (price/price_on_request/currency are the watched fields). Only an uncapped run using the same categories selection each time (no maxItems limit reached, no startUrls, no item errors) can detect delistings or update the baseline. entityType: "dealers" has no delta mode โ€” every run is a full live snapshot of the currently-known dealer set.

โ“ FAQ

Why does tracked_listing_count grow over multiple runs instead of showing a fixed total? Incollect's own dealer directory only reveals about a dozen of its 560 real dealers without going through the site's own AJAX-loaded pagination. Rather than block on that, dealer inventory counts are accumulated honestly from your own listings runs over time โ€” the more of the catalog you've crawled, the more complete these numbers get. A brand-new account with no prior listings runs still gets a real (if smaller) starting set from a static directory seed.

Does this need a proxy? No. A real burst test (20 โ†’ 50 โ†’ 100 concurrent single-IP requests, no proxy) against live listing pages came back 100% clean 200/404 responses โ€” the site's declared Crawl-delay: 10 in robots.txt is the stock, unenforced Drupal boilerplate, not a real rate limit.

How does discovery work? Via the site's own internal landing-page API (/listing/ajax_get_landing_page_data) โ€” the same one its own category browse pages use, confirmed unauthenticated and reliable. Each selected category is paginated independently with a real item count, so results are both fast and accurate โ€” no dead-link guessing involved.

Why is price sometimes null even though price_on_request is false... or the reverse? A listing with no visible price on the site reports price: null, price_on_request: true โ€” this is read directly from the page, never guessed. A genuine $0 price does not occur on this site.

What does dealer_url on a listing point to? The dealer's stable internal link as found directly on the listing page โ€” it redirects to that dealer's full public profile page. entityType: "dealers" resolves and reports the canonical, human-readable profile URL instead.