Skip to content

Market Prices ​

No token needed Runs nightly against live ESI

Fetches 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:market

examples/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();

Released under the GPL-3.0-or-later license.