# OSRS Grand Exchange Price Scraper - Live Item Prices & Margins (`ninhothedev/runescape-ge-scraper`) Actor

$0.50/1K 🔥 OSRS Grand Exchange scraper! Live item prices, volumes & flip margins. No key. JSON, CSV, Excel or API in seconds. Find flips & track the RuneScape economy ⚡

- **URL**: https://apify.com/ninhothedev/runescape-ge-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.50 / 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

## OSRS Grand Exchange Price Scraper - Live Item Prices, Volumes & Flip Margins

Scrape **live Old School RuneScape Grand Exchange prices** for every tradeable item: instant-buy and instant-sell prices, 24-hour trade volumes, buy limits, high/low alchemy values and ready-calculated **flip margins**. No API key, no login, no proxy required.

This Actor joins three official OSRS Wiki real-time price endpoints (item mapping, latest prices, 24h volumes) into one clean, flat row per item, so you get everything you need for flipping and economy analysis in a single dataset.

### What you get

One row per Grand Exchange item:

| Field | Description |
| --- | --- |
| `item_id` | OSRS item ID |
| `name` | Item name (e.g. `Dragon scimitar`) |
| `examine` | In-game examine text |
| `members` | `true` for members-only items |
| `buy_limit` | 4-hour Grand Exchange buy limit |
| `high_price` | Latest instant-buy price in gp |
| `high_time` | ISO-8601 UTC timestamp of that trade |
| `low_price` | Latest instant-sell price in gp |
| `low_time` | ISO-8601 UTC timestamp of that trade |
| `margin` | `high_price - low_price` (gp profit per flip, before tax) |
| `margin_pct` | Margin as a percentage of the low price |
| `volume_24h` | Units traded in the last 24 hours |
| `high_alch` / `low_alch` | High and low alchemy values |
| `shop_value` | Base shop value |
| `icon_url` | Item icon image on the wiki |
| `wiki_url` | Item page on the OSRS Wiki |
| `source` | Always `osrs-wiki` |
| `scraped_at` | ISO-8601 UTC scrape timestamp |

All fields are nullable - items that have not traded recently simply return `null` prices instead of breaking your pipeline.

#### Example output

```json
{
  "item_id": 1540,
  "name": "Anti-dragon shield",
  "examine": "This provides partial protection from dragonbreath attacks.",
  "members": false,
  "buy_limit": 125,
  "high_price": 118,
  "high_time": "2026-07-28T11:55:56+00:00",
  "low_price": 116,
  "low_time": "2026-07-28T11:54:42+00:00",
  "margin": 2,
  "margin_pct": 1.72,
  "volume_24h": 11011,
  "high_alch": 12,
  "low_alch": 8,
  "shop_value": 20,
  "icon_url": "https://oldschool.runescape.wiki/images/Anti-dragon_shield.png",
  "wiki_url": "https://oldschool.runescape.wiki/w/Anti-dragon_shield",
  "source": "osrs-wiki",
  "scraped_at": "2026-07-28T12:02:37+00:00"
}
```

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | select | `prices` | Currently `prices`: mapping + latest prices + volumes joined per item |
| `nameFilter` | string | *(empty)* | Case-insensitive substring filter, e.g. `dragon`, `rune`, `potion` |
| `membersOnly` | boolean | `false` | Only return members-only items |
| `maxItems` | integer | `500` | Max items to push (maximum `5000`) |

```json
{
  "mode": "prices",
  "nameFilter": "dragon",
  "membersOnly": false,
  "maxItems": 500
}
```

### Use cases

- **OSRS flipping** - sort by `margin` and `margin_pct`, filter by `volume_24h` and `buy_limit` to find items that actually fill, and calculate profit per buy-limit cycle.
- **Price tracking** - schedule the Actor every few minutes and build a historical price series for any item or basket of items.
- **Game economy analysis** - study inflation, item sinks, update-driven price shocks and supply/demand across the whole GE.
- **Bots & tools** - power Discord price bots, flipping spreadsheets, mobile companion apps, merching alerts and Google Sheets dashboards.

### Pricing

Roughly **$0.5 per 1,000 items** scraped. The Actor makes only three HTTP requests total no matter how many items you request, so full-catalogue runs are fast and cheap.

### How it works & fair use

Data comes from the official OSRS Wiki real-time prices API. The wiki's API policy **requires a descriptive User-Agent** that identifies the tool and gives the maintainers a way to make contact, so this Actor always sends:

```
ninhothedev-osrs-scraper/1.0 daniello@biwo-bauwelt.com
```

Please do not hammer the endpoints - prices refresh on the order of minutes, so scheduling a run every 5 minutes or slower is more than enough and keeps the free community API healthy for everyone.

This project is unofficial and not affiliated with Jagex Ltd. Old School RuneScape is a trademark of Jagex Ltd.

### Related Actors

- [Steam Deals Scraper](https://apify.com/ninhothedev/steam-deals-scraper)
- [GOG Games Scraper](https://apify.com/ninhothedev/gog-games-scraper)
- [Hearthstone Scraper](https://apify.com/ninhothedev/hearthstone-scraper)
- [Steam Charts Scraper](https://apify.com/ninhothedev/steam-charts-scraper)

# Actor input Schema

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

What to scrape. 'prices' joins the OSRS Wiki item mapping, the latest high/low Grand Exchange prices and the 24-hour trade volumes into one row per item.

## `nameFilter` (type: `string`):

Optional case-insensitive substring filter on the item name. For example 'dragon' returns Dragon scimitar, Dragon boots, Anti-dragon shield and similar. Leave empty to scrape all items.

## `membersOnly` (type: `boolean`):

If enabled, only members-only items are returned and all free-to-play items are skipped.

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

Maximum number of items to push to the dataset. Items are processed in the wiki's alphabetical mapping order. Default 500, maximum 5000.

## Actor input object example

```json
{
  "mode": "prices",
  "nameFilter": "dragon",
  "membersOnly": false,
  "maxItems": 500
}
```

# 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("ninhothedev/runescape-ge-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("ninhothedev/runescape-ge-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 ninhothedev/runescape-ge-scraper --silent --output-dataset

```

## MCP server setup

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