⏳ This skill is pending AI review.
Scores will appear once the review pipeline completes.
eve-esi
Discord webhook URL for sending alerts and reports. Only needed if Discord notifications are configured.
// RATINGS
Not yet listed on ClawHub or SkillsMP
// README
EVE ESI Skill for OpenClaw
Ask your agent what New Eden is up to — wallet, skills, industry, and what your planets are doing while you are docked somewhere else entirely.
An OpenClaw skill for the EVE Online ESI API (EVE Swagger Interface). Read-only by default, no pip dependencies, tokens stay on your machine.
Contents
- What it does · Install · Authenticate · Quick start
- Planetary Interaction · Market prices · Threat assessment · Dashboard config
- Security · Reference · Links
What it does
| Authentication | EVE SSO OAuth2 with PKCE, no client secret. Tokens auto-refresh and rotate. |
| Multi-character | Unlimited characters under named keys — main, alt1, whatever you call them. |
| Planetary Interaction | Extractor timers, storage fill, factory routing, and a parsed "needs attention" verdict per planet. |
| Market | Global adjusted/average prices, plus live Jita buy/sell for a single type. |
| Threat assessment | System scoring from ESI kills and jumps combined with zKillboard PVP data. |
| Route planning | Routes annotated with a per-system threat level. |
| ESI queries | Generic helper with pagination, rate-limit handling and error recovery. |
| Dashboard config | A validated JSON Schema vocabulary for alerts, reports and price tracking. Defines them; does not run them. |
Install
cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi
Python 3.10+, standard library only for everything in this repo.
Authenticate
Before you start, register an application at developers.eveonline.com:
- Callback URL:
http://localhost:8080/callback. The portal accepts thehttpscheme only for the hostlocalhost—127.0.0.1is refused on save. - Enable the scopes you may want under Enabled Scopes. A scope profile can
only ask for what the application already has enabled, so enabling a scope
here does not grant it — it just makes it available to request. Planetary
Interaction needs
esi-planets.manage_planets.v1; to keep--scope-profile fullusable later, enable all 17 listed under Scope profiles. - Note the Client ID (with PKCE there is no client secret to keep)
Then authenticate once per character:
# On a remote server, tunnel the callback port to your browser first:
ssh -L 8080:127.0.0.1:8080 user@your-server -N
python3 scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# Open the printed URL and log in with your EVE account
Choose how much access to grant. Scopes are granted once and stay granted until you revoke them, so the default asks for the narrow set:
| Profile | Scopes | Grants access to |
|---|---|---|
basic | 7 | Skills, skill queue, clones, implants, location, ship, online status |
pi (default) | 8 | basic plus Planetary Interaction |
industry | 11 | basic plus assets, industry jobs, market orders, contracts |
full | 17 | Everything, including wallet balance, ISK history and mail |
python3 scripts/auth_flow.py --list-scope-profiles # exact scopes per profile
python3 scripts/auth_flow.py --client-id <ID> --scope-profile full
python3 scripts/auth_flow.py --client-id <ID> --scopes "esi-skills.read_skills.v1"
The flow prints what it is about to request before opening the browser, and EVE SSO shows you the same list on its consent screen. Nothing is granted until you approve it there.
Tokens land in ~/.openclaw/eve-tokens.json (chmod 600) and rotate on every
use. Repeat with a different --char-name for each alt:
python3 scripts/auth_flow.py --client-id <CLIENT_ID> --char-name alt1
python3 scripts/get_token.py --list # who is authenticated?
Quick start
--char <name> resolves and refreshes the token in-process, so it never
touches a command line, your shell history, or a log file. Prefer it over
passing --token.
SKILL=~/.openclaw/workspace/skills/eve-esi
CHAR_ID=<your_character_id>
# Wallet balance
python3 $SKILL/scripts/esi_query.py --char main \
--endpoint "/characters/$CHAR_ID/wallet/" --pretty
# Skill queue
python3 $SKILL/scripts/esi_query.py --char main \
--endpoint "/characters/$CHAR_ID/skillqueue/" --pretty
# Every asset you own, following pagination
python3 $SKILL/scripts/esi_query.py --char main \
--endpoint "/characters/$CHAR_ID/assets/" --pages --pretty
# Planets, and what needs attention on them
python3 $SKILL/scripts/esi_query.py --action pi_planets --char main --character-id $CHAR_ID --pretty
python3 $SKILL/scripts/esi_query.py --action pi_status --char main --character-id $CHAR_ID --pretty
# Market — public data, no authentication needed
python3 $SKILL/scripts/esi_query.py --action jita_price --type-id 2393 --pretty
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty
Planetary Interaction
High-level actions that turn raw ESI output into something you can act on.
# All planets for a character
python3 $SKILL/scripts/esi_query.py --action pi_planets \
--char main --character-id $CHAR_ID --pretty
# Extractor timers, storage fill, attention flags
python3 $SKILL/scripts/esi_query.py --action pi_status \
--char main --character-id $CHAR_ID --pretty
# One planet in detail
python3 $SKILL/scripts/esi_query.py --action pi_planet_detail \
--char main --character-id $CHAR_ID --planet-id <PLANET_ID> --pretty
pi_status returns per planet:
| Field | Description |
|---|---|
planet_name | Resolved planet name (e.g. "Ikoskio VII") |
extractors | Product, expiry time, hours remaining, status |
storage_fill_pct | Estimated launchpad/storage fill |
factories | Input/output product routing |
needs_attention | true when an extractor runs dry in < 6 h or storage exceeds 80 % |
action_required | Plain-language description of what to do |
A limit worth knowing up front: ESI exposes PI as read-only. This skill will tell you that an extractor expires in four hours and that your launchpad is nearly full — it cannot restart the extractor, reroute a product, or touch the layout. That part still happens in the client.
Market prices
# Adjusted and average prices for every type in the game
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty
# Live Jita book for one type (9832 = Coolant)
python3 $SKILL/scripts/esi_query.py --action jita_price --type-id 9832 --pretty
jita_price reports lowest sell, highest buy, the spread and order counts for
The Forge.
Threat assessment and route planning
Intended for deciding whether that low-sec PI run is worth it right now.
python3 $SKILL/scripts/esi_query.py --action system_kills --system-ids 30002537 --pretty
python3 $SKILL/scripts/esi_query.py --action system_jumps --system-ids 30002537 --pretty
python3 $SKILL/scripts/esi_query.py --action system_info --system-id 30002537 --pretty
python3 $SKILL/scripts/esi_query.py --action route_plan \
--origin 30000142 --destination 30002537 --route-flag secure --pretty
python3 $SKILL/scripts/esi_query.py --action character_location \
--char main --character-id $CHAR_ID --pretty
python3 $SKILL/scripts/esi_query.py --action fw_systems --pretty
python3 $SKILL/scripts/esi_query.py --action incursions --pretty
Threat levels
| Level | Score | Read as |
|---|---|---|
low | 0–15 | Normal operations |
medium | 15–40 | Quick in, quick out |
high | 40–80 | Scout or cloak only |
critical | 80+ | Do not enter |
Data sources — all public, none require authentication:
| S
// HOW IT'S BUILT
KEY FILES