# Loket.com Events Scraper (`den_den/loket-events-scraper`) Actor

Scrape public events from Loket.com, Indonesia's biggest ticketing site: name, organizer, venue, city, WIB dates, IDR prices, sales status. Monitor mode for new/changed events.

- **URL**: https://apify.com/den_den/loket-events-scraper.md
- **Developed by:** [Mr Putra](https://apify.com/den_den) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 event scrapeds

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

## Loket.com Events Scraper

Get every public event on [Loket.com](https://www.loket.com), Indonesia's largest event ticketing platform, as clean JSON, CSV or Excel: event name, organizer, venue, city, start and end time (WIB), ticket price in IDR and sales status. Turn on details for the full description, street address and price range. Monitor mode returns only new or changed events, so it works as a daily alert feed.

Fast and cheap to run: it reads Loket's own public data API over plain HTTP, with no browser and no proxy.

### What you can do with it

- **Event promoters and agencies:** track competing concerts, festivals and seminars in your city and their ticket prices.
- **Listing and city-guide sites:** keep an "events this week in Jakarta / Bandung / Surabaya" page up to date.
- **Sponsors and brands:** find events by category (music, business, sports, family) and contact their organizers.
- **Analysts:** price levels, sold-out events and event counts by city and category over time.

### Input

| Field | What it does |
| --- | --- |
| Keywords | Search words, e.g. `konser`, `marathon`, `jakarta`. Each is searched separately. |
| Event types / Categories | Loket's own types (Concert, Festival, Workshop…) and categories (Music, Business, Sports…). |
| Cities | Keeps events whose city contains a word, e.g. `Jakarta` matches Jakarta Pusat and Jakarta Selatan; `Online` for online events. |
| Starts on or after / before | Date window on the event start date. |
| Max price, Free only, On sale only | Price and availability filters. |
| Include event details | Opens each event page: full description, street address, lowest and highest price, organizer page. |
| Event URLs | Scrape specific event pages (details mode). |
| Monitor mode + Monitor key | Save only events that are new or changed since the last run with the same key. |
| Max events | Stop after this many events (default 100). |

Example: concerts in Jakarta with details

```json
{
  "eventTypes": ["Konser"],
  "cities": ["Jakarta"],
  "includeDetails": true,
  "maxItems": 50
}
```

### Output

```json
{
  "name": "ROSETOPIA ASIA TOUR 2026 IN JAKARTA",
  "url": "https://www.loket.com/event/...",
  "organizer": "...",
  "venue": "...",
  "city": "Jakarta Selatan",
  "country": "Indonesia",
  "isOnline": false,
  "startDate": "2026-10-23T20:00:00+07:00",
  "endDate": "2026-10-23T23:00:00+07:00",
  "priceIdr": 1450000,
  "originalPriceIdr": null,
  "isFree": false,
  "hasDiscount": false,
  "salesStatus": "on_sale",
  "badge": null,
  "description": "... (with details)",
  "address": "... (with details)",
  "lowestPriceIdr": 1450000,
  "highestPriceIdr": 3950000,
  "organizerUrl": "https://www.loket.com/o/..."
}
```

`salesStatus` is one of `on_sale`, `not_started`, `sold_out`, `sale_ended`. In monitor mode each row also has `change` (`new` or `changed`), `changedFields` and `previousValues`.

### Monitor mode: daily alerts

1. Set your filters, turn on **Monitor mode** and give it a **Monitor key**, e.g. `jakarta-concerts`.
2. Schedule the run daily in Apify (Schedules).
3. Each run saves only events that are new, or whose price, sales status, dates or venue changed. Unchanged events are not saved and not charged.
4. Connect the dataset to Slack, email, Google Sheets or a webhook through Apify integrations.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Run start | $0.005 per run |
| Event saved | $0.002 per event ($2 per 1,000) |
| Event details (only with **Include event details**) | +$0.003 per event (+$3 per 1,000) |

An event with details costs $5 per 1,000 in total. Example: a full run of ~350 live events with details is 350 × $0.005 + $0.005 start ≈ **$1.76**. Without details it's about $0.71. Unchanged events in monitor mode and failed rows are not charged.

### Limits

- Loket shows only a few hundred live public events at a time (about 350 in October 2026). Past events are not listed.
- Event pages are fetched 2 at a time to stay polite, so a full run with details takes 1-7 minutes. A list-only run takes seconds.
- Fields depend on what the organizer filled in; postal code and badge are often empty.

### FAQ

**Do I need a Loket account or proxy?** No. The Actor reads public pages and Loket's public event list only.

**How do I get daily alerts?** Turn on **Monitor mode**, set a **Monitor key**, and schedule the Actor in Apify. Connect a webhook, Slack, email or Google Sheets integration to the run.

**Can I scrape a single event?** Yes, put its URL in **Event URLs**.

**Does it get ticket buyers or attendee data?** No. Only public event information.

### Responsible use

Not affiliated with or endorsed by Loket. Loket's terms of use restrict automated access; you are responsible for how you use the data and for complying with Loket's terms and Indonesian law, including UU PDP (Law 27/2022) when organizer names refer to individuals. Keep run frequency reasonable.

### Bahasa Indonesia

Ambil semua event publik di Loket.com dalam format JSON, CSV atau Excel: nama event, penyelenggara, venue, kota, jadwal (WIB), harga tiket (IDR) dan status penjualan. Aktifkan **Include event details** untuk deskripsi lengkap, alamat dan rentang harga. **Monitor mode** hanya menyimpan event baru atau yang berubah (harga, status, jadwal, venue) sejak run terakhir, cocok untuk notifikasi harian lewat jadwal Apify.

Cocok untuk promotor, agensi, situs info event, sponsor dan analis. Hanya membaca halaman event publik, tanpa login dan tanpa data pembeli tiket.

**Harga:** $0,005 per run, $0,002 per event ($2 per 1.000), tambahan $0,003 per event dengan detail ($3 per 1.000; total $5 per 1.000). Contoh: ~350 event dengan detail ≈ $1,76 termasuk biaya start.

**Batasan:** Loket hanya menampilkan sekitar 350 event publik yang aktif; event lampau tidak tersedia.

**Penggunaan yang bertanggung jawab:** Tidak berafiliasi dengan Loket. Ketentuan Loket membatasi akses otomatis; Anda bertanggung jawab atas penggunaan data, termasuk kepatuhan pada UU PDP.

# Actor input Schema

## `keywords` (type: `array`):

Search words, e.g. "konser", "jakarta", "marathon". Each keyword is searched separately; leave empty for all events.

## `eventTypes` (type: `array`):

Only these Loket event types. Leave empty for all.

## `categories` (type: `array`):

Only these Loket categories. Leave empty for all.

## `cities` (type: `array`):

Keep events whose city contains any of these words, e.g. "Jakarta" matches Jakarta Pusat and Jakarta Selatan. Use "Online" for online events.

## `dateFrom` (type: `string`):

Only events starting on or after this date.

## `dateTo` (type: `string`):

Only events starting on or before this date.

## `maxPriceIdr` (type: `integer`):

Only events whose lowest ticket price is at most this amount.

## `freeOnly` (type: `boolean`):

Keep only events with free tickets.

## `onSaleOnly` (type: `boolean`):

Skip events that are sold out, not yet on sale, or whose sale has ended.

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

Order in which events are collected; matters when Max events is lower than the number of matches.

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

Open each event page for the full description, street address, highest ticket price and organizer page. Charged as an extra event per item.

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

Scrape these Loket event pages directly (details only). When set, the search filters above are ignored.

## `monitorMode` (type: `boolean`):

Return only events that are new or changed (price, sales status, dates, venue) since the last run with the same monitor key. Unchanged events are not saved or charged.

## `monitorKey` (type: `string`):

Name for this monitor's memory. Use a different key per search you schedule.

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

Stop after this many events.

## Actor input object example

```json
{
  "keywords": [],
  "freeOnly": false,
  "onSaleOnly": false,
  "sortBy": "start_date",
  "includeDetails": false,
  "monitorMode": false,
  "monitorKey": "default",
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one row per event

# 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 = {
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("den_den/loket-events-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 = { "keywords": [] }

# Run the Actor and wait for it to finish
run = client.actor("den_den/loket-events-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 '{
  "keywords": []
}' |
apify call den_den/loket-events-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,den_den/loket-events-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/wXLasKAuhbRDj6wV4/builds/pIHynRWgpZPwjEPoL/openapi.json
