BYTETOOLS

RuneScape Grand Exchange API

Jagex's official Grand Exchange price API for RuneScape and Old School RuneScape. Item prices, daily trends and 30/90/180-day movement, no key required. Tested example.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the RuneScape Grand Exchange API?

The RuneScape Grand Exchange API is Jagex's own item pricing endpoint. It returns the current guide price for any tradeable item along with today's movement and the percentage change over 30, 90 and 180 days, for both RuneScape and Old School RuneScape, with no API key.

This is a first-party endpoint that has outlived most of the fan tooling built on top of it, and switching between games is a single path token: `m=itemdb_rs` for RuneScape, `m=itemdb_oldschool` for Old School. Same item id, same response shape, different market — our capture of the Abyssal whip (item 4151) showed 78.5k on RS3 and 788.1k on OSRS from otherwise identical requests.

Now the awkward part, and it is genuinely awkward. Prices are strings with magnitude suffixes: `"78.5k"`, and for expensive items `"1.2m"` or `"2.1b"`. Today's movement is a signed string with a space after the sign — `"- 571"` — and percentages are strings with a `%` on the end. `members` is the string `"true"`, not a boolean. On top of that, the endpoint declares `Content-Type: text/html` while returning JSON, so strict clients refuse to parse it. None of this is hard to handle, but all of it has to be handled deliberately, and none of it is mentioned where the endpoint is documented.

Quick facts

Base URL
https://secure.runescape.com/m=itemdb_rs/api
Authentication
No key or account. Jagex serves this publicly as part of the game website; it asks that automated clients not poll aggressively.
Rate limit
No published limit and no headers. Guide prices update roughly once a day, so polling more than a few times a day gains nothing and risks being blocked.
Pricing
Free, operated by Jagex.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the RuneScape Grand Exchange API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Look up the Grand Exchange price of an Abyssal whip

GET https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4151

curl
curl 'https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4151'
JavaScript (fetch)
const res = await fetch("https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4151");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4151", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "item": {
    "icon": "https://secure.runescape.com/m=itemdb_rs/1786962701838_obj_sprite.gif?id=4151",
    "icon_large": "https://secure.runescape.com/m=itemdb_rs/1786962701838_obj_big.gif?id=4151",
    "id": 4151,
    "type": "Melee weapons - high level",
    "typeIcon": "https://www.runescape.com/img/categories/Melee weapons - high level",
    "name": "Abyssal whip",
    "description": "A weapon from the Abyss.",
    "current": {
      "trend": "neutral",
      "price": "78.5k"
    },
    "today": {
      "trend": "negative",
      "price": "- 571"
    },
    "members": "true",
    "day30": {
      "trend": "negative",
      "change": "-6.0%"
    },
    "day90": {
      "trend": "negative",
      "change": "-9.0%"
    },
    "day180": {
      "trend": "negative",
      "change": "-2.0%"
    }
  }
}

2. Fetch the Old School RuneScape price for the same item

GET https://secure.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=4151

curl
curl 'https://secure.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=4151'
JavaScript (fetch)
const res = await fetch("https://secure.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=4151");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://secure.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=4151", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
{
  "item": {
    "icon": "https://secure.runescape.com/m=itemdb_oldschool/1787135309163_obj_sprite.gif?id=4151",
    "icon_large": "https://secure.runescape.com/m=itemdb_oldschool/1787135309163_obj_big.gif?id=4151",
    "id": 4151,
    "type": "Default",
    "typeIcon": "https://www.runescape.com/img/categories/Default",
    "name": "Abyssal whip",
    "description": "A weapon from the Abyss.",
    "current": {
      "trend": "neutral",
      "price": "788.1k"
    },
    "today": {
      "trend": "negative",
      "price": "- 5,425"
    },
    "members": "true",
    "day30": {
      "trend": "negative",
      "change": "-21.0%"
    },
    "day90": {
      "trend": "negative",
      "change": "-34.0%"
    },
    "day180": {
      "trend": "negative",
      "change": "-40.0%"
    }
  }
}

Parameters

ParameterTypeRequiredDescription
itemqueryRequiredNumeric item id. The same ids are used across both games. 4151
mpath segmentRequiredGame selector inside the path: `m=itemdb_rs` for RuneScape, `m=itemdb_oldschool` for Old School RuneScape. m=itemdb_rs
categoryqueryOptionalCategory id, used by the `catalogue/items.json` browse endpoint rather than by `detail.json`. 1
alphaqueryOptionalFirst letter filter for the browse endpoint. Use `%23` for items starting with a digit. a

Response fields

item.idinteger
The item id you requested. One of the few genuinely numeric fields in the response.
item.name / descriptionstring
Item name and its in-game examine text.
item.current.pricestring
Current guide price — but abbreviated once it passes 100,000, so `78.5k` rather than 78500. Parse the k/m/b suffix.
item.current.trendstring
`positive`, `negative` or `neutral`. This is what to colour your arrow on, not the sign of the price string.
item.today.pricestring
Today's change as a signed string with a space after the sign, for example `- 571`. Strip the space before parsing.
item.membersstring
The string `"true"` or `"false"`, not a boolean. Comparing it with `===` against a real boolean always fails.
item.day30 / day90 / day180object
Each has a `trend` and a `change` percentage string such as `-6.0%`.
item.icon / icon_largestring
Sprite URLs with a cache-busting timestamp baked into the path — the URL changes between requests, so do not use it as a cache key.
item.typeIconstring
A URL containing unescaped spaces. Encode it before use or your HTTP client may reject it.

What you can build with the RuneScape Grand Exchange API

  • Show live item prices on a RuneScape fan site or wiki
  • Build a flipping or margin calculator for the Grand Exchange
  • Alert a Discord channel when an item's 30-day trend reverses
  • Compare RS3 and OSRS prices for the same item side by side
  • Value a player's bank by summing item prices

Common errors and how to fix them

An empty body or a redirect to the site

The item id does not exist or is not tradeable.

Fix: Validate ids against the catalogue browse endpoint; untradeable items are simply absent rather than returning a 404 JSON body.

A JSON parse failure in a strict client

The endpoint declares `Content-Type: text/html` while returning JSON.

Fix: Parse the body explicitly instead of relying on content-type-based decoding.

Wrong numbers after parsing

You read `current.price` as a number and got 78.5 instead of 78500.

Fix: Expand the k/m/b suffix before converting, and remember the value is a plain integer string below 100,000.

Requests silently blocked

Polling too frequently from one address.

Fix: Prices update about once a day. Fetch on a schedule, cache, and serve from your own store.

RuneScape Grand Exchange API — frequently asked questions

Is the RuneScape Grand Exchange API official?

Yes — it is served by Jagex from secure.runescape.com as part of the game website, and it needs no key or account. That makes it the authoritative source for guide prices, though it updates only about once a day.

How do I get Old School RuneScape prices?

Change the path token from `m=itemdb_rs` to `m=itemdb_oldschool`. Everything else — item ids, parameters, response shape — is identical, so one client can serve both games with a single variable.

Why is the price a string like 78.5k?

Jagex abbreviates guide prices above 100,000 for display and the API returns that same display string. You have to expand the k, m or b suffix yourself; there is no numeric field alongside it.

How is this different from the OSRS Wiki prices API?

This one returns Jagex's daily guide price, which lags on volatile items. The OSRS Wiki API reports actual real-time trades with timestamps. Use this for stable, official valuations and the Wiki API for anything that needs to be current to the minute.

Tools that pair with this API

RuneScape Grand Exchange is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.