Bilbasen Scraper — Denmark Cars, EV Battery & Dealers avatar

Bilbasen Scraper — Denmark Cars, EV Battery & Dealers

Pricing

from $2.40 / 1,000 results

Go to Apify Store
Bilbasen Scraper — Denmark Cars, EV Battery & Dealers

Bilbasen Scraper — Denmark Cars, EV Battery & Dealers

Bilbasen.dk scraper for Denmark's car market. One row per car with numeric specs, battery kWh, WLTP range, consumption, the fitted-equipment list, full-resolution photos, and the dealer block with CVR and phone. Price banding gets past the site's 3,000-ad page wall to the whole market.

Pricing

from $2.40 / 1,000 results

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Turn any Bilbasen search into clean, structured data. Denmark's largest car marketplace, one flat row per car: the full spec record as numbers rather than Danish text, the fitted-equipment list, every photo at full resolution, the dealer's block down to their CVR number, and the phone number the ad page only shows behind a button.

How the Bilbasen Scraper works

✨ Why use this scraper

  • Figures, not display strings — the site prints 35.000 km, 74,0 kWh and Rækkevidde 461 km. The row carries 35000, 74 and 461, so a Danish dataset merges with any other market without cleanup.
  • Past the 3 000-ad wall — bilbasen stops paginating at 100 pages of 30, however many cars match. A search larger than that is sliced into price bands and reassembled, so the electric dealer segment comes back whole at 16 741 rather than capped at 3 000.
  • The phone number the ad hides — an ad page reports phoneNumberType: DynamicVirtual and no number. It is read from the dealer's own page instead, once per dealer and cached, so 86 fetches covered 120 ads.
  • A short run says so — every band is compared against the site's own count, and a run that comes up short ends FAILED with the shortfall recorded. You never get a half dataset that looks complete.
  • One browser solve, then plain HTTP — the AWS WAF challenge is solved once and the token carries the rest of the run, so you are not paying for a browser per ad.

🎯 Use cases

WhoWhat for
EV analystTrack used electric prices against battery capacity, range and real consumption
Dealer groupWatch competitors' stock, pricing and how many cars each one lists
Lead generationA dealer directory with address, CVR, website and phone, built from live stock
Price monitoringFollow a model's asking price across the whole Danish market
Market researchSegment by body type, drivetrain, model year or price band

📥 Supported inputs

  • A search URL — https://www.bilbasen.dk/brugt/bil?fuel=3&sellertypes=dealer
  • A direct ad URL — https://www.bilbasen.dk/brugt/bil/bmw/ix3/charged-m-sport-5d/6926237
  • No URL at all: set make, model, price, year, fuel or dealers-only and the search is built for you

⚙️ How it works

Every bilbasen page sits behind an AWS WAF JavaScript challenge. A browser solves it once, and the resulting token is handed to a plain HTTP client for the rest of the run, re-solved only when it expires.

A search is planned before it is crawled. The site's own hits count is probed for the whole query and for each candidate price band, and any band still over the ceiling is halved until it fits — so the ladder is measured rather than hand-written, and keeps working as the market grows.

Each ad's own page is then read for everything the search payload cannot give. The whole listing sits in one _props JSON object, which is parsed once rather than scanned with regexes, and every figure is taken from a known path inside it.

⚙️ Input parameters

FieldTypeDefaultNotes
startUrlsarray—Search or ad URLs
make / modelstring—Builds the search path
priceFrom / priceTointeger—DKK. Pinning a range turns price banding off
yearFrom / yearTointeger—Model year
fuelTypeenum—Petrol, Diesel, Electric, the hybrids
dealersOnlybooleanfalseTrade sellers only
includeDetailsbooleantrueOff returns ids and URLs only
scrapePhonebooleantrueOne extra fetch per dealer, not per car
enrichEmailsbooleanfalseLook up each dealer's email on their own site
maxItemsinteger1000Always set it — the EV dealer search alone runs to 16 741
maxConcurrencyinteger5Ad pages fetched at once
failOnIncompletebooleantrueFail rather than return a short dataset
completenessTolerancePercentinteger1The larger of this and the absolute tolerance applies
completenessToleranceAbsoluteinteger25Covers ads added and removed mid-run

📊 Output overview

One row per car. Nested objects keep related values together: price carries the amount and currency, dealer the whole seller block, location the point.

📦 Output sample

{
"adId": 6926237,
"url": "https://www.bilbasen.dk/brugt/bil/bmw/ix3/charged-m-sport-5d/6926237",
"title": "BMW iX3 Charged M-Sport 5d",
"make": "BMW",
"model": "iX3",
"variant": "Charged M-Sport 5d",
"modelYear": 2023,
"bodyType": "SUV",
"price": { "amount": 389900, "currency": "DKK" },
"priceType": "Kontantpris",
"newPriceDkk": 524720,
"mileageKm": 35000,
"firstRegistered": "2023-09",
"fuel": "El",
"batteryCapacityKwh": 74,
"rangeKm": 461,
"consumptionWhPerKm": 185,
"chargingTimeDc1080Min": 28,
"powerHp": 286,
"torqueNm": 400,
"accelerationSec": 6.8,
"topSpeedKmh": 180,
"colour": "Carbonsortmetal",
"periodicTaxDkk": 920,
"equipment": ["19 tommer Alufælge", "3 zone klima", "Adaptiv fartpilot"],
"imageUrls": ["https://billeder.bilbasen.dk/bilinfo/a4258f06-….jpeg?class=S1600X1600"],
"hasVideo": true,
"dealer": {
"id": 1956,
"name": "Bayern AutoGroup Odense A/S",
"type": "Dealer",
"street": "Sivmosevænget 1",
"zipCode": 5260,
"city": "Odense S",
"website": "https://www.bag.dk/brugte-biler",
"cvr": "26038561",
"listingCount": 37,
"profileUrl": "https://www.bilbasen.dk/find-en-forhandler/bilforhandler--id1956"
},
"phone": "63132736",
"location": { "lat": 55.353703, "lon": 10.403891, "zipCode": 5260, "city": "Odense S", "region": "Fyn" }
}

🗂 Key output fields

FieldWhat it holds
adId / urlThe site's own id and the canonical ad URL
make / model / variant / modelYear / bodyTypeWhat the car is
price{ amount, currency } in DKK, with priceType naming the basis
newPriceDkkList price when new, where the ad states it
mileageKmOdometer as a number
firstRegistered / producedAtYYYY-MM; the site publishes month precision, never a day
batteryCapacityKwh / rangeKm / consumptionWhPerKmPack size, WLTP range, and real consumption
chargingAcKw / chargingDcKw / chargingTimeDc1080MinCharging figures, where the ad fills them in
powerHp / torqueNmBoth halves of the ad's 286 hk/400 nm
equipmentEvery fitted extra the ad lists, in the site's own wording
imageUrlsEvery gallery photo at S1600X1600 (1600×1066), in the ad's order. No dealer logos, no video stills
dealer{ id, name, type, street, zipCode, city, website, cvr, listingCount, profileUrl }
phoneThe dealer's number, read from their own page
contactEmailThe dealer's email, when enrichEmails ran. contactWebsite names the site it came from
location{ lat, lon, zipCode, city, region } to six decimals
searchMatchCountWhat the site reported for the search this row came from

❓ FAQ

How often are the fields actually populated? Measured over 120 electric dealer ads from 80 dealers in October 2026: price, title, model year, mileage, first registration, battery capacity, range, power, body type, description, equipment, phone, the dealer's CVR and listing count, and the point all at 100%. Consumption 99%, photos 96% (median 18 per ad), dealer website 94%, colour 92%, torque 88%, new price 58%, AC charging 49%, DC charging 46%, DC charge time 8%, production date 2%. Where a field is empty it is empty on the site too.

Why are the charging figures so patchy? Because bilbasen prints a dash for them on about half the ads. The fields exist on every ad page; most sellers leave them unfilled. Battery capacity and range, which are the figures that matter for an EV, come through on every car.

Why does a big search take price bands? The site serves at most 100 pages of 30 ads for any one query and then simply stops, with no error. The electric dealer segment reports 16 741 ads, so without banding you would get 3 000 of them and no sign that the rest existed. The run probes the site's own count per band and halves any band that still will not fit; on the EV dealer search that came to 12 bands whose counts summed to exactly the 16 741 reported.

Can I turn banding off? Pin priceFrom/priceTo yourself and the search is crawled as given — widening a range the caller chose would change their query.

Can I get the dealers' email addresses? Switch on enrichEmails. Each dealer's own website is read once per run, however many cars they list, and the best address found is written to contactEmail. Measured on 76 Danish dealers in October 2026: 59 published a usable address, 78%. A lookup that finds nothing costs nothing, and a dealer is charged once rather than once per car.

Why is there no equipment on some rows? There is. Equipment came back on all 120 ads measured, a median of 39 entries and up to 72.

💬 Support

Issues and feature requests go to the Issues tab on the actor's page.

🤖 For AI Agents & LLM Apps

Purpose: scrape bilbasen.dk, Denmark's largest car marketplace, into one flat row per car, including numeric EV figures, the fitted-equipment list, the dealer block and the revealed phone number.

Output fields: adId, url, title, make, model, variant, modelYear, bodyType, price {amount, currency}, priceType, newPriceDkk, mileageKm, firstRegistered, producedAt, fuel, batteryCapacityKwh, rangeKm, consumptionWhPerKm, chargingAcKw, chargingDcKw, chargingTimeDc1080Min, powerHp, torqueNm, accelerationSec, topSpeedKmh, towWeightKg, weightKg, bootLiters, doors, colour, periodicTaxDkk, description, equipment, imageUrls, hasVideo, dealer {id, name, type, street, zipCode, city, website, cvr, listingCount, profileUrl}, phone, contactEmail, contactWebsite, emailEnrichment, location {lat, lon, zipCode, city, region}, searchMatchCount, detailScraped, sourceUrl, scrapedAt.

Behaviours an agent should know:

  • Always set maxItems — the electric dealer search alone runs to 16 741 cars.
  • Prices are DKK. priceFrom/priceTo switch off automatic price banding.
  • firstRegistered and producedAt are YYYY-MM, not full dates.
  • A run that cannot reach the site's reported count ends FAILED by design; set failOnIncomplete: false if a partial dataset is acceptable.
  • scrapePhone costs one request per dealer, not per car, so leaving it on is cheap on a large run.
  • enrichEmails is off by default and billed per address found, not per car.

⚠️ Disclaimer

This scraper collects only publicly available information from bilbasen.dk. It does not log in, bypass any paywall, or collect personal data beyond the business contact details that sellers publish on their own listings. You are responsible for using the output in line with bilbasen.dk's terms and with applicable law, including GDPR where the data concerns identifiable people. Dealer contact details are published by the dealers themselves for the purpose of being contacted about their stock.

SEO Keywords

bilbasen scraper, bilbasen.dk api, denmark car scraper, danish used car data, bilbasen listings export, scrape danish car marketplace, denmark ev listings, electric car data denmark, bilbasen dealer data, danish car dealer leads, cvr lookup cars, bilbasen price monitoring, used car data denmark, car listings json denmark, bilbasen phone numbers, danish vehicle specifications, ev battery capacity denmark, wltp range data, car market analysis denmark, bilbasen bulk export