# Flowzz Scraper (`solidcode/flowzz-scraper`) Actor

\[💰 $4 / 1K] Extract German medical cannabis data from Flowzz: flowers, extracts, edibles, strains and 635 pharmacies. Get THC/CBD, genetics, producer, origin and ratings, plus the per-gram price every pharmacy currently charges with its address and delivery options.

- **URL**: https://apify.com/solidcode/flowzz-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** E-commerce, Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.
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

## Flowzz Scraper

Pull the complete German medical cannabis market from Flowzz — 4,037 cannabis flowers, 277 extracts, 15 edibles, 1,655 strain genetics records and all 635 dispensing pharmacies, each product carrying the live per-gram price that every pharmacy currently charges for it. Built for pharmacy pricing teams, telemedicine and patient platforms, and market analysts who need a clean, comparable view of German cannabis pricing without checking hundreds of pharmacy shelves by hand.

### Why This Scraper?

- **Five catalogues, one actor** — 4,037 cannabis flowers, 277 extracts, 15 edibles, 1,655 strain genetics records and the 635-pharmacy German dispensing directory, each with its own clean record shape.
- **Live pharmacy price comparison on every product row** — up to 165 pharmacy offers on a single popular product, each carrying the price in EUR per gram, stock status, street address, coordinates and website. One run gives you the full price spread, not a single headline number.
- **The half of the market Flowzz hides by default** — the site shows only what pharmacies currently carry (2,077 flowers). Switch off the in-stock filter and you also get the ~1,960 discontinued or temporarily unavailable products, for a complete 4,037-product assortment view.
- **635 German pharmacies as a standalone dataset** — official name, street, postcode, city, latitude and longitude, email, phone, opening hours, and every delivery or pickup option with its own base price.
- **Five genetics filters including dominance** — Indica, Sativa, Hybrid, Indica dominant and Sativa dominant, so you can isolate hybrids that lean one way rather than lumping all hybrids together.
- **Three numeric range filters and nine sort orders** — narrow by THC %, CBD % and price per gram, then order by cheapest per gram, strongest THC, highest CBD, best rated, newest, or strain name A-Z before your result limit is applied.
- **Terpene profiles and long-form German descriptions on demand** — an optional per-record lookup that adds the terpene list and the full product or strain write-up when you need depth rather than breadth.
- **The entire 4,037-product catalogue with every pharmacy price in around six minutes** — measured end to end on the live platform, so a full-market snapshot is a routine daily job rather than an overnight batch.
- **Sponsored placements stripped out** — Flowzz repeats its paid pinned-product slots on every page. Those are dropped, so your dataset carries each product exactly once.

### Use Cases

**Pharmacy Pricing & Competitive Intelligence**

- Track what every competing pharmacy charges per gram for the same product
- Find where your own pricing sits in the spread between cheapest and most expensive
- Monitor daily price movements across the full 4,037-product catalogue
- Spot products where the price gap between pharmacies is widest

**Patient & Telemedicine Platforms**

- Power a price-comparison feature with fresh per-gram prices and stock status
- Show patients which nearby pharmacies actually have a product in stock
- Match prescriptions to strains by THC and CBD range
- Surface delivery and pickup options with their base prices

**Market Research & Supply Analysis**

- Measure assortment breadth by producer and country of origin
- Compare the 2,077 in-stock products against the 4,037 listed to gauge supply gaps
- Track which genetics dominate the market and how strongly
- Follow new product launches with the newest-first ordering

**Pharmacy Network & Lead Generation**

- Build a contact list of all 635 dispensing pharmacies with email, phone and website
- Map coverage by postcode and city using latitude and longitude
- Identify which pharmacies stock a specific product before you approach them
- Segment pharmacies by delivery options and premium partner status

**Product & Genetics Databases**

- Maintain a catalogue of 1,655 strains with THC and CBD ranges
- Enrich internal product records with terpene profiles and descriptions
- Link products to their underlying cultivar and producer
- Feed ratings and review counts into recommendation engines

### Getting Started

#### Simple — the first 100 flowers with pharmacy prices

```json
{
  "dataType": "flowers",
  "maxResults": 100
}
```

#### Filtered — strong, in-stock flowers under €6 per gram, cheapest first

```json
{
  "dataType": "flowers",
  "minThc": 25,
  "maxPricePerGram": 6,
  "inStockOnly": true,
  "sortBy": "priceAsc",
  "maxResults": 200
}
```

#### The full pharmacy directory

```json
{
  "dataType": "pharmacies",
  "maxResults": 0
}
```

#### Advanced — a deep slice with prices, terpenes and descriptions

```json
{
  "dataType": "flowers",
  "maxResults": 300,
  "includePharmacyPrices": true,
  "includeDetails": true,
  "genetics": ["Hybrid", "Indica dominant"],
  "minThc": 20,
  "maxThc": 30,
  "minCbd": 0,
  "maxCbd": 1,
  "sortBy": "thcDesc"
}
```

Terpenes and descriptions cost one extra lookup per record, so keep a result limit on when that switch is on. If a run does run long it stops early, saves everything it has, and tells you how far it got.

#### Specific pages only

```json
{
  "startUrls": [
    "https://flowzz.com/product/skk-bc-36-1-blue-caviar",
    "https://flowzz.com/strain/blue-caviar"
  ],
  "includePharmacyPrices": true
}
```

### Input Reference

#### What to Extract

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `dataType` | string | `"flowers"` | Which catalogue to browse. Options: `flowers` (Cannabis Flowers, ~2,100), `extracts` (Extracts, ~180), `edibles` (Edibles, very small catalogue), `strains` (Strains / genetics, ~1,650), `pharmacies` (Pharmacies directory, 635). |
| `startUrls` | array | `[]` | Specific Flowzz product, strain or pharmacy pages. A bare slug such as `skk-bc-36-1-blue-caviar` also works. When set, the catalogue is not browsed and only these pages are extracted. Product pages are looked up across flowers, extracts and edibles, so you don't need to know which catalogue a product belongs to. |
| `maxResults` | integer | `100` | How many records to return. Set to `0` for everything: about 4,000 flowers, 1,650 strains or 635 pharmacies. When browsing flowers, extracts or edibles the results arrive a page at a time and Flowzz occasionally repeats a product inside a page, so a run can land a few records either side of this number rather than cutting a page in half. Flowzz never serves fewer than 12 products at a time, so any limit below 12 returns 12. Strains, the pharmacies directory and any run with a search term are cut to this number exactly. |

#### Enrichment

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includePharmacyPrices` | boolean | `true` | Add every pharmacy currently selling the product, with its price per gram, stock status, address, coordinates and website. Popular products are stocked by 100+ pharmacies. Applies to flowers, extracts and edibles only. |
| `includeDetails` | boolean | `false` | Look up each record's detail page to add its terpene profile and long German description. Works on flowers, extracts, edibles and strains. This needs one extra lookup per record, so large runs take noticeably longer — leaving `maxResults` at `0` on the flowers catalogue can outlast a single run, which then stops early and saves what it has. Flowzz fills in product descriptions only rarely, and extracts carry a terpene list less often than flowers do; strain descriptions are the best populated of all. Does not apply to the pharmacies directory. |

#### Filters

All filters are optional. Genetics, THC, CBD, price and stock status apply to flowers, extracts, edibles and strains. The pharmacies directory supports only the search term.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchTerm` | string | empty | Keep only records whose name, strain or producer contains this text, for example `Lemon` or `Cantourage`. For pharmacies it matches name, city and postcode. Close spelling matches from the Flowzz site search are included too, and those extras are capped by Flowzz at 120 products or 50 strains — the plain text match itself covers the whole catalogue and is not capped. |
| `genetics` | array | `[]` | Keep only products with these genetics: `Indica`, `Sativa`, `Hybrid`, `Indica dominant`, `Sativa dominant`. Leave empty for all. The last two describe which way a hybrid leans, so pick them on their own or alongside `Hybrid`. |
| `minThc` / `maxThc` | integer | empty | THC percentage range, 0–100. |
| `minCbd` / `maxCbd` | integer | empty | CBD percentage range, 0–100. Useful for finding CBD-rich varieties. |
| `minPricePerGram` / `maxPricePerGram` | integer | empty | Cheapest-pharmacy price per gram in euros, 0–100. Flowzz prices top out well below €100/g, so 100 behaves the same as no maximum. |
| `inStockOnly` | boolean | `false` | Skip products that no pharmacy currently has available. Leave off to also see products that exist on Flowzz but are out of stock everywhere — roughly half the flowers catalogue. Does not apply to strains or pharmacies. |

#### Sorting

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | string | `"recommended"` | Order results before the maximum is applied. Options: `recommended` (Flowzz recommended), `priceAsc` (Price per gram: low to high), `priceDesc` (Price per gram: high to low), `thcDesc` (THC: high to low), `thcAsc` (THC: low to high), `cbdDesc` (CBD: high to low), `ratingDesc` (Best rated first), `newest` (Newest first), `strain` (Strain name A-Z). Applies to flowers, extracts, edibles and strains. |

### Output

Every row carries a `recordType` so the three shapes are easy to separate.

#### `recordType: "product"` — flowers, extracts, edibles

```json
{
  "recordType": "product",
  "productType": "flowers",
  "id": 667,
  "name": "Cannamedical Sativa Ultra NM Polar Cookies 27/1",
  "slug": "cannamedical-sativa-ultra-nm-polar-cookies-27-1",
  "url": "https://flowzz.com/product/cannamedical-sativa-ultra-nm-polar-cookies-27-1",
  "thc": 27.0,
  "cbd": 0.1,
  "genetic": "Hybrid",
  "dominance": "Sativa",
  "strainName": "Polar Cookies",
  "producerName": "Cannamedical",
  "origin": "Kanada",
  "irradiated": false,
  "unit": "g",
  "minPricePerGram": 5.49,
  "maxPricePerGram": 9.9,
  "availability": 1,
  "inStock": true,
  "ratingsScore": 4.3,
  "ratingsCount": 178,
  "isPremiumPharmacy": true,
  "imageUrl": "https://cms.flowzz.com/uploads/polar_cookies.jpg",
  "description": "Polar Cookies ist eine sativadominante Sorte ...",
  "terpenes": ["Myrcen", "Limonen", "Caryophyllen"],
  "pharmacyOfferCount": 98,
  "pharmacyOffers": [
    {
      "pharmacyId": 214,
      "pharmacyName": "Brokkoli Apotheke",
      "officialName": "Brokkoli Apotheke Paderborn",
      "street": "Westernstraße 12",
      "postcode": "33098",
      "city": "Paderborn",
      "latitude": 51.7189,
      "longitude": 8.7575,
      "website": "https://brokkoli-apotheke.de",
      "pricePerGram": 5.49,
      "availability": 1,
      "inStock": true,
      "isPremium": true
    }
  ],
  "createdAt": "2024-11-03T09:12:44.000Z",
  "scrapedAt": "2026-07-25T08:41:02.117Z"
}
```

##### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `product` |
| `productType` | string | `flowers`, `extracts` or `edibles` |
| `id` | integer | Flowzz product id |
| `name` | string | Full product name |
| `slug` | string | URL slug |
| `url` | string | Flowzz product page |
| `imageUrl` | string | Product image |
| `createdAt` | string | When Flowzz first listed the product |
| `scrapedAt` | string | Timestamp of this run |

##### Cannabinoids & Genetics

| Field | Type | Description |
|-------|------|-------------|
| `thc` | number | THC percentage |
| `cbd` | number | CBD percentage |
| `genetic` | string | Indica, Sativa or Hybrid |
| `dominance` | string | Which way a hybrid leans |
| `strainName` | string | Underlying cultivar |
| `producerName` | string | Manufacturer |
| `origin` | string | Country of origin |
| `irradiated` | boolean | Gamma-irradiated flag |
| `terpenes` | array | Terpene names — populated when `includeDetails` is on |
| `description` | string | Long German write-up — populated when `includeDetails` is on |

##### Pricing, Ratings & Availability

| Field | Type | Description |
|-------|------|-------------|
| `minPricePerGram` | number | Cheapest pharmacy price, EUR/g |
| `maxPricePerGram` | number | Most expensive pharmacy price, EUR/g |
| `unit` | string | Unit the product is sold in |
| `availability` | integer | Raw availability code from Flowzz |
| `inStock` | boolean | At least one pharmacy currently has it |
| `ratingsScore` | number | Average patient rating |
| `ratingsCount` | integer | Number of ratings |
| `isPremiumPharmacy` | boolean | Sold by a premium partner pharmacy |

##### Pharmacy Offers — `pharmacyOffers[]`

Populated when `includePharmacyPrices` is on. `pharmacyOfferCount` is the number of entries. An empty list with a count of `0` means no pharmacy stocks the product right now; `null` means the price lookup did not answer for that product, so the count is unknown rather than zero. The two are deliberately never mixed.

| Field | Type | Description |
|-------|------|-------------|
| `pharmacyId` | integer | Flowzz pharmacy id |
| `pharmacyName` | string | Pharmacy display name |
| `officialName` | string | Registered pharmacy name |
| `street` / `postcode` / `city` | string | Pharmacy address |
| `latitude` / `longitude` | number | Coordinates |
| `website` | string | Pharmacy website |
| `pricePerGram` | number | What this pharmacy charges, EUR/g |
| `availability` | integer | Raw availability code at this pharmacy |
| `inStock` | boolean | In stock at this pharmacy |
| `isPremium` | boolean | Premium partner pharmacy |

#### `recordType: "strain"`

```json
{
  "recordType": "strain",
  "id": 812,
  "name": "Polar Cookies",
  "slug": "polar-cookies",
  "url": "https://flowzz.com/strain/polar-cookies",
  "type": "Hybrid",
  "dominance": "Sativa",
  "minThc": 22.0,
  "maxThc": 28.0,
  "minCbd": 0.05,
  "maxCbd": 1.0,
  "minPricePerGram": 5.49,
  "maxPricePerGram": 11.9,
  "ratingsScore": 4.4,
  "ratingsCount": 231,
  "description": "Polar Cookies vereint ...",
  "imageUrl": "https://cms.flowzz.com/uploads/strain_polar_cookies.jpg",
  "createdAt": "2024-06-18T14:02:11.000Z",
  "scrapedAt": "2026-07-25T08:41:02.117Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `id` / `name` / `slug` / `url` | — | Strain identity and its Flowzz page |
| `type` | string | Indica, Sativa or Hybrid |
| `dominance` | string | Which way a hybrid leans |
| `minThc` / `maxThc` | number | THC range across products of this strain |
| `minCbd` / `maxCbd` | number | CBD range across products of this strain |
| `minPricePerGram` / `maxPricePerGram` | number | Price span, EUR/g |
| `ratingsScore` / `ratingsCount` | number | Average rating and review count |
| `description` | string | Long German write-up — populated when `includeDetails` is on |
| `imageUrl` | string | Strain image |
| `createdAt` / `scrapedAt` | string | Listing date and run timestamp |

#### `recordType: "pharmacy"`

```json
{
  "recordType": "pharmacy",
  "id": 214,
  "name": "Brokkoli Apotheke",
  "officialName": "Brokkoli Apotheke Paderborn",
  "website": "https://brokkoli-apotheke.de",
  "street": "Westernstraße 12",
  "postcode": "33098",
  "city": "Paderborn",
  "latitude": 51.7189,
  "longitude": 8.7575,
  "email": "info@brokkoli-apotheke.de",
  "phone": "+49 5251 123456",
  "openingTime": "Mo-Fr 08:00-18:30, Sa 09:00-14:00",
  "supportTime": "Mo-Fr 09:00-17:00",
  "deliveryOptions": [
    {
      "name": "Versand",
      "type": "shipping",
      "enabled": true,
      "basePrice": 4.9,
      "description": "Versand innerhalb Deutschlands"
    }
  ],
  "url": "https://flowzz.com/420-brokkoli-paderborn",
  "isPremium": true,
  "logoUrl": "https://cms.flowzz.com/uploads/brokkoli_logo.png",
  "createdAt": "2023-08-01T10:00:00.000Z",
  "updatedAt": "2026-07-20T06:31:55.000Z",
  "scrapedAt": "2026-07-25T08:41:02.117Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `id` / `name` / `officialName` | — | Pharmacy id, display name and registered name |
| `street` / `postcode` / `city` | string | Full address |
| `latitude` / `longitude` | number | Coordinates for mapping |
| `email` / `phone` / `website` | string | Contact details |
| `openingTime` | string | Opening hours |
| `supportTime` | string | Customer support hours |
| `deliveryOptions` | array | Each option with `name`, `type`, `enabled`, `basePrice`, `description` |
| `url` | string | Flowzz pharmacy page |
| `isPremium` | boolean | Premium partner pharmacy |
| `logoUrl` | string | Pharmacy logo |
| `createdAt` / `updatedAt` / `scrapedAt` | string | Listing dates and run timestamp |

### Tips for Best Results

- **Leave "in stock only" off for market research, turn it on for buying decisions.** Off gives the full 4,037-flower assortment including everything currently unavailable; on trims to the 2,077 a pharmacy can actually dispense today.
- **Pick dominance options on their own or alongside Hybrid.** Every genetics option you select must match at once, so `Sativa` together with `Indica dominant` is a contradiction and returns nothing. `Indica dominant` alone, or with `Hybrid`, is what you want.
- **Pair a price ceiling with cheapest-first sorting.** `maxPricePerGram` compares against a product's cheapest pharmacy, so combining it with `Price per gram: low to high` gives you the genuinely affordable end of the market in one pass.
- **Turn on terpenes and descriptions for strains rather than products.** Flowzz fills in strain write-ups thoroughly but leaves most product descriptions empty, so the extra lookup pays off far more on the 1,655-strain catalogue.
- **Keep pharmacy prices on for anything price-related.** It is the difference between knowing a product costs €5.49–€9.90 and knowing exactly which of 98 pharmacies charges what.
- **Set `maxResults` to 0 for full-market snapshots.** All 4,037 flowers with every pharmacy price land in around six minutes, so a daily full refresh is entirely practical. Add terpenes and descriptions only with a result limit on — that switch costs one extra lookup per record and turns a six-minute job into a much longer one.
- **Use `startUrls` for watchlists.** Paste the product, strain and pharmacy pages you track and the catalogue browse is skipped entirely — bare slugs work, and product pages resolve across flowers, extracts and edibles automatically.

### Pricing

**From $4.00 per 1,000 results** — undercutting the nearest comparable Flowzz extractor by 20% while covering five catalogues instead of three. Bronze, Silver and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.48 | $0.45 | $0.43 | $0.40 |
| 1,000 | $4.80 | $4.50 | $4.25 | $4.00 |
| 10,000 | $48.00 | $45.00 | $42.50 | $40.00 |
| 100,000 | $480.00 | $450.00 | $425.00 | $400.00 |

A "result" is one row in your dataset — a product, a strain or a pharmacy. Nested pharmacy offers ride along inside the product row at no extra cost, so a product stocked by 98 pharmacies still counts as one result. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom endpoints on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly listed product, price and pharmacy information from Flowzz, a German medical cannabis price-comparison platform. It is intended for pricing research, market analysis, and building patient-facing comparison tools. Medical cannabis is a regulated product in Germany, and you are responsible for complying with applicable German and EU law, pharmaceutical advertising rules, and Flowzz's Terms of Service when using the data. Prices and stock levels change constantly — always treat extracted values as a point-in-time snapshot. Nothing in this dataset is medical advice.

# Actor input Schema

## `dataType` (type: `string`):

Pick the Flowzz catalogue you want. Cannabis Flowers is by far the largest (about 2,100 in stock, about 4,000 including products no pharmacy currently carries). Extracts has about 180 in stock. Edibles is a very small catalogue - only a handful of products exist. Strains are the underlying genetics with their THC/CBD ranges. Pharmacies is the directory of 635 German pharmacies that dispense medical cannabis.

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

Optional. Paste Flowzz product, strain or pharmacy pages, for example https://flowzz.com/product/skk-bc-36-1-blue-caviar. A bare slug such as skk-bc-36-1-blue-caviar also works. When you add anything here, the catalogue above is not browsed and only these pages are extracted. Product pages are looked up across Flowers, Extracts and Edibles, so you do not need to know which catalogue a product belongs to.

## `maxResults` (type: `integer`):

How many records to return. Set to 0 to take everything available: about 4,000 cannabis flowers, 1,650 strains or 635 pharmacies. When browsing Flowers, Extracts or Edibles the results arrive a page at a time and Flowzz occasionally repeats a product inside a page, so a run can land a few records either side of this number rather than cutting a page in half. Flowzz also never serves fewer than 12 products at a time, so any limit below 12 returns 12. Strains, the Pharmacies directory and any run with a search term are cut to this number exactly.

## `includePharmacyPrices` (type: `boolean`):

Add every pharmacy currently selling the product, with its price per gram, stock status, address, coordinates and website. Popular products are stocked by 100+ pharmacies, so this makes each row much richer. Only applies to Flowers, Extracts and Edibles - Strains and the Pharmacies directory ignore it.

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

Look up each record's detail page to add its terpene profile and long German description. Works on Flowers, Extracts, Edibles and Strains. This needs one extra lookup per record, so a large run takes noticeably longer - leaving 'Maximum results' at 0 on the flowers catalogue can take longer than a run is allowed to last, and the run will then stop early and save what it has. Flowzz fills in product descriptions only rarely, and extracts carry a terpene list less often than flowers do; strain descriptions are the best populated of all. Does not apply to the Pharmacies directory.

## `searchTerm` (type: `string`):

Keep only records whose name, strain or producer contains this text, for example 'Lemon' or 'Cantourage'. For the Pharmacies directory it matches the pharmacy name, city and postcode. Close spelling matches from the Flowzz site search are included too, and those extras are capped by Flowzz at 120 products or 50 strains - the plain text match itself covers the whole catalogue and is not capped.

## `genetics` (type: `array`):

Keep only products with these genetics. Leave empty for all. Picking several plain types (Indica, Sativa, Hybrid) widens the result. But 'Indica dominant' and 'Sativa dominant' describe which way a hybrid leans, so combining one of those with a plain type narrows to products that are both - for example Sativa together with Indica dominant is a contradiction and returns nothing. Pick the dominant options on their own, or alongside Hybrid. Does not apply to the Pharmacies directory.

## `minThc` (type: `integer`):

Only products with at least this much THC, for example 25. Leave empty for no minimum.

## `maxThc` (type: `integer`):

Only products with at most this much THC. Leave empty for no maximum.

## `minCbd` (type: `integer`):

Only products with at least this much CBD. Useful for finding CBD-rich varieties. Leave empty for no minimum.

## `maxCbd` (type: `integer`):

Only products with at most this much CBD. Leave empty for no maximum.

## `minPricePerGram` (type: `integer`):

Only products whose cheapest pharmacy price is at least this many euros per gram. Leave empty for no minimum.

## `maxPricePerGram` (type: `integer`):

Only products whose cheapest pharmacy price is at most this many euros per gram, for example 6. Leave empty for no maximum. Flowzz prices top out well below 100 EUR/g, so 100 behaves the same as no maximum.

## `inStockOnly` (type: `boolean`):

Skip products that no pharmacy currently has available. Leave this off to also see products that exist on Flowzz but are out of stock everywhere - that is roughly half of the flowers catalogue. Does not apply to Strains or the Pharmacies directory.

## `sortBy` (type: `string`):

Order the results before the maximum above is applied - handy for grabbing the cheapest or strongest products first. Applies to Flowers, Extracts, Edibles and Strains. The Pharmacies directory is always returned in Flowzz's own order.

## Actor input object example

```json
{
  "dataType": "flowers",
  "startUrls": [],
  "maxResults": 100,
  "includePharmacyPrices": true,
  "genetics": [],
  "sortBy": "recommended"
}
```

# Actor output Schema

## `products` (type: `string`):

Cannabis flowers, extracts and edibles with THC/CBD, genetics, producer and price range.

## `strains` (type: `string`):

Strain genetics with THC/CBD ranges, ratings and price ranges.

## `pharmacies` (type: `string`):

German pharmacies dispensing medical cannabis, with address, contact details and delivery options.

## `allData` (type: `string`):

Every field of every record, including the full pharmacy price offers.

# 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 = {
    "dataType": "flowers",
    "startUrls": [],
    "maxResults": 100,
    "includePharmacyPrices": true,
    "includeDetails": false,
    "genetics": [],
    "inStockOnly": false,
    "sortBy": "recommended"
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/flowzz-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 = {
    "dataType": "flowers",
    "startUrls": [],
    "maxResults": 100,
    "includePharmacyPrices": True,
    "includeDetails": False,
    "genetics": [],
    "inStockOnly": False,
    "sortBy": "recommended",
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/flowzz-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 '{
  "dataType": "flowers",
  "startUrls": [],
  "maxResults": 100,
  "includePharmacyPrices": true,
  "includeDetails": false,
  "genetics": [],
  "inStockOnly": false,
  "sortBy": "recommended"
}' |
apify call solidcode/flowzz-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,solidcode/flowzz-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/x48IHXywDT260BWfA/builds/ndQyM2efBm2zunTh4/openapi.json
