{"name":"EVE-Kill API","version":"1.0.0","baseUrl":"https://api.eve-kill.com","description":"Public read-only API powering eve-kill.com. All endpoints are JSON, CORS-open, and cached behind Cloudflare + Redis. No auth required.","categories":[{"key":"health","label":"Health","endpoints":[{"method":"GET","path":"/health","summary":"Database health check","returns":"{ status: 'ok' | 'degraded', db: boolean }"}]},{"key":"killmails","label":"Killmails","description":"Read killmails, fittings, and ESI-format payloads.","endpoints":[{"method":"GET","path":"/killmails/count","summary":"Estimated total killmail count","description":"Fast estimated row count from pg_class.reltuples. Not exact — use for dashboards and scale indicators, not for anything that requires precision.","returns":"{ count: number }"},{"method":"GET","path":"/killmails","summary":"Filtered killmail list","description":"Cursor-paginated killmail feed with type filters (security, ship class, solo, NPC, etc.) and optional victim faction filter.","query":[{"name":"type","type":"enum","default":"latest","values":["latest","highsec","lowsec","nullsec","wspace","abyssal","solo","npc","big","citadel","capitals","freighters","supercarriers","titans","frigates","destroyers","cruisers","battlecruisers","battleships","t1","t2","t3","5b","10b"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."},{"name":"victimFactions","type":"string","description":"Comma-separated faction IDs, e.g. 500001,500002"}],"returns":"{ data: Killmail[], pagination: { hasMore, cursor } }"},{"method":"GET","path":"/killmails/:killmailId","summary":"Full killmail detail","description":"Victim, attackers, items, prices, and sibling kills from the same fight.","pathParams":[{"name":"killmailId","type":"int","required":true,"example":110000000}]},{"method":"GET","path":"/killmails/:killmailId/fitting","summary":"Fitting grouped by slot","description":"Items organised by slot (high, mid, low, rig, drone, cargo, etc.) with resolved type names and quantities.","pathParams":[{"name":"killmailId","type":"int","required":true}]},{"method":"GET","path":"/killmails/:killmailId/eft","summary":"EFT plain-text fit","description":"Returns an EFT-compatible fitting block for pasting into Pyfa / EFT / the in-game fitting tool.","pathParams":[{"name":"killmailId","type":"int","required":true}]},{"method":"GET","path":"/killmails/:killmailId/esi","summary":"ESI-compatible killmail","description":"Killmail in the exact shape CCP's /killmails/{id}/{hash}/ endpoint returns. No resolved names.","pathParams":[{"name":"killmailId","type":"int","required":true}]},{"method":"POST","path":"/killmails/search","summary":"Bulk killmail search (ESI format)","description":"Returns killmails in ESI format within a time window, optionally filtered by location and/or entity. Filter categories are AND-ed together, IDs within a category are OR-ed, and entity filters (character/corporation/alliance) match either attackers OR the victim. Each filter field is capped at 15 IDs and at most 3 filter categories may be combined per request to keep query plans tight. Cursor-paginated on killmail_id: pass the previous response's pagination.cursor as `after` to walk backwards in time through the window.","body":{"contentType":"application/json","fields":{"from":{"type":"date","required":true,"description":"ISO8601 timestamp or YYYY-MM-DD. Matched against killmail_time."},"to":{"type":"date","required":true,"description":"ISO8601 timestamp or YYYY-MM-DD. Max 7 days after `from`."},"limit":{"type":"int","default":100,"description":"Page size (1–100)"},"after":{"type":"int","description":"Cursor — previous response's pagination.cursor (a killmail_id)"},"system_ids":{"type":"int[]","description":"OR-list of solar_system_id filters","maxItems":15},"constellation_ids":{"type":"int[]","description":"OR-list of constellation_id filters","maxItems":15},"region_ids":{"type":"int[]","description":"OR-list of region_id filters","maxItems":15},"character_ids":{"type":"int[]","description":"Matches attacker OR victim character_id","maxItems":15},"corporation_ids":{"type":"int[]","description":"Matches attacker OR victim corporation_id","maxItems":15},"alliance_ids":{"type":"int[]","description":"Matches attacker OR victim alliance_id","maxItems":15}},"example":{"from":"2026-04-07T00:00:00Z","to":"2026-04-08T00:00:00Z","region_ids":[10000002],"limit":100}},"returns":"{ data: KillmailEsi[], pagination: { hasMore, cursor } }","notes":"Time window is capped at 7 days. Max 100 killmails per page, max 15 IDs per filter field, max 3 filter categories combined per request. Subsequent pages follow the cursor within the same window — reissue with the same from/to and `after` set to the previous cursor."}]},{"key":"history","label":"History","description":"Daily killmail archives.","endpoints":[{"method":"GET","path":"/history","summary":"Daily killmail counts","query":[{"name":"year","type":"int","default":2026,"description":"Year to summarise"}]},{"method":"GET","path":"/history/latest","summary":"Last 10,000 killmail IDs + hashes","description":"Returns { killmail_id: hash } for the 10,000 most recently ingested killmails in insertion order. Pair with /killmails/:killmailId or CCP's ESI to catch up on recent activity without polling the feed stream. Cached 60s."},{"method":"GET","path":"/history/:date","summary":"Killmail IDs + hashes for a date","description":"Returns { killmail_id: hash } for every killmail on the given day. Use this with /killmails/:killmailId or CCP's ESI to rebuild a day's archive.","pathParams":[{"name":"date","type":"date","required":true,"pattern":"YYYY-MM-DD","example":"2026-04-07"}]}]},{"key":"characters","label":"Characters","endpoints":[{"method":"GET","path":"/characters","summary":"Paginated character list","query":[{"name":"name","type":"string","description":"Prefix match (case-insensitive)"},{"name":"corporation_id","type":"int"},{"name":"alliance_id","type":"int"},{"name":"sort","type":"enum","default":"last_active","values":["name","last_active","security_status"]},{"name":"order","type":"enum","default":"desc","values":["asc","desc"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/characters/count","summary":"Estimated total character count","description":"Fast pg_class.reltuples estimate. Not exact.","returns":"{ count: number }"},{"method":"GET","path":"/characters/:characterId","summary":"Character detail","description":"Character profile with all-time stats, recent stats, top ships, top systems, and corporation history with per-stint kill/loss counts.","pathParams":[{"name":"characterId","type":"entity","entityType":"character","required":true}]},{"method":"GET","path":"/characters/:characterId/stats","summary":"Character stats","description":"Kills, losses, ISK, efficiency, top ships, top systems for the chosen period.","pathParams":[{"name":"characterId","type":"entity","entityType":"character","required":true}],"query":[{"name":"type","type":"enum","default":"alltime","values":["alltime","weekly","range"],"description":"Period selector. For 'range', also pass from & to."},{"name":"from","type":"date","pattern":"YYYY-MM-DD","description":"Start date (required when type=range)"},{"name":"to","type":"date","pattern":"YYYY-MM-DD","description":"End date (required when type=range)"}],"examples":[{"label":"All-time","path":"/characters/90000001/stats"},{"label":"Last 7 days","path":"/characters/90000001/stats?type=weekly"},{"label":"Custom range","path":"/characters/90000001/stats?type=range&from=2026-03-01&to=2026-04-01"}]},{"method":"GET","path":"/characters/:characterId/intel","summary":"Character intel profile","description":"Intelligence profile derived from killmail activity: playstyle breakdown (solo/gang/fleet/blob), FC likelihood, capital pilot flag, logi pilot flag, cyno alt detection, bait detection, awox history, top ships flown & lost, target alliances, fleet partners with corp/alliance info, and groups flown with.","pathParams":[{"name":"characterId","type":"entity","entityType":"character","required":true}],"query":[{"name":"days","type":"int","default":365,"description":"Look-back window in days (7–365)"}],"examples":[{"label":"Full year","path":"/characters/2081750081/intel"},{"label":"Last 90 days","path":"/characters/2081750081/intel?days=90"}],"returns":"{ character_id, days, playstyle, dominant_style, tags, fc, capital_pilot, is_logi, ships_flown, ships_lost, targets, fleet_partners, groups_flown_with, awox_kills, cyno_deaths, bait, bait_count, bridge_score }"},{"method":"GET","path":"/characters/:characterId/kills","summary":"Character kills (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"characterId","type":"entity","entityType":"character","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"GET","path":"/characters/:characterId/losses","summary":"Character losses (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"characterId","type":"entity","entityType":"character","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"POST","path":"/characters/stats","summary":"Batch character stats","description":"Resolve stats for up to 100 characters in a single call.","body":{"contentType":"application/json","fields":{"ids":{"type":"int[]","required":true,"maxItems":100,"description":"Character IDs"},"type":{"type":"enum","default":"alltime","values":["alltime","weekly","range"]},"from":{"type":"date","description":"Required when type=range"},"to":{"type":"date","description":"Required when type=range"}},"example":{"ids":[90000001,92000002],"type":"weekly"}}},{"method":"POST","path":"/characters/analyze","summary":"Pirate analyzer (batch, max 2500)","description":"Batch intel endpoint for fleet analysis and awoxer detection. Returns per-character 90-day stats: total_kills, total_losses, efficiency (%), gang_probability (% of kills that are gang), average_gang_size, cyno_probability (% of recent losses with a cyno fitted), and last_5_ships (each with ship_type_id, ship_name, kill_count, and last_loss { killmail_id, killmail_time } or null).","body":{"contentType":"application/json","fields":{"character_ids":{"type":"int[]","required":true,"maxItems":2500}},"example":{"character_ids":[90000001,92000002,93000003]}}}]},{"key":"corporations","label":"Corporations","endpoints":[{"method":"GET","path":"/corporations","summary":"Paginated corporation list","query":[{"name":"name","type":"string","description":"Prefix match (ticker or name)"},{"name":"alliance_id","type":"int"},{"name":"sort","type":"enum","default":"member_count","values":["name","member_count","ticker"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/corporations/count","summary":"Estimated total corporation count","description":"Fast pg_class.reltuples estimate. Not exact.","returns":"{ count: number }"},{"method":"GET","path":"/corporations/:corporationId","summary":"Corporation detail","description":"Profile with all-time stats, top members, top ships, top systems, and alliance history.","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}]},{"method":"GET","path":"/corporations/:corporationId/stats/alltime","summary":"Corporation all-time stats","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}]},{"method":"GET","path":"/corporations/:corporationId/stats/weekly","summary":"Corporation last-7-days stats","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}]},{"method":"GET","path":"/corporations/:corporationId/members","summary":"Corporation members (cursor pagination)","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/corporations/:corporationId/kills","summary":"Corporation kills (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"GET","path":"/corporations/:corporationId/losses","summary":"Corporation losses (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"POST","path":"/corporations/stats","summary":"Batch corporation stats (max 100)","body":{"contentType":"application/json","fields":{"ids":{"type":"int[]","required":true,"maxItems":100},"type":{"type":"enum","default":"alltime","values":["alltime","weekly","range"]},"from":{"type":"date","description":"Required when type=range"},"to":{"type":"date","description":"Required when type=range"}},"example":{"ids":[98000001,98000002],"type":"alltime"}}}]},{"key":"alliances","label":"Alliances","endpoints":[{"method":"GET","path":"/alliances","summary":"Paginated alliance list","query":[{"name":"name","type":"string","description":"Prefix match (ticker or name)"},{"name":"sort","type":"enum","default":"member_count","values":["name","member_count","ticker"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/alliances/count","summary":"Estimated total alliance count","description":"Fast pg_class.reltuples estimate. Not exact.","returns":"{ count: number }"},{"method":"GET","path":"/alliances/:allianceId","summary":"Alliance detail","description":"Profile with all-time stats and top members.","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}]},{"method":"GET","path":"/alliances/:allianceId/stats/alltime","summary":"Alliance all-time stats","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}]},{"method":"GET","path":"/alliances/:allianceId/stats/weekly","summary":"Alliance last-7-days stats","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}]},{"method":"GET","path":"/alliances/:allianceId/corporations","summary":"Alliance corporations (cursor pagination)","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/alliances/:allianceId/members","summary":"Alliance members (paginated)","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–1000)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/alliances/:allianceId/kills","summary":"Alliance kills (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"GET","path":"/alliances/:allianceId/losses","summary":"Alliance losses (cursor pagination, ASC by default; pass `before` for DESC)","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"POST","path":"/alliances/stats","summary":"Batch alliance stats (max 100)","body":{"contentType":"application/json","fields":{"ids":{"type":"int[]","required":true,"maxItems":100},"type":{"type":"enum","default":"alltime","values":["alltime","weekly","range"]},"from":{"type":"date","description":"Required when type=range"},"to":{"type":"date","description":"Required when type=range"}},"example":{"ids":[99000001],"type":"alltime"}}}]},{"key":"coalitions","label":"Coalitions","description":"Pairwise coalition-vs-coalition PvP stats for arbitrary groupings of alliances (and unaffiliated corporations). Queries raw killmails via an attacker-first MATERIALIZED CTE on time-aware attacker indexes — subsecond at the 90-day ceiling. Two modes: pass `date` for a single-day snapshot you can store client-side, or `days` for a lookback window.","endpoints":[{"method":"POST","path":"/coalitions/stats","summary":"Coalition-vs-coalition stats","description":"Aggregated A-vs-B stats for two coalitions. Returns exact pairwise kills/losses/ISK, per-side overall activity (not opponent-filtered), and per-side top ships used plus active systems & regions — all computed from raw killmails. Also returns a daily pairwise timeseries and an intersection of 'clashed systems' where both sides were active. Corps listed inside a side that are already members of a listed alliance on that side are dropped to prevent double counting. Window capped at 90 days.","body":{"contentType":"application/json","fields":{"sideA":{"type":"string","required":true,"description":"{ label?, alliances: int[], corporations?: int[] }"},"sideB":{"type":"string","required":true,"description":"{ label?, alliances: int[], corporations?: int[] }"},"date":{"type":"date","description":"YYYY-MM-DD for a single-day snapshot (mutually exclusive with 'days')"},"days":{"type":"int","default":30,"description":"Lookback window in days (1–90, default 30)"}},"example":{"sideA":{"label":"The Imperium","alliances":[1354830081]},"sideB":{"label":"PAPI","alliances":[99003581,1900696668]},"days":30}},"returns":"{ mode, period_days, from, to, sideA: { label, entity_counts, overall, vs_opponent, top_ships_used, active_systems_count, active_regions_count }, sideB: {...}, clashed_systems: { count, system_ids }, daily: [...] }","notes":"POST body — no response caching. Limit 100 entities per side. Stats are real-time (hit raw killmail tables directly)."}]},{"key":"ships","label":"Ships","endpoints":[{"method":"GET","path":"/ships/:shipTypeId/fittings","summary":"Popular ship fittings","description":"Popular fits for a hull over the last 90 days, grouped by meta-variant family. Returns top families with canonical module list, variant count, and per-alliance doctrine-share percentages. Ships in custom_prices bypass the min-samples threshold to surface rare-hull data. Optional `modules` query filters down to fits that contain ALL listed module/charge/drone type IDs (family-aware: T1/T2/meta variants of the same item count as a hit).","pathParams":[{"name":"shipTypeId","type":"entity","entityType":"ship","required":true,"example":17738}],"query":[{"name":"limit","type":"int","default":20,"description":"Max results (1–50)"},{"name":"modules","type":"string","description":"Comma-separated module/charge/drone type IDs (max 5). Fits must contain ALL listed types (AND match). Match is family-aware via variation_parent_type_id. Example: modules=2873,31760","example":"2873,31760"}]}]},{"key":"resolve","label":"Resolve","endpoints":[{"method":"POST","path":"/resolve","summary":"Batch name → ID resolver","description":"Takes up to 100 entity names and returns their IDs. Similar to CCP's /universe/ids/ but scoped to the entity types EVE-KILL tracks.","body":{"contentType":"application/json","fields":{"names":{"type":"string[]","required":true,"maxItems":100},"type":{"type":"enum","values":["character","corporation","alliance","system","region","constellation","faction","ship","item"],"description":"Scope the lookup to a single entity type (optional)"}},"example":{"names":["CCP Hellmar","Vile Rat"],"type":"character"}},"returns":"{ results: [{ name, id, resolved_name }], resolved, unresolved }"},{"method":"GET","path":"/location","summary":"xyz → nearest celestial","description":"Given a solar system and in-system xyz coordinates, returns the nearest named celestial (planet, moon, stargate, station, belt, POCO, etc.). Uses Euclidean 3D distance — same approach used to label killmail locations.","query":[{"name":"system_id","type":"entity","entityType":"system","required":true,"description":"Solar system ID"},{"name":"x","type":"int","required":true,"description":"X coordinate (meters)"},{"name":"y","type":"int","required":true,"description":"Y coordinate (meters)"},{"name":"z","type":"int","required":true,"description":"Z coordinate (meters)"}],"returns":"{ system_id, x, y, z, nearest: { item_id, item_name, type_id, group_id, distance } | null }"}]},{"key":"stats","label":"Leaderboards","endpoints":[{"method":"GET","path":"/stats","summary":"Leaderboards","description":"Top-N leaderboards across characters, corps, alliances, ships, systems, regions, and more. The time window is controlled by 'days' (default 7).","query":[{"name":"dataType","type":"enum","required":true,"values":["characters","corporations","alliances","ships","systems","regions","isk_destroyers_chars","isk_destroyers_corps","isk_destroyers_alliances","solo_killers","top_points","biggest_losers","most_used_ships","most_destroyed_ships","dangerous_systems","deadliest_regions","pirate_characters","carebear_characters","most_valuable_ships","most_valuable_structures"]},{"name":"days","type":"int","default":7,"description":"Look-back window in days"},{"name":"limit","type":"int","default":10,"description":"Max results (1–100)"}]}]},{"key":"search","label":"Search","endpoints":[{"method":"GET","path":"/search","summary":"Universal entity search","description":"Trigram + ILIKE search across characters, corporations, alliances, ships, items, systems, regions, constellations, and factions. Results are ranked by a combination of similarity score, entity type, and weight (member_count, etc.).","query":[{"name":"q","type":"string","required":true,"description":"Query string (min 1 char, trigram kicks in at 3+ chars)"},{"name":"type","type":"enum","values":["character","corporation","alliance","ship","item","system","region","constellation","faction"],"description":"Restrict to a single entity type (optional)"},{"name":"limit","type":"int","default":25,"description":"Max results (1–50)"}],"returns":"{ hits: Hit[], query, processingTimeMs, total, entityCounts }"}]},{"key":"battles","label":"Battles","endpoints":[{"method":"GET","path":"/battles","summary":"Paginated battle list","description":"Offset-paginated battle list with sort and date filters. Default order is newest-first (battle_id DESC).","query":[{"name":"page","type":"int","default":1,"description":"Page number (1–500)"},{"name":"limit","type":"int","default":20,"description":"Max results (1–100)"},{"name":"sort","type":"enum","default":"battle_id","values":["battle_id","total_isk_destroyed","kill_count","start_time"],"description":"Sort field — column names on the battles row"},{"name":"order","type":"enum","default":"desc","values":["asc","desc"],"description":"Sort direction"},{"name":"start_after","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting after this date"},{"name":"start_before","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting before this date"}],"returns":"{ data: Battle[], pagination: { page, limit, hasMore } }"},{"method":"GET","path":"/battles/:battleId","summary":"Battle detail","description":"Teams, members, timeline, and kill totals.","pathParams":[{"name":"battleId","type":"int","required":true}]},{"method":"GET","path":"/battles/corporation/:corporationId","summary":"Battles involving a corporation","description":"Offset-paginated. `total_isk_destroyed`, `kill_count`, `losses` sort by this corporation's own contribution in each battle (SUM over battle_team_members).","pathParams":[{"name":"corporationId","type":"entity","entityType":"corporation","required":true}],"query":[{"name":"page","type":"int","default":1,"description":"Page number (1–500)"},{"name":"limit","type":"int","default":20,"description":"Max results (1–100)"},{"name":"sort","type":"enum","default":"battle_id","values":["battle_id","total_isk_destroyed","kill_count","losses","start_time"],"description":"Sort field — total_isk_destroyed/kill_count/losses aggregate the corporation's own stats"},{"name":"order","type":"enum","default":"desc","values":["asc","desc"],"description":"Sort direction"},{"name":"start_after","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting after this date"},{"name":"start_before","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting before this date"}],"returns":"{ data: Battle[] (with entity_kills/entity_losses/entity_isk_destroyed), pagination: { page, limit, hasMore } }"},{"method":"GET","path":"/battles/alliance/:allianceId","summary":"Battles involving an alliance","description":"Offset-paginated. `total_isk_destroyed`, `kill_count`, `losses` sort by this alliance's own contribution in each battle (SUM over battle_team_members).","pathParams":[{"name":"allianceId","type":"entity","entityType":"alliance","required":true}],"query":[{"name":"page","type":"int","default":1,"description":"Page number (1–500)"},{"name":"limit","type":"int","default":20,"description":"Max results (1–100)"},{"name":"sort","type":"enum","default":"battle_id","values":["battle_id","total_isk_destroyed","kill_count","losses","start_time"],"description":"Sort field — total_isk_destroyed/kill_count/losses aggregate the alliance's own stats"},{"name":"order","type":"enum","default":"desc","values":["asc","desc"],"description":"Sort direction"},{"name":"start_after","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting after this date"},{"name":"start_before","type":"date","pattern":"YYYY-MM-DD","description":"Only battles starting before this date"}],"returns":"{ data: Battle[] (with entity_kills/entity_losses/entity_isk_destroyed), pagination: { page, limit, hasMore } }"}]},{"key":"wars","label":"Wars","endpoints":[{"method":"GET","path":"/wars","summary":"Paginated war list","query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/wars/:warId","summary":"War detail","description":"Aggressor, defender, allies, and kill stats.","pathParams":[{"name":"warId","type":"int","required":true}]}]},{"key":"feed","label":"Feed","description":"Real-time killmail stream. SSE push or HTTP long-polling, both deliver ESI-format payloads keyed by a monotonic sequence ID.","endpoints":[{"method":"GET","path":"/feed","summary":"Feed API overview","description":"Self-describing document with topic list, usage examples, and sequence-ID semantics."},{"method":"GET","path":"/feed/stream","summary":"SSE stream","description":"Server-Sent Events stream. Send Last-Event-ID header (or ?lastEventId=) on reconnect to resume exactly where you left off.","query":[{"name":"topics","type":"string","default":"all","description":"Comma-separated topic filters: solo, npc, 10b, 5b, highsec, lowsec, nullsec, wspace, abyssal, big, citadel, capitals, freighters, supercarriers, titans, frigates, destroyers, cruisers, battlecruisers, battleships, t1, t2, t3, system.{id}, region.{id}, constellation.{id}, victim.{id}, attacker.{id}"},{"name":"lastEventId","type":"int","description":"Resume from a specific sequence ID (alternative to the Last-Event-ID header)"}],"notes":"Live SSE stream — the Try-it button opens a 10s preview and then disconnects."},{"method":"GET","path":"/feed/poll","summary":"HTTP poll","description":"Long-poll alternative to SSE. Pass after=0 to discover the current head, then loop with after=<latest>.","query":[{"name":"after","type":"int","default":0,"description":"Sequence ID cursor (0 returns the current head so you know where to start)"},{"name":"limit","type":"int","default":100,"description":"Max results (1–1000)"}]},{"method":"GET","path":"/feed/status","summary":"Feed health","description":"Connected SSE clients and the latest sequence ID."}]},{"key":"sde","label":"SDE (Static Data Export)","description":"EVE Online's static game data — systems, items, market groups, factions, stations, sovereignty, and market prices. All endpoints are prefixed with /sde.","endpoints":[{"method":"GET","path":"/sde/systems","summary":"Paginated system list","query":[{"name":"region_id","type":"int"},{"name":"constellation_id","type":"int"},{"name":"name","type":"string","description":"Prefix match"},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/sde/systems/:systemId","summary":"System detail","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true,"example":30000142}]},{"method":"GET","path":"/sde/systems/:systemId/kills","summary":"Kills in a system (ASC by default; pass `before` for DESC)","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"GET","path":"/sde/systems/:systemId/jumps","summary":"Jump connections from a system","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true}]},{"method":"GET","path":"/sde/systems/:systemId/celestials","summary":"Celestials in a system","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true}]},{"method":"GET","path":"/sde/regions","summary":"All regions"},{"method":"GET","path":"/sde/regions/:regionId","summary":"Region detail","pathParams":[{"name":"regionId","type":"entity","entityType":"region","required":true,"example":10000002}]},{"method":"GET","path":"/sde/regions/:regionId/kills","summary":"Kills in a region (ASC by default; pass `before` for DESC)","pathParams":[{"name":"regionId","type":"entity","entityType":"region","required":true}],"query":[{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"},{"name":"before","type":"int","description":"DESC cursor — when set, walks newest → oldest. Pass the previous response's pagination.cursor; or omit cursor and pass any large killmail_id to start from the latest. Mutually exclusive with `after`."}]},{"method":"GET","path":"/sde/constellations","summary":"All constellations","query":[{"name":"region_id","type":"int"}]},{"method":"GET","path":"/sde/constellations/:constellationId","summary":"Constellation detail","pathParams":[{"name":"constellationId","type":"entity","entityType":"constellation","required":true}]},{"method":"GET","path":"/sde/celestials/:itemId","summary":"Celestial by item ID","description":"Look up any celestial (station, gate, moon, planet, etc.) by its in-game item_id.","pathParams":[{"name":"itemId","type":"int","required":true}]},{"method":"GET","path":"/sde/types","summary":"Paginated item types","query":[{"name":"name","type":"string","description":"Prefix match"},{"name":"group_id","type":"int"},{"name":"category_id","type":"int"},{"name":"published","type":"enum","values":["true","false"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/sde/types/:typeId","summary":"Item type detail","pathParams":[{"name":"typeId","type":"entity","entityType":"item","required":true,"example":17738}]},{"method":"GET","path":"/sde/types/:typeId/dogma","summary":"Dogma attributes & effects","pathParams":[{"name":"typeId","type":"entity","entityType":"item","required":true}]},{"method":"GET","path":"/sde/types/:typeId/materials","summary":"Manufacturing materials","pathParams":[{"name":"typeId","type":"entity","entityType":"item","required":true}]},{"method":"GET","path":"/sde/types/:typeId/insurance","summary":"Insurance price levels","pathParams":[{"name":"typeId","type":"entity","entityType":"item","required":true}]},{"method":"GET","path":"/sde/groups","summary":"Paginated inv groups","query":[{"name":"category_id","type":"int"},{"name":"published","type":"enum","values":["true","false"]},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/sde/groups/:groupId","summary":"Group detail","pathParams":[{"name":"groupId","type":"int","required":true}]},{"method":"GET","path":"/sde/categories","summary":"All categories","query":[{"name":"published","type":"enum","values":["true","false"]}]},{"method":"GET","path":"/sde/categories/:categoryId","summary":"Category detail","pathParams":[{"name":"categoryId","type":"int","required":true}]},{"method":"GET","path":"/sde/market-groups","summary":"All market groups","query":[{"name":"parent_id","type":"int","description":"Pass 0 for top-level roots"}]},{"method":"GET","path":"/sde/market-groups/:marketGroupId","summary":"Market group detail","pathParams":[{"name":"marketGroupId","type":"int","required":true}]},{"method":"GET","path":"/sde/meta-groups","summary":"All meta groups (T1, T2, Faction, etc.)"},{"method":"GET","path":"/sde/factions","summary":"All factions"},{"method":"GET","path":"/sde/factions/:factionId","summary":"Faction detail","pathParams":[{"name":"factionId","type":"entity","entityType":"faction","required":true}]},{"method":"GET","path":"/sde/races","summary":"All races"},{"method":"GET","path":"/sde/races/:raceId","summary":"Race detail","pathParams":[{"name":"raceId","type":"int","required":true}]},{"method":"GET","path":"/sde/bloodlines","summary":"All bloodlines"},{"method":"GET","path":"/sde/bloodlines/:bloodlineId","summary":"Bloodline detail","pathParams":[{"name":"bloodlineId","type":"int","required":true}]},{"method":"GET","path":"/sde/npc-corporations","summary":"All NPC corporations"},{"method":"GET","path":"/sde/npc-corporations/:npcCorporationId","summary":"NPC corporation detail","pathParams":[{"name":"npcCorporationId","type":"int","required":true}]},{"method":"GET","path":"/sde/flags","summary":"All inventory flags (slot locations)"},{"method":"GET","path":"/sde/stations","summary":"Paginated NPC stations","query":[{"name":"solar_system_id","type":"int"},{"name":"region_id","type":"int"},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/sde/stations/:stationId","summary":"Station detail","pathParams":[{"name":"stationId","type":"int","required":true}]},{"method":"GET","path":"/sde/station-operations","summary":"All station operation types"},{"method":"GET","path":"/sde/station-operations/:operationId","summary":"Station operation detail","pathParams":[{"name":"operationId","type":"int","required":true}]},{"method":"GET","path":"/sde/structures","summary":"Paginated player structures","query":[{"name":"solar_system_id","type":"int"},{"name":"region_id","type":"int"},{"name":"owner_id","type":"int"},{"name":"limit","type":"int","default":50,"description":"Max results (1–100)"},{"name":"after","type":"int","description":"Cursor — pass the previous response's pagination.cursor to fetch the next page (ASC walk, oldest → newest)"}]},{"method":"GET","path":"/sde/structures/:structureId","summary":"Structure detail","pathParams":[{"name":"structureId","type":"int","required":true}]},{"method":"GET","path":"/sde/sovereignty","summary":"Current sovereignty map","query":[{"name":"alliance_id","type":"int"},{"name":"faction_id","type":"int"}]},{"method":"GET","path":"/sde/sovereignty/:systemId","summary":"Sovereignty for a single system","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true}]},{"method":"GET","path":"/sde/sovereignty/:systemId/history","summary":"Sovereignty change history","pathParams":[{"name":"systemId","type":"entity","entityType":"system","required":true}]},{"method":"GET","path":"/sde/prices/:typeId","summary":"Market price history","description":"Daily price snapshot history for an item in a region. Defaults to The Forge (Jita).","pathParams":[{"name":"typeId","type":"entity","entityType":"item","required":true}],"query":[{"name":"region_id","type":"int","default":10000002,"description":"Defaults to The Forge (Jita)"},{"name":"limit","type":"int","default":30,"description":"Days of history (1–365)"}]}]}]}