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.
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 'https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=4151'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);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()){
"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 'https://secure.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=4151'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);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()){
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
item | query | Required | Numeric item id. The same ids are used across both games. 4151 |
m | path segment | Required | Game selector inside the path: `m=itemdb_rs` for RuneScape, `m=itemdb_oldschool` for Old School RuneScape. m=itemdb_rs |
category | query | Optional | Category id, used by the `catalogue/items.json` browse endpoint rather than by `detail.json`. 1 |
alpha | query | Optional | First 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
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Percentage Calculator
Calculate what X% of a number is, what percent one number is of another, and percentage increase or decrease between two values — instantly and free.
Number to Words Converter
Convert numbers to words in English, including decimals, negatives and a currency mode for dollars and cents. Free online number-to-words spelling tool.
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.