DBA.dk Scraper
DBA.dk, short for Den Blå Avis, is where Danish second-hand goods have been listed since the newspaper era, and its krone stays pegged to the euro, so a...
DBA.dk, short for Den Blå Avis, is where Danish second-hand goods have been listed since the newspaper era, and its krone stays pegged to the euro, so a price series needs no FX column. Rows give price, locality, trade type and a retailer-or-private flag. No seller names or coordinates collected.
$3.00 / 1,000 · 100.0% success over 883 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
searchQuery |
string | What to search for on DBA.dk, exactly as you would type it in the site's search box, e.g. "sykkel" or "iphone 15". Leave it out when you only re-check listings through listingIds. | cykel |
listingIds |
array | Re-check listings you already know instead of searching: one listing ID per line (the number at the end of every listing address on DBA.dk, and the listingId of every dataset item), or the listing's full address. Each one is read from its own page: title, price, town, seller type, the full description and the photos on its page. A listing that is gone from the site is skipped, named in the log and not billed. When given, the search fields of this form are ignored and the run status says which. Up to 50. |
[] |
priceMin |
integer | Only include listings costing at least this many Danish kroner. | - |
priceMax |
integer | Only include listings costing at most this many Danish kroner. | - |
sortBy |
string | Order of results: date (newest first, best for monitoring), price_asc, price_desc, or relevance. | date |
postedAfter |
string | Only include listings posted on or after this date. With newest-first sorting the run stops early once older listings are reached. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. |
- |
postedBefore |
string | Only include listings posted on or before this date. Format: YYYY-MM-DD (for example 2026-09-08) or a full ISO timestamp such as 2026-09-08T14:30:00Z. Slash dates like 08/09/2026 are refused on purpose: they are read as September in Europe and August in the United States, and this actor will not guess which you meant. |
- |
maxItems |
integer | Stop after this many listings. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 1000. | 1000 |
scrapeDetails |
boolean | Read each listing's own page for the seller's full free-text description and the complete photo set, neither of which the search results carry. This makes one extra request per listing, so a run is slower and costs one more page fetch each. The seller-profile section is never read - no name or profile contact reaches the output. Leave off for a fast price-and-photo sweep. | False |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"adId": "25835885",
"adType": 67,
"city": "Holte",
"currency": "DKK",
"imageUrl": "https://images.dbastatic.dk/dynamic/default/item/25835885/d76906dd-e4c0-4141-8e1a-b0e81a430438",
"imageUrls": [
"https://images.dbastatic.dk/dynamic/default/item/25835885/d76906dd-e4c0-4141-8e1a-b0e81a430438",
"https://images.dbastatic.dk/dynamic/default/item/25835885/424bb90f-df73-4b94-8a54-0448d29d82cf"
],
"labels": [
"fiks_ferdig",
"buy_now",
"private",
"seller_pays_shipping"
],
"listingId": "25835885",
"listingType": "bap",
"postedAt": "2026-10-15T07:59:37.000Z",
"priceAmount": 750,
"sellerType": "private",
"title": "Wolf Tooth Drop-Stop B klinge med 110 BCD og 46 tænder.",
"tradeType": "Til salg",
"url": "https://www.dba.dk/recommerce/forsale/item/25835885"
}
| Field | Type | Meaning |
|---|---|---|
listingId |
string | DBA.dk listing ID. |
url |
string | Direct link to the listing. |
title |
string | Listing title as posted. |
priceAmount |
integer | Asking price in whole Danish kroner. 0 for give-aways; absent when the listing has no price. |
currency |
string | Always DKK when a price is present. |
postedAt |
string | When the listing was published or last bumped (ISO timestamp). |
city |
string | Listing locality. Locality-level only - exact coordinates are never collected. |
tradeType |
string | The site's trade label, e.g. 'Til salg' (for sale). |
sellerType |
string | Whether the listing comes from a retailer or a private seller. The only seller-related field in the output. |
imageUrls |
array | Listing photo URLs. Up to 8 from the search page, or the full set (up to 24) when scrapeDetails is on. |
description |
string | The seller's free-text description. Only present when scrapeDetails is on; read from the listing's own page, seller profile never touched. |
imageUrl |
string | The listing's primary photo at full resolution. Absent when the listing has no photo. |
attributes |
object | Specification values the seller filled in, keyed by the site's own attribute id, e.g. brand or model. Present only on listings that carry them. |
labels |
array | The site's own badge ids for the listing, e.g. 'retailer'. |
adId |
string | Blocket.se's internal ad id, which differs from listingId on some entries. |
adType |
integer | The site's numeric ad-type code. |
listingType |
string | The site's listing family, e.g. 'bap' for its general for-sale section. |
Health
100.0% success over 883 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.
Questions
Is it legal to scrape DBA.dk?
This is not legal advice. The actor reads what any logged-out visitor sees on dba.dk, with no login, no CAPTCHA solving and no private endpoints, and it extracts no seller name, contact detail or profile, so the output holds no personal data. Whether your own use of the listings is allowed under the site's terms and your jurisdiction's rules is yours to assess.
Can I get only the newest listings?
Yes. Set postedAfter to a date, yesterday for a daily watch, and the dataset holds only listings posted since then. With the default newest-first order the run stops paging as soon as it reaches older listings, so the watch stays fast and cheap.
How much do 10,000 listings cost?
$30.00, billed per delivered listing at $3.00 per 1,000. That price covers the run's platform usage, and a run that fails or returns nothing bills nothing.
Does it return seller phone numbers?
No. The only seller field is whether the seller is a retailer or a private person. Names, phone numbers, profiles and exact addresses are never extracted, and a test on every build fails if one ever appears, so this is not a setting that can be switched off.
Do I get full descriptions and photos?
Turn on scrapeDetails and each listing is read from its own page for its full description and every photo, at the cost of one extra request per listing. Off by default so a plain search stays fast.
How do I scrape all listings for a big search?
A single query only reaches as far as the site pages, so a very broad search cannot come through in one run. Split it into price bands with priceMin and priceMax across several runs; the rows merge cleanly on listingId.