# RuneScape

> Read RuneScape's own public data: Grand Exchange prices and price history, the hiscores, clans, RuneMetrics profiles and quest logs, the bestiary and the live player count, from the endpoints Jagex publishes for the game. Price any item by name, chart how it has moved, read a player's every skill and activity, see who leads a skill, list a clan's members, follow a player's adventurer's log, look up a monster's weakness, or post how many people are online. No account or API key is required.

App · Gaming · 14 actions. Web page: https://docs.lodol.com/docs/integrations/runescape

## Actions

### Get clan members

Everyone in a clan, from the owner down to the newest recruit, with each member's rank, total experience and kills, plus the totals: how many members, how much experience between them, who has the most, and how many hold each rank. A clan that does not exist comes back marked not found rather than failing.

**Inputs**

- Clan (`clan`, text, required): The clan's name, spelled as it is in game.

**Outputs**

- `average_xp` (number): Experience per member.
- `clan` (text)
- `found` (true/false): False when there is no such clan.
- `highest_xp_member` (object)
- `member_count` (number)
- `members` (list): Highest rank first.
- `most_kills_member` (object)
- `not_found_note` (text): Set only when there is no such clan, saying so. Empty otherwise.
- `owner` (text)
- `rank_counts` (object): How many members hold each rank, Owner first.
- `total_kills` (number)
- `total_xp` (number)
- `total_xp_text` (text)

**Example output**

```json
{
  "average_xp": 2351241512,
  "clan": "Maxed",
  "found": true,
  "highest_xp_member": {
    "kills": 6,
    "player": "Jad",
    "rank": "Admin",
    "total_xp": 5386253335,
    "total_xp_text": "5.4b"
  },
  "member_count": 497,
  "members": [
    {
      "kills": 5,
      "player": "Bit of Class",
      "rank": "Owner",
      "total_xp": 4866427375,
      "total_xp_text": "4.9b"
    },
    {
      "kills": 116,
      "player": "Pogmathon",
      "rank": "Deputy Owner",
      "total_xp": 5196335062,
      "total_xp_text": "5.2b"
    }
  ],
  "most_kills_member": {
    "kills": 31079,
    "player": "Shooter",
    "rank": "Admin",
    "total_xp": 4306299800,
    "total_xp_text": "4.3b"
  },
  "not_found_note": "",
  "owner": "Bit of Class",
  "rank_counts": {
    "Admin": 345,
    "Coordinator": 3,
    "Deputy Owner": 4,
    "General": 116,
    "Organiser": 14,
    "Overseer": 3,
    "Owner": 1,
    "Recruit": 11
  },
  "total_kills": 99628,
  "total_xp": 1168566292766,
  "total_xp_text": "1.2t"
}
```

### Get item price

What one item is worth on the Grand Exchange right now: the exact price, how many traded over the last day, how far the price moved today and over the last 30, 90 and 180 days, the examine text, the category and whether it is members only, with a link to its icon ready for a message. The item is picked by name rather than by id.

**Inputs**

- Item (`item`, text, required): The item to look up. Pick it from the list, or use the name exactly as it appears in game when it comes from an earlier step.

**Outputs**

- `attribution` (object): Credit to show wherever the wiki's data is republished.
- `category` (text): The Grand Exchange category the item is filed under.
- `change_180d_percent` (number)
- `change_30d_percent` (number): How far the price moved over the last 30 days, in percent.
- `change_90d_percent` (number)
- `change_today` (number): How many coins the price moved today. Negative for a fall.
- `change_today_text` (text)
- `examine` (text): The item's in-game examine text.
- `exchange_url` (text): Link to the item's Grand Exchange page on the wiki.
- `guide_price` (number): The price as Jagex's item database quotes it, rounded to three figures. The exact price is in 'price'.
- `guide_price_text` (text)
- `icon_url` (text): Link to the item's inventory icon, ready to use in a message.
- `image_url` (text): Link to the larger picture of the item.
- `item_id` (number): The item's id in game.
- `item_name` (text)
- `members` (true/false): True when the item can only be used on a members' world.
- `price` (number): The Grand Exchange's current price for one, in coins, exact. Empty for an item it has never priced.
- `price_age_hours` (number): How many hours ago that was.
- `price_age_note` (text): Set only when the price is days old or missing, saying so. Empty otherwise.
- `price_text` (text): The same price the way a player reads it, such as '1.4b'.
- `price_updated_at` (text): When the Grand Exchange last set this price (ISO 8601, UTC).
- `trend_today` (text): One of 'positive', 'negative' or 'neutral'.
- `volume` (number): How many changed hands over the last day. Empty for the items the exchange publishes no volume for.

**Example output**

```json
{
  "attribution": {
    "license": "CC BY-NC-SA 3.0",
    "license_url": "https://creativecommons.org/licenses/by-nc-sa/3.0/",
    "text": "Item names and exact prices from the RuneScape Wiki; everything else from Jagex's public RuneScape endpoints",
    "url": "https://runescape.wiki"
  },
  "category": "Melee weapons - high level",
  "change_180d_percent": -16.0,
  "change_30d_percent": -8.0,
  "change_90d_percent": -14.0,
  "change_today": 2207,
  "change_today_text": "2.2k",
  "examine": "A weapon from the Abyss.",
  "exchange_url": "https://runescape.wiki/w/Exchange:Abyssal_whip",
  "guide_price": 70000,
  "guide_price_text": "70k",
  "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=4151",
  "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=4151",
  "item_id": 4151,
  "item_name": "Abyssal whip",
  "members": true,
  "price": 69981,
  "price_age_hours": 23,
  "price_age_note": "",
  "price_text": "70k",
  "price_updated_at": "2026-10-08T07:42:06Z",
  "trend_today": "positive",
  "volume": 307
}
```

### Get monster stats

One monster's entry in the bestiary: combat level, life points, weakness, combat stats, the experience a kill gives, its Slayer category and the level needed, where it is found, and whether it is aggressive, poisonous or members only. Takes a name or an id; a name with no monster comes back marked not found rather than failing.

**Inputs**

- Monster (`monster`, text, required): The monster's name, as the bestiary spells it, or its id from a search.

**Outputs**

- `aggressive` (true/false)
- `areas` (list): Where it is found.
- `attack` (number)
- `attackable` (true/false)
- `combat_level` (number)
- `defence` (number)
- `examine` (text)
- `found` (true/false): False when the bestiary has no such monster.
- `life_points` (number)
- `magic` (number)
- `matched_by_search` (true/false): True when no monster had exactly that name and the first whose name contains it was used.
- `members` (true/false)
- `monster_id` (number)
- `name` (text)
- `not_found_note` (text): Set only when there is no such monster, saying so. Empty otherwise.
- `poisonous` (true/false)
- `ranged` (number)
- `requested` (text)
- `size` (number): In game squares.
- `slayer_category` (text)
- `slayer_level` (number): The Slayer level needed. Empty when none is.
- `weakness` (text): The attack style it is weak to. Empty when it has no weakness.
- `wiki_url` (text)
- `xp` (number): Combat experience for one kill.

**Example output**

```json
{
  "aggressive": false,
  "areas": [
    "RuneScape Surface",
    "The Abyss",
    "Ancient cavern",
    "Slayer Tower Resource Dungeon"
  ],
  "attack": 70,
  "attackable": true,
  "combat_level": 98,
  "defence": 70,
  "examine": "A denizen of the Abyss!",
  "found": true,
  "life_points": 8500,
  "magic": 1,
  "matched_by_search": false,
  "members": true,
  "monster_id": 1615,
  "name": "Abyssal demon",
  "not_found_note": "",
  "poisonous": false,
  "ranged": 1,
  "requested": "Abyssal demon",
  "size": 1,
  "slayer_category": "Abyssal Demons",
  "slayer_level": 85,
  "weakness": "Slashing",
  "wiki_url": "https://runescape.wiki/w/Abyssal_demon",
  "xp": 628.6
}
```

### Get player count

How many people are playing RuneScape and Old School RuneScape right now, and how many accounts have ever been created. The number the game's own website shows, ready for a dashboard or a scheduled post.

**Inputs**: None.

**Outputs**

- `accounts_created` (number)
- `accounts_created_text` (text)
- `measured_at` (text)
- `note` (text)
- `online_now` (number)
- `online_now_text` (text)

**Example output**

```json
{
  "accounts_created": 341504883,
  "accounts_created_text": "341,504,883",
  "measured_at": "2026-10-09T07:15:12Z",
  "note": "The online count covers RuneScape and Old School RuneScape together; Jagex publishes no split.",
  "online_now": 74887,
  "online_now_text": "74,887"
}
```

### Get player profile

A player's RuneMetrics profile: combat level, total level and experience, every skill, how many quests they have finished, started and not begun, and the latest entries of their adventurer's log, the in-game record of boss kills, drops and level-ups. Profiles are private unless the player opts in; a private one comes back marked unavailable with the reason rather than failing.

**Inputs**

- Player (`player`, text, required): The player's display name, spelled as they spell it.
- Log entries (`activities`, number): How many adventurer's log entries to include, newest first. RuneMetrics keeps the last 20. From 0 to 20. Default: `20`.

**Outputs**

- `activities` (list): The adventurer's log, newest first.
- `activity_count` (number)
- `available` (true/false): False when the profile cannot be read.
- `combat_level` (number)
- `found` (true/false): False when RuneMetrics knows no such player.
- `highest_xp_skill` (text)
- `latest_activity_at` (text)
- `magic_xp` (number)
- `melee_xp` (number)
- `note` (text): Says why the profile is unavailable, when it is.
- `overall_rank` (number)
- `player` (text)
- `quests_completed` (number)
- `quests_not_started` (number)
- `quests_started` (number)
- `ranged_xp` (number)
- `skills` (list): Every skill, Attack first.
- `total_level` (number)
- `total_xp` (number)
- `total_xp_text` (text)
- `unavailable_reason` (text): 'private', 'not a member' or 'no such player' when the profile cannot be read. Empty otherwise.

**Example output**

```json
{
  "activities": [
    {
      "at": "2025-04-11T09:38:00Z",
      "details": "I killed 2 Kalphite Kings.",
      "text": "I killed 2 Kalphite Kings."
    },
    {
      "at": "2025-04-11T09:12:00Z",
      "details": "I killed  the King Black Dragon, which was once the biggest, meanest dragon around.",
      "text": "I killed  the King Black Dragon."
    }
  ],
  "activity_count": 2,
  "available": true,
  "combat_level": 152,
  "found": true,
  "highest_xp_skill": "Attack",
  "latest_activity_at": "2025-04-11T09:38:00Z",
  "magic_xp": 200000000,
  "melee_xp": 3000000000,
  "note": "",
  "overall_rank": 1,
  "player": "Its Dave",
  "quests_completed": 317,
  "quests_not_started": 45,
  "quests_started": 2,
  "ranged_xp": 200000000,
  "skills": [
    {
      "level": 120,
      "name": "Attack",
      "rank": 1155,
      "skill_id": 0,
      "xp": 200000000,
      "xp_text": "200m"
    },
    {
      "level": 120,
      "name": "Necromancy",
      "rank": 1,
      "skill_id": 28,
      "xp": 200000000,
      "xp_text": "200m"
    }
  ],
  "total_level": 3232,
  "total_xp": 5800000000,
  "total_xp_text": "5.8b",
  "unavailable_reason": ""
}
```

### Get player quests

Every quest and whether the player has completed it, started it or not begun, with each quest's difficulty, quest points and whether they meet its requirements, plus the counts and the quest points earned so far. Filter to just the finished, in-progress or unstarted ones. Needs a public RuneMetrics profile.

**Inputs**

- Player (`player`, text, required): The player's display name, spelled as they spell it.
- Show (`status`, text): Which quests to list. One of: `any` (Every quest), `completed`, `started` (In progress), `not_started` (Not started). Default: `any`.

**Outputs**

- `available` (true/false): False when RuneMetrics returned no quests, which is what a private profile or an unknown name gets.
- `completed_count` (number)
- `eligible_to_start` (number): How many unstarted quests the player already qualifies for.
- `not_started_count` (number)
- `note` (text)
- `player` (text)
- `quest_count` (number)
- `quest_points_available` (number): Quest points from every quest in the game.
- `quest_points_earned` (number)
- `quests` (list): The quests matching the filter, alphabetical.
- `started_count` (number)
- `status` (text): The filter applied.

**Example output**

```json
{
  "available": true,
  "completed_count": 317,
  "eligible_to_start": 27,
  "not_started_count": 45,
  "note": "",
  "player": "Its Dave",
  "quest_count": 2,
  "quest_points_available": 476,
  "quest_points_earned": 431,
  "quests": [
    {
      "difficulty": 250,
      "difficulty_name": "Special",
      "eligible": true,
      "members": true,
      "quest_points": 2,
      "status": "started",
      "title": "Dimension of Disaster",
      "wiki_url": "https://runescape.wiki/w/Dimension_of_Disaster"
    },
    {
      "difficulty": 2,
      "difficulty_name": "Experienced",
      "eligible": true,
      "members": true,
      "quest_points": 2,
      "status": "started",
      "title": "Dimension of Disaster: Defender of Varrock",
      "wiki_url": "https://runescape.wiki/w/Dimension_of_Disaster:_Defender_of_Varrock"
    }
  ],
  "started_count": 2,
  "status": "started"
}
```

### Get player stats

A player's hiscores entry in full: every skill's level, experience and rank, every activity they are ranked in, their total level and overall rank, how many skills they have at 99 and at 120, and their highest skill. Read from the main, Ironman or Hardcore Ironman hiscores. A name that is not ranked comes back marked not found rather than failing, so a lookup workflow can answer instead of breaking.

**Inputs**

- Player (`player`, text, required): The player's display name, spelled as they spell it.
- Hiscores (`mode`, text): Which hiscores to read. Ironman and Hardcore Ironman accounts are ranked on their own boards as well as the main one. One of: `standard` (Main hiscores), `ironman` (Ironman hiscores), `hardcore` (Hardcore Ironman hiscores). Default: `standard`.

**Outputs**

- `activities` (list): Every activity, ranked or not.
- `found` (true/false): False when the name is not on the hiscores.
- `highest_xp_skill` (text)
- `hiscores_url` (text)
- `lowest_level_skill` (text)
- `mode` (text)
- `mode_description` (text)
- `not_found_note` (text): Set only when the player is not ranked, saying so. Empty otherwise.
- `overall_rank` (number)
- `player` (text): The name as the hiscores spell it.
- `ranked_activities` (number)
- `skills` (list): Every skill, in the game's order.
- `skills_at_120` (number)
- `skills_at_99` (number)
- `total_level` (number)
- `total_xp` (number)
- `total_xp_text` (text)

**Example output**

```json
{
  "activities": [
    {
      "activity_id": 2,
      "name": "Dominion Tower",
      "rank": 140,
      "ranked": true,
      "score": 26445855
    },
    {
      "activity_id": 32,
      "name": "Leagues: Catalyst",
      "rank": null,
      "ranked": false,
      "score": 0
    }
  ],
  "found": true,
  "highest_xp_skill": "Attack",
  "hiscores_url": "https://secure.runescape.com/m=hiscore/compare?user1=Zezima",
  "lowest_level_skill": "Defence",
  "mode": "standard",
  "mode_description": "the main hiscores",
  "not_found_note": "",
  "overall_rank": 6559,
  "player": "Zezima",
  "ranked_activities": 18,
  "skills": [
    {
      "level": 120,
      "name": "Attack",
      "rank": 358,
      "skill_id": 1,
      "xp": 200000000,
      "xp_text": "200m"
    },
    {
      "level": 120,
      "name": "Necromancy",
      "rank": 46601,
      "skill_id": 29,
      "xp": 109998811,
      "xp_text": "110m"
    }
  ],
  "skills_at_120": 13,
  "skills_at_99": 29,
  "total_level": 3232,
  "total_xp": 5709998811,
  "total_xp_text": "5.7b"
}
```

### Get price history

How an item's Grand Exchange price has moved over the last week, month, three months or six, as one point per day ready to chart plus the summary a reader actually wants: where it started, where it is now, how far it moved in coins and percent, and its high and low and the day each happened.

**Inputs**

- Item (`item`, text, required): The item to look up. Pick it from the list, or use the name exactly as it appears in game when it comes from an earlier step.
- Period (`period`, text): How far back to look. One of: `7d` (Last 7 days), `30d` (Last 30 days), `90d` (Last 90 days), `180d` (Last 180 days). Default: `30d`.

**Outputs**

- `average_price` (number)
- `change` (number): Coins gained or lost over the period.
- `change_percent` (number)
- `direction` (text): One of 'up', 'down', 'flat' or 'unknown'.
- `exchange_url` (text): Link to the item's Grand Exchange page on the wiki.
- `highest_price` (number)
- `highest_price_on` (text)
- `icon_url` (text): Link to the item's inventory icon, ready to use in a message.
- `image_url` (text): Link to the larger picture of the item.
- `item_id` (number): The item's id in game.
- `item_name` (text)
- `latest_price` (number)
- `lowest_price` (number)
- `lowest_price_on` (text)
- `period` (text)
- `period_description` (text)
- `period_end` (text)
- `period_start` (text): The first day with a price, as YYYY-MM-DD.
- `point_count` (number)
- `points` (list): One point per day, oldest first.
- `starting_price` (number)
- `summary_note` (text): Set only when the item had no prices at all. Empty otherwise.

**Example output**

```json
{
  "average_price": 68245,
  "change": 3579,
  "change_percent": 5.39,
  "direction": "up",
  "exchange_url": "https://runescape.wiki/w/Exchange:Abyssal_whip",
  "highest_price": 69981,
  "highest_price_on": "2026-10-08",
  "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=4151",
  "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=4151",
  "item_id": 4151,
  "item_name": "Abyssal whip",
  "latest_price": 69981,
  "lowest_price": 66402,
  "lowest_price_on": "2026-10-03",
  "period": "7d",
  "period_description": "the last 7 days",
  "period_end": "2026-10-08",
  "period_start": "2026-10-03",
  "point_count": 6,
  "points": [
    {
      "average_30d": 73408,
      "date": "2026-10-03",
      "price": 66402,
      "price_text": "66.4k"
    },
    {
      "average_30d": 71650,
      "date": "2026-10-08",
      "price": 69981,
      "price_text": "70k"
    }
  ],
  "starting_price": 66402,
  "summary_note": ""
}
```

### Get prices for several items

Price a whole watchlist at once and see what it adds up to: the exact price and daily volume of each item, what one of each would cost together, and which is the most and least valuable. Use this rather than one step per item: the whole list is priced in a single request, so a hundred items cost exactly what one does.

**Inputs**

- Items (`items`, list, required): The items to price. Pick as many as you like; they are all priced in one request, up to 100.

**Outputs**

- `attribution` (object): Credit to show wherever the wiki's data is republished.
- `item_count` (number)
- `items` (list): Every item, in the order chosen.
- `items_without_prices` (number): How many items the exchange has never priced.
- `least_valuable` (object)
- `most_valuable` (object)
- `prices_updated_at` (text): When the newest of the prices was set.
- `total` (number): What one of every item would cost together. Empty when any item has no price.
- `total_text` (text)

**Example output**

```json
{
  "attribution": {
    "license": "CC BY-NC-SA 3.0",
    "license_url": "https://creativecommons.org/licenses/by-nc-sa/3.0/",
    "text": "Item names and exact prices from the RuneScape Wiki; everything else from Jagex's public RuneScape endpoints",
    "url": "https://runescape.wiki"
  },
  "item_count": 2,
  "items": [
    {
      "exchange_url": "https://runescape.wiki/w/Exchange:Bond",
      "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=29492",
      "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=29492",
      "item_id": 29492,
      "item_name": "Bond",
      "price": 145401610,
      "price_age_hours": 23,
      "price_age_note": "",
      "price_text": "145.4m",
      "price_updated_at": "2026-10-08T07:42:06Z",
      "volume": null
    },
    {
      "exchange_url": "https://runescape.wiki/w/Exchange:Nature_rune",
      "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=561",
      "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=561",
      "item_id": 561,
      "item_name": "Nature rune",
      "price": 393,
      "price_age_hours": 23,
      "price_age_note": "",
      "price_text": "393",
      "price_updated_at": "2026-10-08T07:42:06Z",
      "volume": 9468204
    }
  ],
  "items_without_prices": 0,
  "least_valuable": {
    "exchange_url": "https://runescape.wiki/w/Exchange:Nature_rune",
    "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=561",
    "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=561",
    "item_id": 561,
    "item_name": "Nature rune",
    "price": 393,
    "price_age_hours": 23,
    "price_age_note": "",
    "price_text": "393",
    "price_updated_at": "2026-10-08T07:42:06Z",
    "volume": 9468204
  },
  "most_valuable": {
    "exchange_url": "https://runescape.wiki/w/Exchange:Bond",
    "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=29492",
    "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=29492",
    "item_id": 29492,
    "item_name": "Bond",
    "price": 145401610,
    "price_age_hours": 23,
    "price_age_note": "",
    "price_text": "145.4m",
    "price_updated_at": "2026-10-08T07:42:06Z",
    "volume": null
  },
  "prices_updated_at": "2026-10-08T07:42:06Z",
  "total": 145402003,
  "total_text": "145.4m"
}
```

### Get the top clans

The three clans with the most experience between their members, which is all the clan hiscores publish: each with its member count, its total and the average per member.

**Inputs**: None.

**Outputs**

- `clan_count` (number)
- `clans` (list): Most experience first.

**Example output**

```json
{
  "clan_count": 2,
  "clans": [
    {
      "average_xp_per_member": 2732009625,
      "average_xp_per_member_text": "2.7b",
      "clan": "Efficiency Experts",
      "member_count": 498,
      "rank": 1,
      "total_xp": 1360540793266,
      "total_xp_text": "1.4t"
    },
    {
      "average_xp_per_member": 2351240026,
      "average_xp_per_member_text": "2.4b",
      "clan": "Maxed",
      "member_count": 497,
      "rank": 2,
      "total_xp": 1168566292766,
      "total_xp_text": "1.2t"
    }
  ]
}
```

### Get top players

Who leads a skill or an activity: up to fifty players from any rank down, with their experience or score, from the main, Ironman or Hardcore Ironman hiscores. Start further down the board to page through it, or to see where a particular rank sits.

**Inputs**

- Leaderboard (`leaderboard`, text): Whether to rank a skill or an activity. One of: `skill` (A skill), `activity` (An activity). Default: `skill`.
- Skill (`skill`, text): The skill to rank by experience. Only when Leaderboard is A skill. One of: `Overall`, `Attack`, `Defence`, `Strength`, `Constitution`, `Ranged`, `Prayer`, `Magic`, `Cooking`, `Woodcutting`, and 20 more. Default: `Overall`.
- Activity (`activity`, text): The activity to rank by score. Only when Leaderboard is An activity. One of: `Bounty Hunter`, `Bounty Hunter Rogues`, `Dominion Tower`, `The Crucible`, `Castle Wars Games`, `Barbarian Assault Attackers`, `Barbarian Assault Defenders`, `Barbarian Assault Collectors`, `Barbarian Assault Healers`, `Duel Tournament`, and 22 more. Default: `RuneScore`.
- Hiscores (`mode`, text): Which hiscores to read. Ironman and Hardcore Ironman accounts are ranked on their own boards as well as the main one. One of: `standard` (Main hiscores), `ironman` (Ironman hiscores), `hardcore` (Hardcore Ironman hiscores). Default: `standard`.
- How many (`limit`, number): How many entries to return. From 1 to 50. Default: `10`.
- Starting rank (`starting_rank`, number): The rank to start from. Leave empty for the top. At least 1.

**Outputs**

- `board` (text): The skill or activity ranked.
- `first_rank` (number)
- `last_rank` (number)
- `leaderboard` (text)
- `mode` (text)
- `mode_description` (text)
- `player_count` (number)
- `players` (list): Best first.
- `score_means` (text): 'experience' for a skill, 'score' otherwise.

**Example output**

```json
{
  "board": "Overall",
  "first_rank": 1,
  "last_rank": 2,
  "leaderboard": "skill",
  "mode": "standard",
  "mode_description": "the main hiscores",
  "player_count": 2,
  "players": [
    {
      "hiscores_url": "https://secure.runescape.com/m=hiscore/compare?user1=Its%20Dave",
      "player": "Its Dave",
      "rank": 1,
      "score": 5800000000,
      "score_text": "5.8b"
    },
    {
      "hiscores_url": "https://secure.runescape.com/m=hiscore/compare?user1=Raul",
      "player": "Raul",
      "rank": 2,
      "score": 5800000000,
      "score_text": "5.8b"
    }
  ],
  "score_means": "experience"
}
```

### List items in a category

Browse the Grand Exchange the way its own site does: one of its 51 categories, the items whose names start with a chosen letter, twelve to a page, each with its price, today's change, examine text and icon. Comes with how many pages there are, so a workflow can walk a whole category.

**Inputs**

- Category (`category`, text): The Grand Exchange category to browse. One of: `Miscellaneous`, `Ammo`, `Arrows`, `Bolts`, `Construction materials`, `Construction products`, `Cooking ingredients`, `Costumes`, `Crafting materials`, `Familiars`, and 41 more. Default: `Melee weapons - high level`.
- Starting with (`letter`, text): The first letter of the item names to list, or # for names that start with a number. Default: `a`.
- Page (`page`, number): Which page of twelve items to return. At least 1. Default: `1`.

**Outputs**

- `category` (text)
- `category_id` (number)
- `has_more` (true/false): True when there is a page after this one.
- `item_count` (number)
- `items` (list): This page's items, in the exchange's order.
- `items_in_category` (number)
- `items_under_letter` (number)
- `letter` (text)
- `page` (number)
- `page_count` (number): How many pages the letter has in this category.

**Example output**

```json
{
  "category": "Costumes",
  "category_id": 7,
  "has_more": true,
  "item_count": 1,
  "items": [
    {
      "category": "Costumes",
      "change_today": 0,
      "change_today_text": "0",
      "examine": "A nice hat from a cracker.",
      "exchange_url": "https://runescape.wiki/w/Exchange:Red_partyhat",
      "guide_price": 57600000000,
      "guide_price_text": "57.6b",
      "icon_url": "https://secure.runescape.com/m=itemdb_rs/obj_sprite.gif?id=1038",
      "image_url": "https://secure.runescape.com/m=itemdb_rs/obj_big.gif?id=1038",
      "item_id": 1038,
      "item_name": "Red partyhat",
      "members": false,
      "trend_today": "neutral"
    }
  ],
  "items_in_category": 443,
  "items_under_letter": 37,
  "letter": "r",
  "page": 1,
  "page_count": 4
}
```

### Look up players' clans

Which clan each of up to twenty players is in and the title they wear, in one request. The way to tell whether a name belongs to a real player, and the one place a player's clan is published.

**Inputs**

- Players (`players`, list, required): The players to look up, as a list or separated by commas, up to 20.

**Outputs**

- `found_count` (number)
- `not_found` (list): The names the website does not know.
- `player_count` (number)
- `players` (list): One entry per name asked for, in order.

**Example output**

```json
{
  "found_count": 2,
  "not_found": [],
  "player_count": 2,
  "players": [
    {
      "clan": "Zezima Clan",
      "clan_recruiting": true,
      "found": true,
      "player": "Zezima",
      "title": null
    },
    {
      "clan": "Goblin Slayerz",
      "clan_recruiting": true,
      "found": true,
      "player": "Maikeru",
      "title": null
    }
  ]
}
```

### Search the bestiary

Find monsters by name in the game's bestiary and get back each one's id and combat level with a link to its wiki page. Every monster whose name contains a word of the search is listed, so 'dragon' finds them all. Use it to find the exact name before reading a monster's stats.

**Inputs**

- Search (`query`, text, required): Part of a monster's name.
- How many (`limit`, number): How many entries to return. From 1 to 50. Default: `10`.

**Outputs**

- `monster_count` (number)
- `monsters` (list): In the bestiary's order.
- `query` (text)
- `total_matches` (number): How many monsters match in total.

**Example output**

```json
{
  "monster_count": 2,
  "monsters": [
    {
      "combat_level": 98,
      "monster_id": 1615,
      "name": "Abyssal demon",
      "wiki_url": "https://runescape.wiki/w/Abyssal_demon"
    },
    {
      "combat_level": 72,
      "monster_id": 2263,
      "name": "Abyssal leech",
      "wiki_url": "https://runescape.wiki/w/Abyssal_leech"
    }
  ],
  "query": "abyssal",
  "total_matches": 22
}
```
