# Sweden Car Aggregator (`mrdoe/sweden-car-aggregator`) Actor

Aggregate Swedish car listings from Bytbil, Bilweb, KVD, Wayke, Riddermark Bil, Hedin Automotive, Bilia, Möller Bil, Din Bil, Rejmes, and Toyota Center Göteborg. Extract vehicle specs, prices, mileage, images, location, availability, and public dealer contact details.

- **URL**: https://apify.com/mrdoe/sweden-car-aggregator.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Automation, E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![Sweden Car Aggregator hero](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sweden-car-aggregator--hero.png)

## Sweden Car Aggregator

Scrape and normalize Swedish vehicle listings from multiple marketplaces/dealers into one unified schema - vehicle specs, pricing, images, and publicly available dealer contact information.

### Supported sources

| Source | Domain |
| --- | --- |
| Bytbil | bytbil.com |
| Bilweb | bilweb.se |
| KVD (auctions) | kvd.se |
| Wayke | wayke.se |
| Riddermark Bil | riddermarkbil.se |
| Hedin Automotive | hedinautomotive.se |
| Bilia | bilia.se |
| Möller Bil | mollerbil.se |
| Din Bil | dinbil.se |
| Rejmes | rejmes.se |
| Toyota Center Göteborg | toyotagoteborg.se |

The source is auto-detected from each start URL's domain. Each source reuses the same extraction approach as its dedicated single-source Actor where one exists (bytbil-scraper, bilweb-scraper, kvdbil-scraper, wayke-scraper) - reading embedded schema.org JSON-LD, a Next.js `__NEXT_DATA__` payload, or a server-rendered spec sheet directly off each vehicle's detail page. Rejmes has no static listing data on its own pages, so its module instead reads the same public JSON inventory API that Rejmes' own site's search widget calls.

**Blocket was evaluated and skipped**: the existing blocket-scraper Actor explicitly covers Blocket's general marketplace, not its vehicles section, and blocket.se's vehicles pages are client-side rendered with no static/embedded listing data reachable without browser automation - so it isn't included here.

**Secondary sources evaluated for this version**: Car.info, Kamux Sweden, and Holmgrens Bil were evaluated and skipped:

- **Car.info (car.info)**: not itself a dealer marketplace - it's a vehicle registry/valuation database that mirrors listings (including private Blocket sellers) from other sites, with most fields (equipment, valuation history, seller identity) locked behind a login wall. Skipped both for the login wall and to avoid surfacing private-seller data.
- **Kamux Sweden (kamux.se)**: every request (any path, any User-Agent, with or without a referer) is rejected with a `403 Forbidden` from an Azure Application Gateway WAF - an active bot-blocking wall, so it's skipped per this Actor's hard constraint against bypassing bot protection.
- **Holmgrens Bil (holmgrensbil.se)**: its listing pages are a fully client-rendered React app with no embedded JSON/JSON-LD and no public listing API discoverable in its served JS bundles, so there's no static data to read. A headless-browser fallback would need a Playwright-capable base image/dependency change beyond this Actor's current Cheerio-only setup, so it was left out rather than forced in.

"Toyota Center" is a brand used by several independently-run Toyota dealers rather than one national site; Toyota Center Göteborg (toyotagoteborg.se) is the largest and is the one integrated here.

Not affiliated with or endorsed by any of the above. Only publicly visible listing data is collected - no login, CAPTCHA bypass, or access-control circumvention is used.

### Input

![Sweden Car Aggregator input options](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sweden-car-aggregator--input.png)

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | array | `https://www.bytbil.com/bil` | Listing/search page URLs from any supported source. |
| `maxItems` | integer | `10` | Maximum listings across **all** start URLs combined. `0` = unlimited. |
| `proxyConfiguration` | object | `{ "useApifyProxy": true }` | Apify Proxy configuration. |

### Output

![Sweden Car Aggregator dataset output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sweden-car-aggregator--output.png)

![Sweden Car Aggregator data fields](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sweden-car-aggregator--fields.png)

**Vehicle**: `listingId`, `title`, `make`, `model`, `trim`, `year`, `mileage`, `fuelType`, `transmission`, `drivetrain`, `bodyType`, `engineSize`, `enginePower`, `doors`, `seats`, `color`

**Price**: `price`, `currency`, `monthlyPrice`, `oldPrice`, `discount`, `priceType` (`fixed` or `auction`)

**Location**: `address`, `postalCode`, `locality`, `municipality`, `county`, `country`, `latitude`, `longitude`

**Seller/Dealer**: `sellerType`, `dealerName`, `dealerUrl`, `dealerPhone`, `dealerEmail`, `dealerAddress`, `contactUrl` - only publicly displayed professional/business contact info, never private-owner details

**Listing**: `url`, `image`, `images`, `description`, `features`, `specifications` (extra source-specific specs not covered by named fields, e.g. VIN, CO2, previous owners), `availability`, `listingDate`, `updatedAt`

**Source**: `source`, `sourceUrl`, `scrapedAt`

Fields are `null` (or `[]` for arrays) when the source doesn't publish that value - nothing is guessed or fabricated. Coverage varies by source: KVD is an auction house and is always the listed dealer/seller (with full public address/phone); Bytbil, Riddermark Bil, Hedin Automotive, Bilia, Möller Bil, Din Bil, and Toyota Center Göteborg expose a named dealer with phone/email (or address) on most listings; Bilweb and Wayke expose the dealer name and, when published, its contact details; Rejmes exposes the selling branch's name but not its own phone/email in its public listings API.

Export results as JSON, CSV, Excel, XML, or via the [Apify API](https://docs.apify.com/api/v2) once a run finishes.

### FAQ

**Is this legal?** Only publicly available listing data is collected. Not affiliated with or endorsed by any of the supported sites. Respect each site's Terms of Service and GDPR.

**Does every listing have dealer contact info?** No - it's only populated when the source publicly displays it on the page this Actor reads.

**Can I add more marketplaces?** Not yet - this Actor currently supports the sources listed in the table above. Unsupported start URLs are skipped with a warning rather than failing the run.

Found a bug or have a feature request? Use the Issues tab on this Actor's Apify Store page.

### Preview

![How Sweden Car Aggregator works](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/sweden-car-aggregator--how-it-works.png)

# Actor input Schema

## `startUrls` (type: `array`):

Listing/search page URLs from Bytbil, Bilweb, KVD, Wayke, Riddermark Bil, Hedin Automotive, Bilia, Möller Bil, Din Bil, Rejmes, or Toyota Center Göteborg. The source is auto-detected from each URL's domain.

## `maxItems` (type: `integer`):

Maximum number of vehicle listings to scrape across all start URLs combined. Set to 0 for unlimited.

## `proxyConfiguration` (type: `object`):

Proxy settings for the run.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bytbil.com/bil"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.bytbil.com/bil"
        }
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/sweden-car-aggregator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.bytbil.com/bil" }],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/sweden-car-aggregator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.bytbil.com/bil"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mrdoe/sweden-car-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/sweden-car-aggregator"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/asH7cS1hQftc3V1jt/builds/0czJE0HapiSzmODbq/openapi.json
