A NodeJS library for doing everything OSRS related. Access the OSRS hiscores, wiki, items, simulating killing monsters, and opening clue caskets - and more.
For discussion, help or questions - please join https://discord.gg/ob and then our #developers
channel.
Automatically generated docs are available at: https://docs.oldschool.gg/
Docs: https://docs.oldschool.gg/classes/hiscores.html
Possible account types: normal, ironman, ultimate, hardcore, deadman, seasonal
You can also pass virtualLevels: true
to receive their stats back in virtual level format, with their skill levels able to go up to 120.
import { Hiscores } from 'oldschooljs';
const lynxTitan = await Hiscores.fetch('Lynx Titan');
const ironHyger = await Hiscores.fetch('Iron Hyger', { type: 'ironman' });
import { Items } from 'oldschooljs';
const twistedBow = Items.get(20997);
if (twistedBow) console.log(twistedBow);
const dragonDagger = Items.get('dragon dagger(p++)');
if (dragonDagger) console.log(dragonDagger);
const dragonItems = Items.filter(item => item.name.includes('Dragon'));
console.log(`Found ${dragonItems.size} Dragon Items!`);
for (const item of dragonItems.values()) {
console.log(item.name);
}
Allows you to simulate killing monsters. The loot is returned in an object, where the key is the item ID and the quantity is the value.
import { Monsters } from 'oldschooljs';
Monsters.map(monster => monster.kill(100));
Monsters.CorporealBeast.kill(100);
Monsters.find(monster => monster.name.aliases.includes('corp')).kill(100);
Monsters.get(319).kill(100);
Allows you to simulate opening clue scroll caskets. The rewards are returned in a format containing the item ID and the quantity.
import { Clues } from 'oldschooljs';
console.log(Clues.Beginner.open(1));
console.log(Clues.Master.open(5));
console.log(Clues.Elite.open());
Docs: https://docs.oldschool.gg/classes/bank.html
The bank class provides a powerful and ergonomic way to construct and interact with item banks.
const bank = new Bank().add('Twisted bow');
const otherBank = new Bank().add('Coal');
const lootTable = new LootTable().add(;
bank
.add(otherBank)
.add({ Coal: 1 })
.add('Coal')
.add('Coal', 500)
.add({ 124: 500 })
.add(lootTable.roll())
.add(CorporealBeast.kill());
console.log(bank.values());
Docs: https://docs.oldschool.gg/classes/loottable.html
For a good demonstration of using Loot tables, refer to the oldschooljs code for Monsters and Clues, which all use loottables, a good example is Corp: https://github.com/oldschoolgg/oldschooljs/blob/master/src/simulation/monsters/bosses/CorporealBeast.ts
Here is a trimmed-down example of corp:
const CorporealBeastTable = new LootTable()
.add('Spirit shield', 1, 8)
.add('Holy elixir', 1, 3)
.oneIn(585, SigilTable)
.tertiary(5000, 'Pet dark core');
CorporealBeastTable.roll();
import { Wiki } from 'oldschooljs';
const searchResults = await Wiki.search('Twisted bow');
if (searchResults.length === 0) console.log('Found no results');
else console.log(`Search found these pages: ${searchResults.map(page => page.title)}`);
const randomPages = await Wiki.random(10);
console.log(`Search found these pages: ${searchResults.map(page => page.title)}`);
const twistedBowPage = await Wiki.fetchPage(82098);
console.log(twistedBowPage);
import { Util } from 'oldschooljs';
console.log(Util.isValidUsername(username)); // true
KMB Syntax is how numbers are often formatted in runescape, for example: 5k, 1.5m, 5m, 1b, etc.
Util.toKMB(5); // '5'
Util.toKMB(1000); // '1k'
Util.toKMB(1000000); // '1m'
Util.toKMB(1200000000); // '1.2b'
Util.fromKMB('5'); // 5
Util.fromKMB('1k'); // 1000
Util.fromKMB('1m'); // 1000000
Util.fromKMB('1.2b'); // 1200000000