Property data is spread across agency websites, regional portals, rental platforms and local classifieds. Most don't offer an API, and the big portals restrict access to theirs. If you're building a rental alert service, comparing listings for clients, or tracking prices in a neighbourhood, you usually end up with a scraper per site and a lot of maintenance.
PulpMiner turns a public listings page into an API-key protected JSON endpoint. You decide the fields (price, address, bedrooms, bathrooms, area, status, link), and each call returns what's on the page right now.
Use cases
- Rental and property alert tools: watch search-result pages and notify users about new listings.
- Agents and brokers: pull listings from partner agency websites into one comparison sheet or CRM.
- Investors and analysts: track asking prices and availability in specific areas over time.
- Relocation and property-management teams: monitor a shortlist of buildings or agencies.
How to set it up
- Paste a listings page URL. A search-results page gives you many properties per call. A single listing page gives you more detail per property.
- Turn on JS rendering. Most property sites load results and maps with JavaScript.
- Focus the extraction. Add a CSS selector around the results list and a rule like "Extract every listing with price as a number, currency, address, bedrooms, bathrooms, floor area, status and listing URL."
- Edit the schema. Keep units explicit (for example
areaSqm), and makepricenumeric. - Make the search dynamic. If the city, area or page number is in the URL, turn it into a variable, such as
https://homes.example.com/rent/{{ city }}?page={{ page }}. - Save as API and call it on a schedule.


Example: rental search results as JSON
The endpoint is saved with URL template https://homes.example.com/rent/{{ city }}?page={{ page }} and API ID 9090:
curl -X POST \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"city": "utrecht", "page": "1"}' \
https://api.pulpminer.com/external/9090{
"data": {
"listings": [
{ "title": "2-room apartment, Oudegracht", "price": 1650, "currency": "EUR", "period": "month", "bedrooms": 1, "areaSqm": 54, "status": "available", "url": "https://homes.example.com/l/88123" },
{ "title": "Family house with garden", "price": 2400, "currency": "EUR", "period": "month", "bedrooms": 3, "areaSqm": 112, "status": "under offer", "url": "https://homes.example.com/l/88124" }
]
},
"errors": null
}Building a new-listing alert
- Call the search endpoint on a schedule.
- Use each listing's
urlas the key and store what you've seen. - Notify on new keys, and optionally on price changes for keys you already have.
n8n: Schedule Trigger → PulpMiner (POST, {"city": "utrecht", "page": "1"}) → Code (diff against stored IDs) → Telegram/Slack/Email.
Zapier: Schedule by Zapier → PulpMiner "Use a POST API" → Filter → Email or SMS.
Google Sheets: paste a column of listing URLs into the PulpMiner add-on and compare them side by side.
Be careful with these
- Portal terms. Several large property portals explicitly prohibit scraping. Prefer agency-owned sites and portals that allow it, and check the terms and robots policy before collecting data.
- Personal data. Listings can include agent or landlord names and phone numbers. Only extract what you need, and handle personal data according to the laws that apply to you (for example GDPR in the EU and the DPDP Act in India).
- Public pages only. Saved searches and listings behind a login aren't supported.
- LLM-driven extraction. Validate prices and IDs before you alert users. A wrong price alert costs more trust than a missed one.
- Rate. Keep schedules reasonable. Checking every few minutes is rarely needed and costs credits on every call.
Pricing
| Action | Credits | With JS rendering |
|---|---|---|
| Generate the schema | 0.25 | 0.35 |
| Each call (one results page) | 0.4 | 0.5 |
Most property sites need JS rendering, so plan on 0.5 credits per call. Checking one search page every hour is about 360 credits a month. Credits are pay-as-you-go, never expire, and there's no subscription. Packs start at $30 for 600 credits. New accounts get 5 free credits, no card needed.
FAQ
Can it handle map-based or infinite-scroll results?
It extracts what the rendered page shows. Results behind "load more" or map interactions may not all be present. Prefer URL-based pagination where the site offers it.
Can I track price changes on a single listing?
Yes. Create an endpoint for the listing page, with the listing ID as a URL variable, and store the price each time you call it.
Does caching help with frequent checks?
Caching can return data up to 15 minutes old for faster responses. Per the docs it doesn't lower the credit cost per request, and for alerts you usually want it off.
Can I get the data into a spreadsheet?
Yes. Use the Google Sheets add-on, or send results to Sheets or Airtable through n8n or Zapier.
Is a free trial available?
New accounts get 5 free credits, no card needed. That's enough to set up one search endpoint and test it.
