Market Prices
No token needed Runs nightly against live ESIFetches average market prices and price history for a specific item. Uses the Forge region (Jita's region) for history data.
Calls: market.getMarketPrices · market.getMarketHistory · market.getMarketGroups · market.getMarketGroupInformation · market.fetchAllMarketTypes · market.fetchAllMarketOrders
Run it
bash
git clone https://github.com/lgriffin/ESI.ts.git && cd ESI.ts
npm ci
npm run example:marketexamples/market-prices.ts on GitHub. The imports below are written as a consumer of the package writes them; the file in the repository imports from ../src.
Source
ts
import { EsiClient } from '@lgriffin/esi.ts';
import { createConsoleLogger } from '@lgriffin/esi.ts';
// The program's own output. The client logs through the same console sink
// at ESI_LOG_LEVEL (default warn), so its diagnostics stay out of the way.
const log = createConsoleLogger('info');
const esiLog = createConsoleLogger();
const FORGE_REGION_ID = 10000002;
const TRITANIUM_TYPE_ID = 34;
const PLEX_TYPE_ID = 44992;
async function main() {
const client = new EsiClient({ logger: esiLog });
try {
log.info('Market Data\n');
// Fetch global average prices and Tritanium history in parallel
const [prices, tritHistory] = await Promise.all([
client.market.getMarketPrices(),
client.market.getMarketHistory(FORGE_REGION_ID, TRITANIUM_TYPE_ID),
]);
// Show a few notable item prices
const notableItems = [
{ id: TRITANIUM_TYPE_ID, name: 'Tritanium' },
{ id: PLEX_TYPE_ID, name: 'PLEX' },
{ id: 11399, name: 'Raven (Battleship)' },
{ id: 587, name: 'Rifter (Frigate)' },
];
log.info('Average Prices (Universe-wide)');
log.info('-'.repeat(50));
for (const item of notableItems) {
const price = prices.find((p: any) => p.type_id === item.id);
if (price) {
const avg =
price.average_price?.toLocaleString(undefined, {
maximumFractionDigits: 2,
}) ?? 'N/A';
const adj =
price.adjusted_price?.toLocaleString(undefined, {
maximumFractionDigits: 2,
}) ?? 'N/A';
log.info(
` ${item.name.padEnd(22)} avg: ${avg.padStart(18)} adj: ${adj.padStart(18)}`,
);
}
}
// Show recent Tritanium history in The Forge
log.info('\nTritanium Price History (The Forge, last 5 days)');
log.info('-'.repeat(70));
log.info(' Date Average Lowest Highest Volume');
const recent = tritHistory.slice(-5);
for (const day of recent) {
const date = day.date;
const avg = day.average.toFixed(2).padStart(12);
const low = day.lowest.toFixed(2).padStart(12);
const high = day.highest.toFixed(2).padStart(12);
const vol = day.volume.toLocaleString().padStart(14);
log.info(` ${date} ${avg} ${low} ${high} ${vol}`);
}
log.info(`\nTotal items with price data: ${prices.length}`);
// Market groups: the browser tree in the in-game market window
const groupIds = await client.market.getMarketGroups();
const firstGroupId = groupIds[0];
log.info(`\nMarket groups: ${groupIds.length}`);
if (firstGroupId !== undefined) {
const group = await client.market.getMarketGroupInformation(firstGroupId);
log.info(` ${group.name}: ${group.types.length} type(s)`);
}
// Everything traded in a small region, and its live orders (all pages)
const PURE_BLIND_REGION_ID = 10000023;
const [tradedTypes, orders] = await Promise.all([
client.market.fetchAllMarketTypes(PURE_BLIND_REGION_ID),
client.market.fetchAllMarketOrders(PURE_BLIND_REGION_ID),
]);
const buys = orders.filter((o) => o.is_buy_order).length;
log.info(
`Pure Blind: ${tradedTypes.length} types traded, ${orders.length} orders (${buys} buy, ${orders.length - buys} sell)`,
);
} catch (err) {
log.error('Request failed', { error: err });
process.exit(1);
} finally {
await client.shutdown();
}
}
main();