# Minecraft Server Status Scraper - Players, MOTD & Version (`ninhothedev/minecraft-server-scraper`) Actor

$0.45/1K 🔥 Minecraft server scraper! Players online, version, MOTD & mods for any Java or Bedrock server. No key. JSON, CSV, Excel or API in seconds. Power server lists & monitoring ⚡

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

## Pricing

from $0.45 / 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?

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

## Minecraft Server Status Scraper 🟩

**Check any Minecraft server in seconds — players online, version, MOTD, software, plugins, mods and icon — for both Java Edition and Bedrock Edition. No API key, no login, no proxies.**

This Apify actor turns a list of Minecraft server addresses into a clean, structured dataset. Feed it `mc.hypixel.net`, `play.cubecraft.net` or a thousand community servers, and get back one row per server with everything you need to build a server list, a monitoring dashboard or an uptime report.

***

### What this Minecraft server scraper does

- ✅ **Java Edition status** — players online/max, version string, protocol name & number, server software, MOTD, plugins, mods, EULA-block flag and favicon presence
- ✅ **Bedrock Edition status** — same core fields plus the reported **gamemode**
- ✅ **Offline servers included** — unreachable servers still return a row with `online: false` so you can chart downtime instead of losing the data point
- ✅ **Player sample** — up to 20 visible player names when the server exposes its player list
- ✅ **Clean MOTD** — the colour-coded Minecraft MOTD is stripped of formatting codes and joined into a single readable line
- ✅ **Batch friendly** — up to 2,000 hosts per run, checked concurrently in batches of 50
- ✅ **Datacenter-clean** — runs on standard Apify proxies or no proxy at all

### Use cases

| Use case | How this actor helps |
| --- | --- |
| **Minecraft server monitoring** | Schedule the actor every 5–15 minutes and alert when `online` flips to `false` or `players_online` collapses. |
| **Minecraft server lists** | Populate a server-list website or Discord bot with live player counts, MOTDs and versions without maintaining your own ping infrastructure. |
| **Gaming dashboards** | Push results into Google Sheets, BigQuery or Grafana to visualise player trends across your network and your competitors. |
| **Uptime & SLA reporting** | Build a historical uptime record for hosting customers, network owners or your own community. |

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | select | `servers` | `servers` for Java Edition hosts, `bedrock` for Bedrock/Pocket Edition hosts. |
| `hosts` | array | `["mc.hypixel.net","play.cubecraft.net"]` | Server addresses, one per line. Plain hostnames like `mc.hypixel.net`, optionally with a port (`example.com:25566`). |
| `maxItems` | integer | `200` | Hard cap on how many servers are checked in this run (max 2,000). |

```json
{
  "mode": "servers",
  "hosts": ["mc.hypixel.net", "play.cubecraft.net", "mc.mineplex.com"],
  "maxItems": 200
}
```

### Output

One dataset item per server. Every field is nullable — offline servers only return a handful of them.

```json
{
  "host": "mc.hypixel.net",
  "online": true,
  "ip": "172.65.197.160",
  "port": 25565,
  "hostname": "mc.hypixel.net",
  "version": "Requires MC 1.8 / 1.21",
  "protocol_name": "1.8.9",
  "protocol_version": 47,
  "software": null,
  "motd": "Hypixel Network [1.8/26.2] | SKYBLOCK 0.26.1 | SUMMER EVENT",
  "players_online": 27125,
  "players_max": 200000,
  "player_sample": [],
  "plugin_count": null,
  "mod_count": null,
  "gamemode": null,
  "eula_blocked": false,
  "icon_present": true,
  "ping_ms": null,
  "source": "mcsrvstat",
  "scraped_at": "2026-07-28T12:47:18.913576+00:00"
}
```

| Field | Meaning |
| --- | --- |
| `host` | Exactly the address you supplied (your join key). |
| `online` | `true` if the server responded to a status ping. |
| `ip`, `port`, `hostname` | Resolved connection details, including SRV resolution. |
| `version`, `protocol_name`, `protocol_version` | Advertised version string and protocol handshake data. |
| `software` | Server software when advertised (Paper, Spigot, Velocity, …). |
| `motd` | Clean MOTD lines joined with `" \| "`, capped at 500 characters. |
| `players_online`, `players_max` | Current and maximum player slots. |
| `player_sample` | Up to 20 visible player names (many big servers hide this). |
| `plugin_count`, `mod_count` | Number of advertised plugins / mods when query is enabled. |
| `gamemode` | Bedrock only — e.g. `Survival`. |
| `eula_blocked` | Server blocked by Mojang's EULA enforcement. |
| `icon_present` | Whether the server returns a favicon. |
| `ping_ms` | Ping latency when reported numerically, otherwise `null`. |

### Pricing

Roughly **$0.5 per 1,000 servers checked**, plus Apify platform usage. A 200-server monitoring run costs about **$0.10**. Because status data is cached upstream for ~1 minute, polling faster than once per minute adds cost without adding fresh data.

### How it works

The actor queries the public **mcsrvstat.us API v3** (Java and Bedrock endpoints) with a descriptive User-Agent, retries with backoff, and normalises everything into a flat schema. Requests are made with `curl_cffi` (Chrome 124 TLS fingerprint) and fall back to plain `urllib` if needed — so it works from datacenter IPs without proxies.

### Tips

- Use plain hostnames, not `https://` URLs — the actor strips schemes for you, but clean input is faster.
- Bedrock hosts must be run in `bedrock` mode; querying a Bedrock server in Java mode returns `online: false`.
- Schedule runs with the Apify Scheduler and use the dataset's `scraped_at` to build time series.
- `player_sample` is empty for most large networks — that's the server hiding its list, not a scraping failure.

### Related actors

- [Steam Charts Scraper](https://apify.com/ninhothedev/steam-charts-scraper) — live player counts for Steam games
- [Twitch Streams Scraper](https://apify.com/ninhothedev/twitch-streams-scraper) — live streams, viewers and categories
- [Website Uptime Monitor](https://apify.com/ninhothedev/website-uptime-monitor) — HTTP uptime and response-time checks
- [Steam Deals Scraper](https://apify.com/ninhothedev/steam-deals-scraper) — discounts and price history on Steam

### Legal

This actor reads publicly available server status data (the same handshake any Minecraft client performs) via a public API. It collects no personal data beyond the player names a server chooses to broadcast publicly. It is not affiliated with, endorsed by, or associated with Mojang Studios or Microsoft.

# Actor input Schema

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

What kind of Minecraft servers to check. 'Java servers' queries the classic Java Edition status endpoint (port 25565 by default). 'Bedrock servers' queries the Bedrock/Pocket Edition endpoint (port 19132 by default) and additionally returns the gamemode.

## `hosts` (type: `array`):

List of Minecraft server addresses to check, one per line. Use plain host names such as 'mc.hypixel.net' or 'play.cubecraft.net'; a custom port can be appended like 'example.com:25566'. Offline or unreachable servers are still returned with online = false.

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

Maximum number of servers to check in this run. Extra hosts beyond this limit are ignored, which keeps runs cheap and predictable.

## Actor input object example

```json
{
  "mode": "servers",
  "hosts": [
    "mc.hypixel.net",
    "play.cubecraft.net"
  ],
  "maxItems": 200
}
```

# 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 = {
    "hosts": [
        "mc.hypixel.net",
        "play.cubecraft.net"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ninhothedev/minecraft-server-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 = { "hosts": [
        "mc.hypixel.net",
        "play.cubecraft.net",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ninhothedev/minecraft-server-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 '{
  "hosts": [
    "mc.hypixel.net",
    "play.cubecraft.net"
  ]
}' |
apify call ninhothedev/minecraft-server-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ninhothedev/minecraft-server-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/vNrW9vnIq3HFkTcu4/builds/pw6eb9rwUb9kZDdnD/openapi.json
