# Coop Sverige Store Locator Scraper (`crawlerbros/coop-sverige-scraper`) Actor

Scrape Coop Sverige's store locator - every Coop, Stora Coop, X:tra, Coop Forum, Coop Mini and Coop Kök & Café location in Sweden with address, phone, coordinates, opening hours, and services.

- **URL**: https://apify.com/crawlerbros/coop-sverige-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Coop Sverige Store Locator Scraper

Scrape every Coop Sverige grocery store location — **Coop**, **Stora Coop**, **X:tra**, **Coop Forum**, **Coop Mini**, **Coop Prisvärt** and **Coop Kök & Café** — with address, coordinates, phone number, today's opening hours, and (optionally) the full weekly/holiday opening-hours schedule and in-store services. Powered by Coop Sverige's own public store-locator API. No login, no cookies, no paid API key.

### What this actor does

- **Two modes:** `search` (browse/filter the full store network) and `byStoreIds` (exact lookup)
- **Filters:** free-text keyword, city, postal-code prefix, store concept/banner, service offered, staffing type, and geo radius search (latitude/longitude + km)
- **~800 stores** across Sweden, covering every Coop-owned banner
- **Optional deep data:** services offered per store (e.g. parcel pickup, lottery, self-checkout), the full weekly + upcoming-holiday + per-department opening-hours schedule, current weekly-offer flyers (PDF + image), staffing type, franchise owner, and always-open/temporary-closure status
- **Empty fields are omitted** — you only ever see fields with real data

### Output per store

- `storeId`, `ledgerAccountNumber`
- `name`, `concept`, `conceptId`, `conceptName`
- `address`, `city`, `postalCode`, `phone`
- `latitude`, `longitude`
- `openingHoursToday`
- `distanceKm` — only present when searching near a location
- `storeUrl` — the store's page on coop.se (when available)
- `weeklyOffersUrl` — this week's flyer/offers page
- `services[]` — only with `includeDetails: true` or `mode: byStoreIds`
- `regularOpeningHours[]` — Mon–Sun schedule, only with `includeDetails: true` or `mode: byStoreIds`
- `specialOpeningHours[]` — upcoming holiday hours, only with `includeDetails: true` or `mode: byStoreIds`
- `departmentOpeningHours[]` — per-department hours (e.g. deli counter, parcel/postal service) where the store publishes them, only with `includeDetails: true` or `mode: byStoreIds`
- `flyers[]` — current + upcoming weekly-offers leaflets (`pdfUrl`, `imageUrl`, `startDate`, `stopDate`, `isCurrent`), only with `includeDetails: true` or `mode: byStoreIds`
- `staffing`, `staffingLabel` — `ALWAYS_MANNED` / `PARTLY_UNMANNED` / `ALWAYS_UNMANNED` (self-checkout-only), only with `includeDetails: true` or `mode: byStoreIds`
- `alwaysOpen` — `true` for 24/7 stores, only with `includeDetails: true` or `mode: byStoreIds`
- `isTemporaryClosed`, `temporaryClosedHeadline`, `temporaryClosedDetails` — closure info if the store is currently temporarily closed, only with `includeDetails: true` or `mode: byStoreIds`
- `ownerName`, `ownerOrganizationNumber`, `ownerLedgerAccountNumber` — the franchisee/co-op legal entity operating the store, only with `includeDetails: true` or `mode: byStoreIds`
- `siteId` — only with `includeDetails: true` or `mode: byStoreIds`
- `recordType: "store"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byStoreIds` |
| `query` | string | – | Keyword match against name/city/address |
| `city` | string | – | Exact city match, e.g. `Stockholm` |
| `postalCodePrefix` | string | – | Postal code starts-with, e.g. `111` |
| `concept` | string | `any` | Store banner: `coop`, `storaCoop`, `coopForum`, `coopPrisvart`, `xtra`, `coopKokCafe`, `coopMini` |
| `nearLatitude` / `nearLongitude` | number | – | Center point for a radius search |
| `radiusKm` | number | `10` | Max distance from the near-location point |
| `hasService` | string | – | Only stores offering this service, e.g. `Bageri`, `Instabox` (forces a detail fetch per candidate) |
| `staffing` | string | – | Only stores with this staffing model: `ALWAYS_MANNED` / `PARTLY_UNMANNED` / `ALWAYS_UNMANNED` (forces a detail fetch per candidate) |
| `storeIds` | array | – | Numeric store IDs (mode=byStoreIds) |
| `includeDetails` | bool | `false` | Fetch services + full opening-hours schedule (1 extra request/store) |
| `maxItems` | int | `50` | Hard cap (1–800) |

#### Example: all Coop stores in Stockholm

```json
{
  "mode": "search",
  "city": "Stockholm",
  "maxItems": 100
}
```

#### Example: X:tra discount stores near central Gothenburg

```json
{
  "mode": "search",
  "concept": "xtra",
  "nearLatitude": 57.7089,
  "nearLongitude": 11.9746,
  "radiusKm": 15,
  "includeDetails": true
}
```

#### Example: lookup specific stores with full details

```json
{
  "mode": "byStoreIds",
  "storeIds": ["598", "3788", "3785"]
}
```

### Use cases

- **Retail intelligence** — map Coop Sverige's national store network by banner and region
- **Location planning** — find gaps/density of grocery coverage by city or postal area
- **Logistics** — build a delivery-radius dataset from any warehouse coordinate
- **Consumer apps** — power a "find your nearest Coop" feature with live opening hours
- **Market research** — compare store-format mix (Coop vs Stora Coop vs X:tra) by geography

### FAQ

**Is this official Coop data?** Yes — it comes directly from the same public API that powers coop.se's own "Hitta butik" (find a store) page. No scraping of rendered HTML; it's the structured JSON the website itself uses.

**Do I need an account or API key?** No. The actor requires no login, cookies, or user-supplied credentials.

**Why is `distanceKm` sometimes missing?** It's only computed when you set both `nearLatitude` and `nearLongitude` for a radius search.

**What's the difference between `search` and `byStoreIds`?** `search` browses/filters the whole network (city, concept, geo, keyword). `byStoreIds` does an exact lookup for store IDs you already know (e.g. from a previous `search` run) and always includes full details.

**Why do some stores lack a `storeUrl`?** A handful of X:tra locations don't have a dedicated coop.se store page. Those records still include `weeklyOffersUrl` and all other fields.

**How often does this data change?** Store list, addresses and opening hours are Coop's live operational data — the actor always fetches current values, no caching.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `query` (type: `string`):

Free-text match against store name, city, and address (mode=search).

## `city` (type: `string`):

Exact city match, e.g. `Stockholm`, `Göteborg`, `Malmö` (mode=search).

## `postalCodePrefix` (type: `string`):

Filter stores whose postal code starts with this prefix, e.g. `111` for central Stockholm (mode=search).

## `concept` (type: `string`):

Filter by Coop Sverige store banner (mode=search).

## `nearLatitude` (type: `number`):

Center latitude for a geo radius search. Must be set together with `nearLongitude` (mode=search).

## `nearLongitude` (type: `number`):

Center longitude for a geo radius search. Must be set together with `nearLatitude` (mode=search).

## `radiusKm` (type: `number`):

Max distance from the near-location point. Only applies when `nearLatitude`/`nearLongitude` are set.

## `hasService` (type: `string`):

Only include stores that offer this service (checked via the store detail endpoint — forces detail fetch even if `includeDetails` is off) (mode=search).

## `staffing` (type: `string`):

Only include stores with this staffing model (checked via the store detail endpoint — forces detail fetch even if `includeDetails` is off) (mode=search).

## `storeIds` (type: `array`):

Numeric Coop store IDs to look up directly, e.g. `598` (Coop Krylbo). Find IDs via mode=search first.

## `includeDetails` (type: `boolean`):

Fetch services list, full weekly/holiday/department opening hours, current weekly-offer flyers, staffing type, owner info, and always-open/temporary-closure status per store. Adds one extra request per store, so runs are slower. Always on for mode=byStoreIds.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "concept": "any",
  "radiusKm": 10,
  "hasService": "",
  "staffing": "",
  "storeIds": [],
  "includeDetails": false,
  "maxItems": 50
}
```

# Actor output Schema

## `stores` (type: `string`):

Dataset containing all scraped Coop Sverige stores.

# 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 = {
    "mode": "search",
    "concept": "any",
    "radiusKm": 10,
    "hasService": "",
    "staffing": "",
    "storeIds": [],
    "includeDetails": false,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/coop-sverige-scraper").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 = {
    "mode": "search",
    "concept": "any",
    "radiusKm": 10,
    "hasService": "",
    "staffing": "",
    "storeIds": [],
    "includeDetails": False,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/coop-sverige-scraper").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 '{
  "mode": "search",
  "concept": "any",
  "radiusKm": 10,
  "hasService": "",
  "staffing": "",
  "storeIds": [],
  "includeDetails": false,
  "maxItems": 50
}' |
apify call crawlerbros/coop-sverige-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/coop-sverige-scraper"
        }
    }
}

```

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/XTYcNiRRThWunkvwU/builds/snZ8C7cMNjAforCV3/openapi.json
