# Alodokter Shop Product Scraper (`bovi/alodokter-scraper`) Actor

Collect public Alodokter Shop product listings with prices, product categories, pack details, pharmacy, stock, rating, and warehouse information. Select a catalog category and cap the number of returned records.

- **URL**: https://apify.com/bovi/alodokter-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 alodokter shop product scrapers

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

## Alodokter Shop Product Scraper

Collect public product listings from Alodokter Shop, Alodokter's online pharmacy and health-products catalog. Each record is built from the product data returned by the site's public catalog endpoint. Depending on the source record, the dataset includes the product ID and page URL, title, numeric and displayed price, currency, pack size, product classification, catalog categories, generic name, manufacturer, image, pharmacy, stock, rating, review and sales counts, availability percentage, and selected warehouse.

### Input

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| category | string | Yes | Popular | Exact public category name or category ID, such as Popular or Obat Batuk. |
| maxResults | integer | No | 50 | Maximum number of products to emit from the selected category response. The source may return fewer records. |
| proxyConfiguration | object | No | useApifyProxy: false | Optional Apify proxy settings. With the default setting, requests go directly to Alodokter. |

Category names are resolved from Alodokter's public category list. A name that does not match a current category causes the run to fail with a clear error. The returned price and warehouse are the values selected by the source for that request; they may change as the catalog changes.

### Example output

```
{
  "id": "5fb3866141ab59059e869c67",
  "url": "https://www.alodokter.com/aloshop/products/andalan-strip-uji-kehamilan/5fb3866141ab59059e869c67",
  "title": "Andalan Strip Uji Kehamilan",
  "price": 9618,
  "price_display": "Rp9.618",
  "currency": "IDR",
  "unit": "STRIP",
  "unit_in_pack": "1 Piece",
  "seller": "Century",
  "stock": 1,
  "source": "alodokter.com"
}
```

### Price per result

Each output record is one dataset item. This actor does not add a separate Actor.charge event; the per-item price configured for the actor on Apify applies.

### Run

Choose a category, leave maxResults at 50 or enter a smaller cap, and start the actor. The actor fetches the public category list, requests products for the selected category, and writes no more than maxResults records to the dataset. No account login is required.

# Actor input Schema

## `category` (type: `string`):

Exact Alodokter Shop category name or category ID, for example Popular or Obat Batuk.

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

Maximum number of product records to emit from the selected category.

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

Optional proxy settings. Disable the Apify Proxy to connect directly.

## Actor input object example

```json
{
  "category": "Popular",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with the scraped product records.

# 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 = {
    "category": "Popular",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/alodokter-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 = {
    "category": "Popular",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/alodokter-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 '{
  "category": "Popular",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call bovi/alodokter-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bovi/alodokter-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/kISL04G4xmGizmRHT/builds/4ByXHSMlGfxpvYGx5/openapi.json
