# Halodoc Pharmacy, Medicine & Drug Scraper (Indonesia) (`fauzimatakupan/halodoc-pharmacy-scraper`) Actor

Scrape Halodoc pharmacy catalog: medicines, vitamins, and supplements. Extract IDR prices, active ingredients, dosage forms, manufacturer, BPOM NIE, and OTC or prescription status.

- **URL**: https://apify.com/fauzimatakupan/halodoc-pharmacy-scraper.md
- **Developed by:** [Fauzi Matakupan](https://apify.com/fauzimatakupan) (community)
- **Categories:** 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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Halodoc Pharmacy, Medicine & Drug Scraper — Indonesian Medicine Catalog from halodoc.com

Extract the pharmaceutical product catalog from [Halodoc Indonesia](https://www.halodoc.com/obat-dan-vitamin) —
Indonesia's largest digital-health platform with **16,000+ medicine and supplement SKUs**.
The **Halodoc scraper** collects trade names, real-time IDR retail prices, active medicinal
ingredients, dosage forms, packaging units, manufacturers, BPOM authorization numbers
(NIE), and prescription classifications (OTC vs Prescription Required) — a dataset with
**zero competitors** in the Apify Store.

**Tested in the wild:** one run recovered **5/5 products (100%)** from the daily-supplements
category with prices and prescription status (Cloud Runner, $0 proxy, Oct 2026).

### Pricing

Pay per event — you only pay for products actually returned. Platform usage is included.

| Products | Cost |
|---|---|
| 100 | ~$0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |

Failed pages and empty runs cost almost nothing (a tiny $0.0005 start fee).

### Example tasks

Try it without configuring anything — pre-configured runs against live categories:

- [Supplements & Daily Vitamins](https://apify.com/fauzimatakupan/suplemen-vitamin-harian)
- [Chronic-care & Routine Medicines](https://apify.com/fauzimatakupan/obat-rutin-kanker-dll)
- [Heart-health Products](https://apify.com/fauzimatakupan/kesehatan-jantung)
- [Diabetes Care Products](https://apify.com/fauzimatakupan/diabetes-produk)
- [Medicine Detail — Deep Enrich](https://apify.com/fauzimatakupan/detail-obat-enriched) —
  full JSON-LD `Product+Drug` detail on 2 popular SKUs

Open one, press *Start*, and inspect the output before writing your own input.

### Features

- **Dual crawling modes** — `categories` (default: fast sweep of popular medicine &
  vitamin categories via SSR inline JSON) or `sku-urls` (direct deep detail on specific
  drug pages).
- **Deep pharmaceutical data** — schema.org `Product`+`Drug` JSON-LD extraction:
  active ingredients & composition, dosage forms, legal/prescription status, safety
  warnings, BPOM NIE numbers, and official manufacturers.
- **Normalized IDR pricing** — `minPrice` / `basePrice` as queryable integers, selling
  unit (Strip, Botol, Tube, Box) preserved.
- **Fast & lightweight** — 100% headless HTTP via `got-scraping`; zero browser overhead;
  direct datacenter connection ($0 proxy).
- **Robots-friendly** — reads only public catalog and product pages; the sitemap exposes
  the full SKU universe (16,000+ products) so you can enumerate any subset.
- **Budget-aware** — stops gracefully when your per-run spending limit is reached.

### Use with AI agents (MCP)

Expose this Actor as a tool to Claude, Cursor, Codex, or any MCP client:

```
https://mcp.apify.com/?tools=fauzimatakupan/halodoc-pharmacy-scraper
```

The Actor is also discoverable through the official Apify MCP server — AI agents can
search Apify Store and run it automatically. Keywords: Halodoc scraper, Indonesia pharmacy
data, Indonesian medicine prices, obat Indonesia, drug catalog Indonesia, pharmacy market
research, healthcare data Indonesia.

### Related Actors

Building an Indonesian market-data pipeline? Check our other Actors:

- [OLX Indonesia Listings Scraper](https://apify.com/fauzimatakupan/olx-indonesia-listings-scraper) —
  classified ads & products from olx.co.id with IDR prices, locations, and seller info.
- [Indonetwork B2B Directory Scraper](https://apify.com/fauzimatakupan/indonetwork-b2b-directory-scraper) —
  Indonesian B2B suppliers and products with company profiles.
- [Oto.com Car Prices & Used Cars Scraper](https://apify.com/fauzimatakupan/oto-indonesia-auto-scraper) —
  variant-level OTR prices and used-car listings from oto.com.
- [Indonesia Tech Jobs Scraper](https://apify.com/fauzimatakupan/indonesia-tech-jobs-scraper) —
  unified Glints + Kalibrr job listings.

### Example input

```json
{
    "mode": "categories",
    "categoryUrls": ["https://www.halodoc.com/obat-dan-vitamin/suplemen-harian"],
    "enrichDetails": false,
    "maxItems": 100
}
```

### Example output

```json
{
    "drugId": "sangobion-activ-10-kapsul",
    "productName": "Sangobion Activ 10 Kapsul",
    "drugDescription": "Sangobion Activ Kapsul adalah suplemen kesehatan berbentuk kapsul yang digunakan sebagai asupan tambahan untuk membantu memenuhi kebutuhan zat besi dan vitamin harian tubuh...",
    "imageUrl": "https://d2qjkwm11akmwu.cloudfront.net/products/819467_13-10-2026_10-16-30.webp",
    "category": "Obat & Vitamin > Vitamin & Suplemen",
    "activeIngredient": "Tiap kapsul mengandung Fe glukonat 250 mg, Mangan sulfat, Tembaga sulfat, Vitamin C 50 mg, Asam folat 1 mg, Vitamin B12 7.5 mcg, dan Sorbitol 25 mg.",
    "dosageForm": "Kapsul",
    "legalStatus": "Vitamin & Suplemen",
    "prescriptionStatus": "OTC",
    "minPrice": 24900,
    "basePrice": 26100,
    "sellingUnit": "Strip",
    "manufacturer": "Merck Indonesia",
    "bpomNumber": "SD253054901",
    "warning": "Hati-hati penggunaan pada pasien dengan hemokromatosis...",
    "productUrl": "https://www.halodoc.com/obat-dan-vitamin/sangobion-activ-10-kapsul",
    "scrapedAt": "2026-10-24T01:00:00.000Z"
}
```

### Output fields

Each dataset item is one medicine / supplement product:

| Field | Description |
|---|---|
| `drugId`, `productName` | SKU slug and trade name |
| `drugDescription` | Pharmacy-grade Indonesian product description |
| `imageUrl`, `productUrl` | Product image and canonical SKU URL |
| `category` | Halodoc category breadcrumb |
| `activeIngredient`, `dosageForm` | Composition and form (Kapsul, Tablet, Sirup, ...) |
| `legalStatus`, `prescriptionStatus` | Regulatory status and OTC/Rx classification |
| `minPrice`, `basePrice`, `sellingUnit` | IDR pricing (integers) and pack unit |
| `manufacturer`, `bpomNumber` | Official maker and BPOM NIE number |
| `warning` | Safety warnings / contraindications |
| `scrapedAt` | ISO 8601 extraction timestamp |

### FAQ

**Does this Halodoc scraper need a login or proxy?** No login, no proxy. Halodoc serves
its public catalog to standard datacenter IPs; product data arrives as ready-made
JSON (`product_list` inline state and JSON-LD `Product+Drug`), not fragile HTML.

**How many products are available?** The public sitemap exposes **16,819 SKU pages** —
any subset can be enumerated via `sku-urls` mode or swept category by category.

**Can I use it as a medicine price monitor?** Yes. Schedule recurring runs on the
categories you care about to track price changes, stock, and new products over time.

**Is this medical advice data?** No — this is a structured mirror of publicly displayed
retail catalog data for research and market analysis. Always verify with a licensed
pharmacist or physician before any healthcare decision.

### Usage notes

- Use `enrichDetails: true` only when you need BPOM NIE / full composition per SKU
  (one extra request per product).
- Respect Halodoc's terms of service — this Actor reads public catalog pages only.

# Actor input Schema

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

Pilih mode: 'categories' untuk menjelajah kategori obat & vitamin, atau 'sku-urls' untuk daftar URL produk spesifik.

## `categoryUrls` (type: `array`):

Daftar URL kategori Halodoc untuk di-scrape (digunakan pada mode 'categories').

## `skuUrls` (type: `array`):

Daftar URL detail produk Halodoc (digunakan pada mode 'sku-urls').

## `enrichDetails` (type: `boolean`):

Jika true pada mode 'categories', scraper akan mengunjungi halaman SKU setiap produk untuk mengekstrak bahan aktif (active ingredient), deskripsi farmasi, BPOM NIE, dan pabrik.

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

Batas maksimum jumlah item obat yang dikumpulkan.

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

Konfigurasi proxy Apify (opsional, Halodoc tidak memerlukan proxy untuk request normal).

## Actor input object example

```json
{
  "mode": "categories",
  "categoryUrls": [
    "https://www.halodoc.com/obat-dan-vitamin/suplemen-harian",
    "https://www.halodoc.com/obat-dan-vitamin/obat-dan-perawatan",
    "https://www.halodoc.com/obat-dan-vitamin/ibu-dan-anak-1",
    "https://www.halodoc.com/obat-dan-vitamin/obat-rutin",
    "https://www.halodoc.com/obat-dan-vitamin/vitamins-dan-supplements-2",
    "https://www.halodoc.com/obat-dan-vitamin/asma-1",
    "https://www.halodoc.com/obat-dan-vitamin/kesehatan-jantung",
    "https://www.halodoc.com/obat-dan-vitamin/diabetes-5",
    "https://www.halodoc.com/obat-dan-vitamin/kecantikan-dan-perawatan-diri",
    "https://www.halodoc.com/obat-dan-vitamin/makanan-dan-minuman-16"
  ],
  "skuUrls": [
    "https://www.halodoc.com/obat-dan-vitamin/sangobion-activ-10-kapsul",
    "https://www.halodoc.com/obat-dan-vitamin/neurobion-forte-10-tablet"
  ],
  "enrichDetails": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("fauzimatakupan/halodoc-pharmacy-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("fauzimatakupan/halodoc-pharmacy-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 '{}' |
apify call fauzimatakupan/halodoc-pharmacy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fauzimatakupan/halodoc-pharmacy-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/DjTb3YrPII4bz9Iic/builds/JBoHY0JBcVRQrl4pN/openapi.json
