warframe-nexus-query
A Node.js library for querying Warframe item prices from the Warframe.Market API.
Features
- š Support for both Warframe Market API v1 and v2
- š Real-time price statistics (median, min, max, average)
- š„ Live trader information with online status (v2)
- š Full internationalization support (12 languages)
- š® Multi-platform support (PC, PlayStation, Xbox, Nintendo Switch)
- š¾ Smart caching with version-based invalidation
- š± Discord webhook integration ready
Installation
npm install --save warframe-nexus-query
Quick Start
import PriceCheckQuerier from 'warframe-nexus-query';
const querier = new PriceCheckQuerier({ logger: console });
// Query item prices
const results = await querier.priceCheckQuery('loki prime', 'pc');
console.log(results);
// Get Discord-formatted attachments
const attachments = await querier.priceCheckQueryAttachment('ash prime systems', undefined, 'pc');
console.log(attachments);
// Clean up when done
await querier.stopUpdating();
API
Constructor
const querier = new PriceCheckQuerier(options);
Options:
logger- Logger instance (default:console)marketCache- Custom cache implementation (optional)skipMarket- Skip market data fetching (default:false)
Methods
priceCheckQuery(query, platform)
Query item prices and return raw result objects.
Parameters:
query(string) - Item name to search forplatform(string) - Platform:'pc','ps4','playstation','xb1','xbox','xbone','swi','switch','ns'
Returns: Promise<Array<Summary>> - Array of price summary objects
const results = await querier.priceCheckQuery('nova prime set', 'pc');
priceCheckQueryString(query, platform)
Query item prices and return formatted string.
Parameters:
query(string) - Item name to search forplatform(string) - Platform identifier
Returns: Promise<string> - Formatted price string
const priceString = await querier.priceCheckQueryString('maiming strike', 'pc');
console.log(priceString); // "Maiming Strike: 150p (avg)"
priceCheckQueryAttachment(query, priorResults, platform)
Query item prices and return Discord-formatted embeds.
Parameters:
query(string) - Item name to search forpriorResults(Array|undefined) - Prior query results to use instead of fetching new dataplatform(string) - Platform identifier
Returns: Promise<Array<Object>> - Array of Discord embed objects
const embeds = await querier.priceCheckQueryAttachment('condition overload', undefined, 'pc');
// Send embeds to Discord webhook
await fetch(webhookUrl, {
method: 'POST',
body: JSON.stringify({ embeds }),
headers: { 'Content-Type': 'application/json' },
});
stopUpdating()
Clean up resources and stop background updates.
await querier.stopUpdating();
Environment Variables
| Variable | Description | Default | Example |
|---|---|---|---|
WARFRAME_MARKET_API_VERSION |
API version to use | v1 |
v2 |
MARKET_TIMEOUT |
API request timeout (ms) | 30000 |
60000 |
MARKET_CACHE_PATH |
Cache directory path | ./cache |
/tmp/wf-cache |
MARKET_V2_URL_OVERRIDE |
Custom v2 API base URL | - | https://custom.api/v2 |
API Version Selection
Switch between v1 and v2 APIs:
# Use v2 API (recommended)
WARFRAME_MARKET_API_VERSION=v2 node app.js
# Use v1 API (legacy)
WARFRAME_MARKET_API_VERSION=v1 node app.js
API v2 Features
The v2 API includes enhanced features:
- Version-based caching - Automatic cache invalidation when items update
- Real-time trader data - See who's online and ready to trade
- Trader activity - View current in-game activity (mission, dojo, relay, etc.)
- User reputation - Trader reputation scores
- Crossplay support - Trade across platforms
- Better performance - Optimized endpoints for faster queries
v2 Example Response
{
item: 'Ash Prime Systems',
prices: {
selling: { median: 15, average: 18.5, min: 10, max: 30 },
buying: { median: 12, average: 11.8, min: 8, max: 15 }
},
traders: [
{
user: 'TraderName',
platinum: 15,
quantity: 3,
status: 'online',
reputation: 156,
activity: 'In Dojo'
}
]
}
Platform Aliases
The following platform identifiers are supported:
| Platform | Aliases |
|---|---|
| PC | pc |
| PlayStation | ps4, playstation |
| Xbox | xb1, xbox, xbone |
| Nintendo Switch | swi, switch, ns |
Response Objects
Summary Object
Result object returned by priceCheckQuery():
{
type: 'market-v2', // 'market' for v1, 'market-v2' for v2
item: 'Item Name',
platform: 'pc',
componentName: 'Set',
prices: {
selling: {
median: 100,
average: 105.5,
min: 80,
max: 150,
count: 25
},
buying: {
median: 90,
average: 88.2,
min: 60,
max: 95,
count: 15
}
},
traders: [ // v2 only
{
user: 'Username',
platinum: 100,
quantity: 2,
status: 'online', // 'online' | 'ingame' | 'offline'
reputation: 250,
activity: 'On Mission'
}
]
}
Discord Embed Object
Result object returned by priceCheckQueryAttachment():
{
title: 'Ash Prime Systems [PC]',
url: 'https://warframe.market/items/ash_prime_systems',
thumbnail: { url: 'https://warframe.market/static/assets/...' },
color: 0x336699,
fields: [
{
name: 'Selling',
value: 'š° 15p (median)\nš 10-30p range\nš¦ 25 orders',
inline: true
},
{
name: 'Buying',
value: 'š° 12p (median)\nš 8-15p range\nš¦ 15 orders',
inline: true
},
{
name: 'š¢ Online Traders',
value: 'TraderName: 15p x3'
}
],
footer: {
text: 'Warframe Market ⢠Updated 2 minutes ago'
}
}
Examples
Basic Price Check
import PriceCheckQuerier from 'warframe-nexus-query';
const querier = new PriceCheckQuerier({ logger: console });
// Search for an item
const results = await querier.priceCheckQuery('nikana prime', 'pc');
results.forEach((result) => {
console.log(`${result.item} - ${result.componentName}`);
console.log(`Median sell price: ${result.prices.selling.median}p`);
console.log(`Median buy price: ${result.prices.buying.median}p`);
});
await querier.stopUpdating();
Discord Bot Integration
import PriceCheckQuerier from 'warframe-nexus-query';
import { Client, GatewayIntentBits } from 'discord.js';
const bot = new Client({ intents: [GatewayIntentBits.Guilds] });
const querier = new PriceCheckQuerier({ logger: console });
bot.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'price') {
const item = interaction.options.getString('item');
const platform = interaction.options.getString('platform') || 'pc';
const embeds = await querier.priceCheckQueryAttachment(item, undefined, platform);
if (embeds.length > 0) {
await interaction.reply({ embeds });
} else {
await interaction.reply('No results found for that item.');
}
}
});
bot.login(process.env.DISCORD_TOKEN);
Multi-Platform Price Comparison
import PriceCheckQuerier from 'warframe-nexus-query';
const querier = new PriceCheckQuerier({ logger: console });
const platforms = ['pc', 'ps4', 'xbox', 'switch'];
for (const platform of platforms) {
const results = await querier.priceCheckQuery('Trinity Prime Set', platform);
if (results.length > 0) {
const price = results[0].prices.selling.median;
console.log(`${platform.toUpperCase()}: ${price}p`);
}
}
await querier.stopUpdating();
Testing
# Run tests
npm test
# Run linter
npm run lint
# Generate coverage report
npm run coverage
# Generate API documentation
npm run build:docs
Development
# Clone repository
git clone https://github.com/WFCD/warframe-nexus-query.git
cd warframe-nexus-query
# Install dependencies
npm install
# Run tests in watch mode
npm test -- --watch
# Lint and auto-fix
npm run lint:fix
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
Licensed under the Apache License 2.0. See LICENSE for details.
Links
Acknowledgments
- Built by the Warframe Community Developers
- Powered by Warframe.Market API
- Maintained by tobitenno and contributors