# Mamikos Kost Scraper (`stone_jadex/mamikos-kost-scraper`) Actor

Public Mamikos kost (Indonesian boarding house) listings discovered via the public sitemap, with detail-page structured data.

- **URL**: https://apify.com/stone_jadex/mamikos-kost-scraper.md
- **Developed by:** [Stone Jade](https://apify.com/stone_jadex) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.75 / 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

## Mamikos Kost Scraper — Indonesian boarding-house listings with real monthly prices

Get structured kost (boarding house) listings from Mamikos, Indonesia's largest kost platform: current monthly price, room/shared/bathroom facilities, gender type, ratings and remaining rooms — clean JSON for rental marketplaces, relocation tools and market research, with no scraper maintenance on your side.

### Who it is for

- Rental marketplaces and relocation services building an Indonesia kost feed
- Property and pricing researchers tracking rents by city and neighbourhood
- Student-housing platforms comparing facilities, gender type and availability
- Anyone who needs kost data in JSON/CSV instead of browsing listing by listing

Why this one: the price comes from each page's own price card (the freshest figure on the page, not stale metadata), facilities are split into room/shared/bathroom/nearby lists, and "no count published" is reported as null — never a guessed 0.

### Real sample records

From a verified run (October 2026):

| Listing | Area | Monthly price | Type | Rating |
|---|---|---|---|---|
| Kost Surya Boarding House Sukasari Bandung | Sukasari, Kota Bandung | 1,200,000 IDR | Mixed | 3.4 (4 reviews), 3 rooms left |
| Kost Tca Tujuh Tipe Non Ac Sukajadi Bandung | Sukajadi, Bandung | 1,200,000 IDR | Mixed | 5.0 (1 review) |

### Example output

One real record, exactly as delivered (all 27 fields):

```json
{
  "listingId": "kost-kota-bandung-kost-campur-eksklusif-kost-surya-boarding-house-sukasari-bandung-1",
  "url": "https://mamikos.com/room/kost-kota-bandung-kost-campur-eksklusif-kost-surya-boarding-house-sukasari-bandung-1",
  "title": "Kost Surya Boarding House Sukasari Bandung",
  "propertyType": "kost",
  "genderType": "mixed",
  "priceMinIdr": 1200000,
  "priceMaxIdr": 1200000,
  "priceMonthlyIdr": 1200000,
  "currency": "IDR",
  "streetAddress": "Sukasari, Kota Bandung, Indonesia",
  "locality": "Sukasari",
  "region": "Kota Bandung",
  "country": "Indonesia",
  "latitude": -6.8678523,
  "longitude": 107.5772308,
  "coverImageUrl": "https://static.mamikos.com/uploads/cache/data/style/2020-11-05/t7qQ4fZK-360x480.jpg",
  "facilitiesRoom": ["Kasur", "Lemari / Storage", "Meja"],
  "facilitiesShared": ["Dapur", "R. Santai", "R. Jemur", "K. Mandi Luar", "WiFi"],
  "facilitiesBathroom": ["K. Mandi Dalam", "Shower", "Kloset Jongkok", "Air panas", "Ember mandi"],
  "facilitiesNearby": ["Warung makan / Rumah makan", "Mini market / Warung kelontong", "ATM / Bank", "Apotek / Klinik", "Kampus / Sekolah", "Halte Bus / Pos Ojek", "Pusat belanja / Mall", "Masjid"],
  "rating": 3.4,
  "reviewCount": 4,
  "availableRooms": 3,
  "sourceUpdatedAt": "2026-10-02T13:31:03+07:00",
  "detailFetched": true,
  "description": null,
  "scrapedAt": "2026-10-18T09:35:09.055Z"
}
```

#### All fields

| Field | Meaning |
|---|---|
| listingId / url | Listing slug and canonical detail URL |
| title / propertyType | Page title; always `kost` in this mode |
| genderType | male / female / mixed, from the page's own gender field |
| priceMonthlyIdr | Current monthly price from the page's price card |
| priceMinIdr / priceMaxIdr | The same single monthly price mirrored (it is one price, not a range) |
| currency | `IDR` when a price exists |
| streetAddress / locality / region / country | Structured address as published |
| latitude / longitude | Coordinates when the page publishes them |
| coverImageUrl | First photo of the page gallery |
| facilitiesRoom / facilitiesShared / facilitiesBathroom / facilitiesNearby | Facility names as published; the bathroom list describes the bathroom and fixtures, not a bathroom count |
| rating / reviewCount | `0` together means no rating and no reviews yet |
| availableRooms | Specific remaining-room count when the page publishes one; null when it publishes none — the embedded structured data used here cannot distinguish "available, count unpublished" from "full" (the rendered page shows a status label, but no structured field separates them), so no count is guessed |
| sourceUpdatedAt | When the page's price card was updated |
| detailFetched / scrapedAt | Detail read success, and when this run read the page |
| description | Only when `includeDescription` is true, otherwise null |

### Price

**$0.00175 per listing — $1.75 per 1,000 listings.** No run-start fee.

### How to start

1. Click **Start** (or call the Actor via API) — no setup needed.
2. For a first test, try the prefilled example input (5 listings).
3. Download results as JSON, CSV or Excel, or read them from the dataset API.

Example input:

```json
{ "maxItems": 5, "includeDescription": false }
```

Parameters: `maxItems` (default 50), `includeDescription` (default false), `sitemapIndexUrl` (Mamikos detail sitemap index), `proxyConfiguration` (proxy settings; direct connection by default). Filters: `keyword`, `cityContains`, `genderType`, `maxPriceIdr`. Listings are discovered from the public sitemap and read one by one at ~1 request/second honouring crawl-delay; the OUTPUT record reports `sitemapFiles` (detail sitemaps in the site index) and `discoveredUrls` (this run's discovery pool) — the site-wide listing total is not published by the sitemap index, so `discoveredUrls` is not a site total. Detail pages that fail are listed with their reason in OUTPUT `skippedDetails`.

### Limits and compliance

- Only publicly visible pages are read: no login, no captcha solving.
- Landlord names and phone numbers are never collected.
- Prices, ratings and availability reflect the page at scrape time (`sourceUpdatedAt` shows when the page itself last updated its price card).
- You are responsible for checking the site's terms and your local law before using the data commercially.

# Actor input Schema

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

Maximum unique kost listings to collect from the public sitemap.

## `sitemapIndexUrl` (type: `string`):

Public Mamikos detail sitemap index. Sub-sitemaps are followed in order.

## `includeDescription` (type: `boolean`):

Include the listing description from structured data.

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

Direct by default. Residential proxy use should stay within 5 MB per run.

## `keyword` (type: `string`):

Only keep listings whose title contains this text.

## `cityContains` (type: `string`):

Only keep listings whose locality or region contains this text.

## `genderType` (type: `string`):

male, female or mixed. Empty keeps all.

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

0 keeps all prices.

## Actor input object example

```json
{
  "maxItems": 50,
  "sitemapIndexUrl": "https://mamikos.com/sitemaps/sitemap/sitemap-index-detail-kost.xml",
  "includeDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "keyword": "",
  "cityContains": "",
  "genderType": "",
  "maxPriceIdr": 0
}
```

# Actor output Schema

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

Scraped items in the default dataset.

# 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("stone_jadex/mamikos-kost-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("stone_jadex/mamikos-kost-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 stone_jadex/mamikos-kost-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stone_jadex/mamikos-kost-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/hRpktJo0SKKQLL8Dv/builds/ewe6EJ09ZI7dvNfhe/openapi.json
