EVE Ref

API Documentation | EVE Ref by thenug

Every page supports HTML, Markdown, and JSON. JSON twins match /api/v1.

Requests

curl http://127.0.0.1:8086/types/587-rifter
curl http://127.0.0.1:8086/types/587-rifter.md
curl http://127.0.0.1:8086/types/587-rifter.json
curl -H 'Accept: text/markdown' http://127.0.0.1:8086/types/587-rifter
curl http://127.0.0.1:8086/api/v1/types/587
curl 'http://127.0.0.1:8086/api/v1/types/34/prices?region=10000002'
curl 'http://127.0.0.1:8086/api/v1/types/34/history?days=30'
curl -X POST http://127.0.0.1:8086/api/v1/appraise -H 'content-type: application/json' -d '{"text":"Tritanium 1000"}'
curl 'http://127.0.0.1:8086/api/v1/search?q=rifter'

MCP

Connect an MCP client to http://127.0.0.1:8086/mcp. It uses stateless Streamable HTTP, needs no key or login, and exposes the same JSON as the site.

Claude Code configuration

Save this as .mcp.json in a Claude Code project.

{
  "mcpServers": {
    "evesite": {
      "type": "http",
      "url": "http://127.0.0.1:8086/mcp"
    }
  }
}

Node client calls

This runnable Node example uses the pinned @modelcontextprotocol/client package.

import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";

const client = new Client({ name: "evesite-example", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(new URL("http://127.0.0.1:8086/mcp")));

await client.callTool({ name: "search", arguments: { q: "rifter" } });
await client.callTool({ name: "get_type", arguments: { type_id: 587 } });
await client.callTool({ name: "get_blueprint", arguments: { blueprint_id: 691 } });
await client.callTool({ name: "get_prices", arguments: { type_id: 34, region_id: 10000002 } });
await client.callTool({ name: "get_history", arguments: { type_id: 34, region_id: 10000002, days: 30 } });
await client.callTool({ name: "list_regions", arguments: {} });
await client.callTool({ name: "appraise", arguments: { text: "Tritanium 1000", region_id: 10000002, station_id: 60003760 } });

await client.close();

Appraisal response

The response contains region, station, snapshot, lines, and totals. Each line contains input, type, quantity, sell, buy, sell_total, buy_total, volume_m3, and source.

Error bodies

{"error":"Not Found","status":404}
{"error":"Too Many Requests","status":429,"detail":"Rate limit exceeded"}

Limits: 600 requests per minute per IP. A 429 response includes Retry-After.