Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Xpersona Agent
Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance,...
clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esiOverall rank
#62
Adoption
964 downloads
Trust
Unknown
Freshness
Mar 1, 2026
Freshness
Last checked Mar 1, 2026
Best For
Eve online Esi Skill is best for general automation workflows where OpenClaw compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
CLAWHUB, CLAWHUB, runtime-metrics, public facts pack
Key links, install path, reliability highlights, and the shortest practical read before diving into the crawl record.
Overview
Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance,... Capability contract not published. No trust telemetry is available yet. 964 downloads reported by the source. Last updated 4/15/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Mar 1, 2026
Vendor
Clawhub
Artifacts
0
Benchmarks
0
Last release
1.0.6
Install & run
clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esiInstall using `clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esi` in an isolated environment before connecting it to live workloads.
No published capability contract is available yet, so validate auth and request/response behavior manually.
Review the upstream CLAWHUB listing at https://clawhub.ai/burnshall-ui/eve-esi before using production credentials.
Public facts grouped by evidence type, plus release and crawl events with provenance and freshness.
Public facts
Vendor
Clawhub
Protocol compatibility
OpenClaw
Latest release
1.0.6
Adoption signal
964 downloads
Handshake status
UNKNOWN
Parameters, dependencies, examples, extracted files, editorial overview, and the complete README when available.
Captured outputs
Extracted files
5
Examples
2
Snippets
0
Languages
Unknown
text
File v1.0.6:README.md # EVE ESI Skill for OpenClaw An [OpenClaw](https://openclaw.ai) skill for interacting with the [EVE Online ESI API](https://developers.eveonline.com/api-explorer) (EVE Swagger Interface). ## Features <<<<<<< HEAD - **PKCE Authentication** — Secure OAuth2 flow via EVE SSO, auto-refreshing tokens - **Multi-Character** — Store and manage tokens for unlimited characters - **PI Monitoring** — Planetary Interaction status, extractor timers, storage fill levels - **Market Prices** — Global average prices and Jita buy/sell lookups - **ESI Queries** — Reusable Python helper with pagination, rate-limit handling, and error recovery - **Threat Assessment** — System threat scoring using ESI kills/jumps + zKillboard PVP data - **Route Planning** — Annotated routes with per-system threat levels - **Dashboard Config** — Modular alert/report/market-tracking config with JSON Schema ======= - **Authentication** — PKCE OAuth2 flow via EVE SSO, auto-refreshing tokens - **ESI Queries** — reusable Python helper with pagination, error limits, and caching - **PI + Market Actions** — built-in actions for PI planet status and Jita price snapshots - **Multi-character** — store and manage tokens for multiple characters - **Dashboard Config** — modular alert/report/market-tracking config schema - **Reference docs** — full scope list, endpoint index, auth flow details >>>>>>> 37636f5 (docs: update README for PI action workflow) ## Structure
text
File v1.0.5:README.md # EVE ESI Skill for OpenClaw An [OpenClaw](https://openclaw.ai) skill for interacting with the [EVE Online ESI API](https://developers.eveonline.com/api-explorer) (EVE Swagger Interface). ## Features - **Authentication** — PKCE OAuth2 flow via EVE SSO, auto-refreshing tokens - **ESI Queries** — reusable Python helper with pagination, error limits, and caching - **Multi-character** — store and manage tokens for multiple characters - **Dashboard Config** — modular alert/report/market-tracking config schema - **Reference docs** — full scope list, endpoint index, auth flow details ## Structure
SKILL.md
---
name: eve-esi
description: "Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance, ISK transactions, assets, skill queue, skill points, clone locations, implants, fittings, contracts, market orders, mail, industry jobs, killmails, planetary interaction, loyalty points, or any other EVE account management task."
env:
- name: EVE_CLIENT_ID
description: "EVE Developer Application Client ID (from https://developers.eveonline.com/applications). Optional: only needed if using $ENV: references in your dashboard config instead of passing --client-id to auth_flow.py directly."
required: false
sensitive: false
- name: EVE_TOKEN_MAIN
description: "ESI OAuth2 access token for the main character. Optional: scripts auto-manage tokens via ~/.openclaw/eve-tokens.json (written by auth_flow.py). Only set this if using $ENV: references in your dashboard config."
required: false
sensitive: true
- name: EVE_REFRESH_MAIN
description: "ESI OAuth2 refresh token for automatic access token renewal. Optional: scripts auto-manage tokens via ~/.openclaw/eve-tokens.json. Only set this if using $ENV: references in your dashboard config."
required: false
sensitive: true
- name: TELEGRAM_BOT_TOKEN
description: "Telegram Bot API token for sending alerts and reports."
required: false
sensitive: true
- name: TELEGRAM_CHAT_ID
description: "Telegram chat ID where notifications are sent."
required: false
sensitive: false
- name: DISCORD_WEBHOOK_URL
description: "Discord webhook URL for sending alerts and reports."
required: false
sensitive: true
---
# Data Handling
This skill communicates exclusively with the official EVE Online ESI API (`esi.evetech.net`) and EVE SSO (`login.eveonline.com`).
No character data is exfiltrated to third-party servers.
Optional integrations (Telegram, Discord) are user-configured via environment variables and only transmit alerts defined by the user.
# EVE Online ESI
The ESI (EVE Swagger Interface) is the official REST API for EVE Online third-party development.
- Base URL: `https://esi.evetech.net/latest`
- Spec: `https://esi.evetech.net/latest/swagger.json`
- API Explorer: <https://developers.eveonline.com/api-explorer>
## Skill Location
All scripts live at: `~/.openclaw/workspace/skills/eve-esi/scripts/`
Always use full paths when calling scripts:
```bash
SKILL=~/.openclaw/workspace/skills/eve-esi
```
## Authentication
Tokens are stored in `~/.openclaw/eve-tokens.json` (created by auth_flow.py, chmod 600).
All scripts (`get_token.py`, `esi_query.py`) read from this file directly — **no env vars are required for normal operation.**
**First-time setup** (once per character):
```bash
# 1. Set up SSH tunnel on your local PC:
# ssh -L 8080:127.0.0.1:8080 user@your-server -N
# 2. Run auth flow on README.md
# EVE ESI Skill for OpenClaw
An [OpenClaw](https://openclaw.ai) skill for interacting with the [EVE Online ESI API](https://developers.eveonline.com/api-explorer) (EVE Swagger Interface).
## Features
<<<<<<< HEAD
- **PKCE Authentication** — Secure OAuth2 flow via EVE SSO, auto-refreshing tokens
- **Multi-Character** — Store and manage tokens for unlimited characters
- **PI Monitoring** — Planetary Interaction status, extractor timers, storage fill levels
- **Market Prices** — Global average prices and Jita buy/sell lookups
- **ESI Queries** — Reusable Python helper with pagination, rate-limit handling, and error recovery
- **Threat Assessment** — System threat scoring using ESI kills/jumps + zKillboard PVP data
- **Route Planning** — Annotated routes with per-system threat levels
- **Dashboard Config** — Modular alert/report/market-tracking config with JSON Schema
=======
- **Authentication** — PKCE OAuth2 flow via EVE SSO, auto-refreshing tokens
- **ESI Queries** — reusable Python helper with pagination, error limits, and caching
- **PI + Market Actions** — built-in actions for PI planet status and Jita price snapshots
- **Multi-character** — store and manage tokens for multiple characters
- **Dashboard Config** — modular alert/report/market-tracking config schema
- **Reference docs** — full scope list, endpoint index, auth flow details
>>>>>>> 37636f5 (docs: update README for PI action workflow)
## Structure
```
eve-esi/
├── SKILL.md # OpenClaw skill instructions (loaded by agent)
├── README.md # This file
├── .gitignore # Prevents token/secret commits
├── scripts/
<<<<<<< HEAD
│ ├── auth_flow.py # One-time EVE SSO OAuth2 PKCE authentication
│ ├── get_token.py # Token refresh helper (auto-rotates on every use)
=======
│ ├── auth_flow.py # One-time EVE SSO OAuth2 authentication
│ ├── get_token.py # Token refresh helper (auto-rotates)
>>>>>>> 37636f5 (docs: update README for PI action workflow)
│ ├── esi_query.py # ESI query helper + high-level PI/market actions
│ └── validate_config.py # Dashboard config validator
├── config/
│ ├── schema.json # JSON Schema for dashboard config
│ ├── example-config.json # Ready-to-use template
<<<<<<< HEAD
│ └── esi_endpoints.json # PI and market endpoint definitions
=======
│ └── esi_endpoints.json # Endpoint catalog (PI + market helpers)
>>>>>>> 37636f5 (docs: update README for PI action workflow)
└── references/
├── authentication.md # EVE SSO OAuth2 + PKCE details
└── endpoints.md # All character endpoints + scopes
```
## Installation
```bash
cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi
```
No pip dependencies — uses Python 3.8+ stdlib only.
_meta.json
{
"ownerId": "kn70krghga32ef4e3s75ew2vf980rh5b",
"slug": "eve-esi",
"version": "1.0.6",
"publishedAt": 1771728287485
}references/authentication.md
# EVE SSO OAuth2 Authentication
EVE ESI uses OAuth 2.0 Authorization Code flow via EVE SSO (Single Sign-On).
Base SSO URL: `https://login.eveonline.com`
## Prerequisites
1. Register an application at <https://developers.eveonline.com/applications>
2. Note your **Client ID** and **Secret Key**
3. Set a **Callback URL** (e.g. `http://localhost:8080/callback`)
4. Select required **Scopes** for the endpoints you need
## Authorization Code Flow
### Step 1: Redirect user to SSO
```
https://login.eveonline.com/v2/oauth/authorize/?response_type=code&redirect_uri=<CALLBACK_URL>&client_id=<CLIENT_ID>&scope=<SCOPES>&state=<RANDOM_STATE>
```
- `scope`: space-separated list (e.g. `esi-wallet.read_character_wallet.v1 esi-assets.read_assets.v1`)
- `state`: random string to prevent CSRF
### Step 2: Exchange authorization code for tokens
```bash
curl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=<AUTH_CODE>" \
-d "client_id=<CLIENT_ID>" \
-d "code_verifier=<CODE_VERIFIER>"
```
Response:
```json
{
"access_token": "eyJ...",
"expires_in": 1199,
"token_type": "Bearer",
"refresh_token": "abc123..."
}
```
### Step 3: Refresh expired tokens
Access tokens expire after ~20 minutes. Refresh with:
```bash
curl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "refresh_token=<REFRESH_TOKEN>" \
-d "client_id=<CLIENT_ID>"
```
### Step 4: Verify token and get character ID
```bash
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
https://login.eveonline.com/oauth/verify
```
Response includes `CharacterID`, `CharacterName`, `Scopes`.
## Using tokens with ESI
Pass the access token as a Bearer header:
```bash
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
"https://esi.evetech.net/latest/characters/<CHARACTER_ID>/wallet/"
```
## PKCE (Proof Key for Code Exchange)
EVE SSO supports PKCE for public clients (no secret key). Generate a `code_verifier` (random 43-128 char string) and derive `code_challenge` via SHA-256:
```python
import hashlib, base64, secrets
code_verifier = secrets.token_urlsafe(64)
code_challenge = base64.urlsafe_b64encode(
hashlib.sha256(code_verifier.encode()).digest()
).rstrip(b"=").decode()
```
Add `&code_challenge=<CHALLENGE>&code_challenge_method=S256` to the authorize URL. Include `code_verifier` in the token exchange.
## Required Scopes by Category
| Category | Scope |
|----------|-------|
| Wallet | `esi-wallet.read_character_wallet.v1` |
| Assets | `esi-assets.read_assets.v1` |
| Skills | `esi-skills.read_skills.v1`, `esi-skills.read_skillqueue.v1` |
| Clones | `esi-clones.read_clones.v1`, `esi-clones.read_implants.v1` |
| Location | `esi-location.read_location.v1`, `esi-location.read_ship_type.v1`, `esireferences/endpoints.md
# EVE ESI Character Endpoints Reference
Base URL: `https://esi.evetech.net/latest`
All authenticated endpoints require `Authorization: Bearer <TOKEN>` header. Replace `{character_id}` with the numeric character ID from SSO verify.
## Table of Contents
- [Character Info](#character-info)
- [Wallet](#wallet)
- [Assets](#assets)
- [Skills](#skills)
- [Clones and Implants](#clones-and-implants)
- [Location](#location)
- [Contacts](#contacts)
- [Contracts](#contracts)
- [Calendar](#calendar)
- [Fittings](#fittings)
- [Industry](#industry)
- [Killmails](#killmails)
- [Mail](#mail)
- [Market Orders](#market-orders)
- [Mining](#mining)
- [Notifications](#notifications)
- [Loyalty Points](#loyalty-points)
- [Planets (PI)](#planets-pi)
- [Blueprints](#blueprints)
- [Roles and Titles](#roles-and-titles)
- [Standings](#standings)
- [Bookmarks](#bookmarks)
- [Medals](#medals)
- [Agent Research](#agent-research)
- [Fatigue](#fatigue)
- [Faction Warfare](#faction-warfare)
- [Corporation History](#corporation-history)
- [Portrait](#portrait)
- [Search](#search)
- [Fleet](#fleet)
---
## Character Info
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | `/characters/{character_id}/` | -- | Public character info (name, corp, birthday, etc.) |
| GET | `/characters/{character_id}/online/` | `esi-location.read_online.v1` | Online status, last login/logout |
| POST | `/characters/affiliation/` | -- | Bulk lookup corp/alliance/faction for character IDs |
## Wallet
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | `/characters/{character_id}/wallet/` | `esi-wallet.read_character_wallet.v1` | ISK balance |
| GET | `/characters/{character_id}/wallet/journal/` | `esi-wallet.read_character_wallet.v1` | Wallet journal (paginated) |
| GET | `/characters/{character_id}/wallet/transactions/` | `esi-wallet.read_character_wallet.v1` | Wallet transactions |
## Assets
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | `/characters/{character_id}/assets/` | `esi-assets.read_assets.v1` | All assets (paginated) |
| POST | `/characters/{character_id}/assets/locations/` | `esi-assets.read_assets.v1` | Locations for specific item IDs |
| POST | `/characters/{character_id}/assets/names/` | `esi-assets.read_assets.v1` | Names for specific item IDs |
## Skills
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | `/characters/{character_id}/skills/` | `esi-skills.read_skills.v1` | All trained skills + total SP |
| GET | `/characters/{character_id}/skillqueue/` | `esi-skills.read_skillqueue.v1` | Current skill queue |
| GET | `/characters/{character_id}/attributes/` | `esi-skills.read_skills.v1` | Character attributes (int, mem, etc.) |
## Clones and Implants
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | `/characters/{Editorial read
Docs source
CLAWHUB
Editorial quality
thin
Skill: Eve online Esi Skill Owner: burnshall-ui Summary: Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance,... Tags: latest:1.0.5 Version history: v1.0.6 | 2026-02-22T02:44:47.485Z | user eve-esi 1.0.6 - Added .gitignore for better repository hygiene. - Introduced config/esi_endpoints.json for improved endpoint o
Skill: Eve online Esi Skill
Owner: burnshall-ui
Summary: Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance,...
Tags: latest:1.0.5
Version history:
v1.0.6 | 2026-02-22T02:44:47.485Z | user
eve-esi 1.0.6
v1.0.5 | 2026-02-19T00:41:50.973Z | user
eve-esi 1.0.5 changelog
v1.0.4 | 2026-02-19T00:37:07.251Z | user
eve-esi 1.0.4 changelog
v1.0.3 | 2026-02-19T00:28:14.217Z | user
eve-esi 1.0.3
auth_flow.py) and programmatic access token retrieval (get_token.py)README.md with setup instructions and authentication usagev1.0.2 | 2026-02-11T10:01:37.302Z | user
v1.0.1 | 2026-02-11T09:41:09.364Z | user
v1.0.0 | 2026-02-08T23:59:35.203Z | user
eve-esi 1.0.0 – initial release
Archive index:
Archive v1.0.6: 13 files, 32811 bytes
Files: .gitignore (258b), config/esi_endpoints.json (2181b), config/example-config.json (3738b), config/schema.json (11304b), README.md (13874b), references/authentication.md (4082b), references/endpoints.md (12013b), scripts/auth_flow.py (6321b), scripts/esi_query.py (24515b), scripts/get_token.py (3364b), scripts/validate_config.py (13527b), SKILL.md (12911b), _meta.json (126b)
File v1.0.6:SKILL.md
name: eve-esi description: "Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance, ISK transactions, assets, skill queue, skill points, clone locations, implants, fittings, contracts, market orders, mail, industry jobs, killmails, planetary interaction, loyalty points, or any other EVE account management task." env:
This skill communicates exclusively with the official EVE Online ESI API (esi.evetech.net) and EVE SSO (login.eveonline.com).
No character data is exfiltrated to third-party servers.
Optional integrations (Telegram, Discord) are user-configured via environment variables and only transmit alerts defined by the user.
The ESI (EVE Swagger Interface) is the official REST API for EVE Online third-party development.
https://esi.evetech.net/latesthttps://esi.evetech.net/latest/swagger.jsonAll scripts live at: ~/.openclaw/workspace/skills/eve-esi/scripts/
Always use full paths when calling scripts:
SKILL=~/.openclaw/workspace/skills/eve-esi
Tokens are stored in ~/.openclaw/eve-tokens.json (created by auth_flow.py, chmod 600).
All scripts (get_token.py, esi_query.py) read from this file directly — no env vars are required for normal operation.
First-time setup (once per character):
# 1. Set up SSH tunnel on your local PC:
# ssh -L 8080:127.0.0.1:8080 user@your-server -N
# 2. Run auth flow on server (pass Client ID directly):
python3 ~/.openclaw/workspace/skills/eve-esi/scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# 3. Open the shown URL in browser, log in with EVE account
Get a fresh access token (tokens expire after ~20min, refresh is automatic):
TOKEN=$(python3 ~/.openclaw/workspace/skills/eve-esi/scripts/get_token.py --char main)
List authenticated characters:
python3 ~/.openclaw/workspace/skills/eve-esi/scripts/get_token.py --list
For full OAuth2/PKCE details: see references/authentication.md.
# Character public info
curl -s "https://esi.evetech.net/latest/characters/2114794365/" | python -m json.tool
# Portrait URLs
curl -s "https://esi.evetech.net/latest/characters/2114794365/portrait/"
# Corporation history
curl -s "https://esi.evetech.net/latest/characters/2114794365/corporationhistory/"
# Bulk affiliation lookup
curl -s -X POST "https://esi.evetech.net/latest/characters/affiliation/" \
-H "Content-Type: application/json" \
-d '[2114794365, 95538921]'
TOKEN="<your_access_token>"
CHAR_ID="<your_character_id>"
# Online status (scope: esi-location.read_online.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/online/"
# Balance (scope: esi-wallet.read_character_wallet.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/"
# Journal (paginated)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/journal/?page=1"
# Transactions
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/transactions/"
# All assets (paginated; scope: esi-assets.read_assets.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/?page=1"
# Resolve item locations
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[1234567890, 9876543210]' \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/locations/"
# Resolve item names
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[1234567890]' \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/names/"
# All trained skills + total SP (scope: esi-skills.read_skills.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/skills/"
# Skill queue (scope: esi-skills.read_skillqueue.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/skillqueue/"
# Attributes (intelligence, memory, etc.)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/attributes/"
# Current location (scope: esi-location.read_location.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/location/"
# Current ship (scope: esi-location.read_ship_type.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/ship/"
# Jump clones + home station (scope: esi-clones.read_clones.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/clones/"
# Active implants (scope: esi-clones.read_implants.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/implants/"
For contracts, fittings, mail, industry, killmails, market orders, mining, planetary interaction, loyalty points, notifications, blueprints, standings, and all other character endpoints, see references/endpoints.md.
The skill supports a modular dashboard config for alerts, reports, and market tracking. Each user defines what they need in a JSON config file.
| Module | Description | |--------|-------------| | Alerts | Real-time polling for war decs, structure attacks, skill completions, wallet changes, industry jobs, PI extractors, killmails, contracts, clone jumps, mail | | Reports | Cron-scheduled summaries: net worth, skill queue, industry, market orders, wallet, assets | | Market | Price tracking with absolute thresholds and trend detection |
Tokens should not be stored in plain text. Use environment variable references:
{
"token": "$ENV:EVE_TOKEN_MAIN",
"refresh_token": "$ENV:EVE_REFRESH_MAIN"
}
The config file should live outside the workspace (e.g. ~/.openclaw/eve-dashboard-config.json).
python scripts/validate_config.py path/to/config.json
# Show example config
python scripts/validate_config.py --example
# Show JSON schema
python scripts/validate_config.py --schema
SKILL=~/.openclaw/workspace/skills/eve-esi
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
CHAR_ID=$(python3 $SKILL/scripts/get_token.py --char main --json | python3 -c "import sys,json; print(json.load(sys.stdin))" 2>/dev/null)
# Simple query
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/wallet/" --pretty
# Fetch all pages of assets
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/assets/" --pages --pretty
# POST request (e.g. asset names)
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/assets/names/" \
--method POST --body '[1234567890]' --pretty
Expires header; do not poll before it expires.X-ESI-Error-Limit-Remain; back off when low.X-Pages response header; iterate with ?page=N./latest/ for current stable routes. /dev/ may change without notice.The skill provides threat intelligence for PI systems in low/null-sec space. Data sources: ESI (kills, jumps, FW, incursions) and zKillboard (PVP activity).
SKILL=~/.openclaw/workspace/skills/eve-esi
# System kills (last hour) — all or filtered
python3 $SKILL/scripts/esi_query.py --action system_kills --pretty
python3 $SKILL/scripts/esi_query.py --action system_kills --system-ids 30002537,30045337 --pretty
# System jump traffic (last hour)
python3 $SKILL/scripts/esi_query.py --action system_jumps --system-ids 30045337 --pretty
# System info (name, security status)
python3 $SKILL/scripts/esi_query.py --action system_info --system-id 30002537 --pretty
# Route planning (flags: secure, shortest, insecure)
python3 $SKILL/scripts/esi_query.py --action route_plan --origin 30000142 --destination 30002537 --route-flag secure --pretty
# Character location (requires auth)
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
python3 $SKILL/scripts/esi_query.py --action character_location --token "$TOKEN" --character-id $CHAR_ID --pretty
# Faction warfare systems
python3 $SKILL/scripts/esi_query.py --action fw_systems --pretty
# Active incursions
python3 $SKILL/scripts/esi_query.py --action incursions --pretty
These scripts live in ~/.openclaw/workspace/scripts/ (not in the skill repo):
# Threat level for specific systems
python3 ~/.openclaw/workspace/scripts/threat_query.py --action threat_assessment --system-ids 30002537,30045337
# Threat for all PI systems across all characters
python3 ~/.openclaw/workspace/scripts/threat_query.py --action threat_assessment_pi
# Route with per-system threat annotation
python3 ~/.openclaw/workspace/scripts/threat_query.py --action route_annotated --origin 30000142 --destination 30002537
# Route from character's current location
python3 ~/.openclaw/workspace/scripts/threat_query.py --action route_annotated --character main --destination 30045337
# Full PI + Threat morning briefing
python3 ~/.openclaw/workspace/scripts/threat_query.py --action pi_briefing
| Level | Score | Meaning |
|-------|-------|---------|
| low | 0-15 | Normaler PI-Betrieb |
| medium | 15-40 | Schnell rein, schnell raus |
| high | 40-80 | Nur mit Scout/Cloak |
| critical | 80+ | NICHT reinfliegen |
Threat data is cached in Redis (30min TTL for ESI, 1h for zKillboard). The cache is updated every 30 minutes via cron:
# Update cache manually
python3 ~/.openclaw/workspace/scripts/cache_threat_data.py
# Show cached threat data
python3 ~/.openclaw/workspace/scripts/cache_threat_data.py --check
ESI returns numeric type IDs (e.g. for ships, items, skills). Resolve names via:
# Single type
curl -s "https://esi.evetech.net/latest/universe/types/587/"
# Bulk names (up to 1000 IDs)
curl -s -X POST "https://esi.evetech.net/latest/universe/names/" \
-H "Content-Type: application/json" \
-d '[587, 638, 11393]'
File v1.0.6:README.md
An OpenClaw skill for interacting with the EVE Online ESI API (EVE Swagger Interface).
<<<<<<< HEAD
37636f5 (docs: update README for PI action workflow)
eve-esi/
├── SKILL.md # OpenClaw skill instructions (loaded by agent)
├── README.md # This file
├── .gitignore # Prevents token/secret commits
├── scripts/
<<<<<<< HEAD
│ ├── auth_flow.py # One-time EVE SSO OAuth2 PKCE authentication
│ ├── get_token.py # Token refresh helper (auto-rotates on every use)
=======
│ ├── auth_flow.py # One-time EVE SSO OAuth2 authentication
│ ├── get_token.py # Token refresh helper (auto-rotates)
>>>>>>> 37636f5 (docs: update README for PI action workflow)
│ ├── esi_query.py # ESI query helper + high-level PI/market actions
│ └── validate_config.py # Dashboard config validator
├── config/
│ ├── schema.json # JSON Schema for dashboard config
│ ├── example-config.json # Ready-to-use template
<<<<<<< HEAD
│ └── esi_endpoints.json # PI and market endpoint definitions
=======
│ └── esi_endpoints.json # Endpoint catalog (PI + market helpers)
>>>>>>> 37636f5 (docs: update README for PI action workflow)
└── references/
├── authentication.md # EVE SSO OAuth2 + PKCE details
└── endpoints.md # All character endpoints + scopes
cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi
No pip dependencies — uses Python 3.8+ stdlib only.
http://127.0.0.1:8080/callbackesi-planets.manage_planets.v1)# If on a remote server, set up an SSH tunnel first:
ssh -L 8080:127.0.0.1:8080 user@your-server -N
# Run the auth flow:
python3 scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# Open the shown URL in your browser and log in with your EVE account
Tokens are stored in ~/.openclaw/eve-tokens.json (chmod 600, auto-rotated).
python3 scripts/auth_flow.py --client-id <CLIENT_ID> --char-name alt1
python3 scripts/auth_flow.py --client-id <CLIENT_ID> --char-name alt2
# List all authenticated characters:
python3 scripts/get_token.py --list
SKILL=~/.openclaw/workspace/skills/eve-esi
# Get a fresh access token (auto-refreshes on every call)
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
# Wallet balance
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/wallet/" --pretty
# Skill queue
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/skillqueue/" --pretty
# All assets (paginated)
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/assets/" --pages --pretty
# PI: list all planets for a character
python3 $SKILL/scripts/esi_query.py --action pi_planets \
--token "$TOKEN" --character-id <CHAR_ID> --pretty
# PI: parsed "needs attention" status per planet
python3 $SKILL/scripts/esi_query.py --action pi_status \
--token "$TOKEN" --character-id <CHAR_ID> --pretty
# Market (public): Jita buy/sell snapshot for one type
python3 $SKILL/scripts/esi_query.py --action jita_price \
--type-id 2393 --pretty
# Market (public): adjusted/average prices for all types
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty
<<<<<<< HEAD
The skill includes high-level PI actions that parse raw ESI data into actionable status reports.
SKILL=~/.openclaw/workspace/skills/eve-esi
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
CHAR_ID=<your_character_id>
# List all PI planets for a character
python3 $SKILL/scripts/esi_query.py --action pi_planets \
--token "$TOKEN" --character-id $CHAR_ID --pretty
# Full PI status with extractor timers, storage fill, attention flags
python3 $SKILL/scripts/esi_query.py --action pi_status \
--token "$TOKEN" --character-id $CHAR_ID --pretty
# Detailed info for a specific planet
python3 $SKILL/scripts/esi_query.py --action pi_planet_detail \
--token "$TOKEN" --character-id $CHAR_ID --planet-id <PLANET_ID> --pretty
The pi_status action returns parsed data per planet:
| Field | Description |
|-------|-------------|
| planet_name | Resolved planet name (e.g. "Ikoskio VII") |
| extractors | List with product, expiry time, hours remaining, status |
| storage_fill_pct | Estimated launchpad/storage fill percentage |
| factories | Input/output product routing |
| needs_attention | true if extractor < 6h or storage > 80% |
| action_required | Human-readable description of what needs to be done |
ESI provides read-only access to PI. The skill can:
It cannot restart extractors, reroute products, or modify planet setups — that must be done in-game.
SKILL=~/.openclaw/workspace/skills/eve-esi
# Global average/adjusted prices for all items
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty
# Current Jita buy/sell for a specific item (e.g. Coolant = type_id 9832)
python3 $SKILL/scripts/esi_query.py --action jita_price --type-id 9832 --pretty
jita_price action returns lowest sell, highest buy, spread, and order counts for The Forge region.--action supports: pi_planets, pi_planet_detail, pi_status, market_price_bulk, jita_price--character-id is required for PI actions--planet-id is required for pi_planet_detail--type-id is required for jita_price37636f5 (docs: update README for PI action workflow)
Set up automated alerts, scheduled reports, and market price tracking:
# Copy example config
cp config/example-config.json ~/.openclaw/eve-dashboard-config.json
# Edit with your preferences
# Use $ENV:VARIABLE_NAME for tokens — never store secrets in plain text
# Validate
python3 scripts/validate_config.py ~/.openclaw/eve-dashboard-config.json
See config/schema.json for the full schema.
Endpoint presets for PI and market requests are documented in config/esi_endpoints.json.
| Alert | Description |
|-------|-------------|
| war_declared | New war declaration against your corp |
| structure_under_attack | Structure attacked |
| skill_complete | Skill training finished |
| wallet_large_deposit | ISK deposit above threshold |
| industry_job_complete | Manufacturing/research job done |
| pi_extractor_expired | Planetary extraction head expired |
| killmail | New killmail received |
| contract_expired | Contract expired |
| Report | Description |
|--------|-------------|
| net_worth | Total ISK across wallet + assets |
| skill_queue | Current training status |
| industry_jobs | Active manufacturing/research jobs |
| market_orders | Open buy/sell orders |
| wallet_summary | Recent transaction summary |
| assets_summary | Top asset locations by value |
The skill provides threat intelligence for PI operations in low/null-sec systems.
| Source | Data | Auth |
|--------|------|------|
| ESI /universe/system_kills/ | Ship/Pod/NPC kills (last hour) | No |
| ESI /universe/system_jumps/ | Jump traffic (last hour) | No |
| ESI /route/{origin}/{destination}/ | Route planning | No |
| ESI /fw/systems/ | Faction Warfare contested systems | No |
| ESI /incursions/ | Active NPC incursions | No |
| zKillboard API | PVP kills with value (last 24h) | No |
| Level | Score | Advice |
|-------|-------|--------|
| low | 0-15 | Normal PI operations |
| medium | 15-40 | Quick in, quick out |
| high | 40-80 | Scout/Cloak only |
| critical | 80+ | Do NOT enter |
SKILL=~/.openclaw/workspace/skills/eve-esi
# System kills (last hour, optionally filtered)
python3 $SKILL/scripts/esi_query.py --action system_kills --system-ids 30002537 --pretty
# System jump traffic
python3 $SKILL/scripts/esi_query.py --action system_jumps --system-ids 30002537 --pretty
# System info (name, security status)
python3 $SKILL/scripts/esi_query.py --action system_info --system-id 30002537 --pretty
# Route planning
python3 $SKILL/scripts/esi_query.py --action route_plan --origin 30000142 --destination 30002537 --route-flag secure --pretty
# Character location
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
python3 $SKILL/scripts/esi_query.py --action character_location --token "$TOKEN" --character-id $CHAR_ID --pretty
# FW systems & incursions
python3 $SKILL/scripts/esi_query.py --action fw_systems --pretty
python3 $SKILL/scripts/esi_query.py --action incursions --pretty
The threat scoring logic and caching live in the agent workspace (~/.openclaw/workspace/scripts/), not in this repo. See SKILL.md for usage details.
~/.openclaw/eve-tokens.json with chmod 600$ENV:VARIABLE_NAME to keep secrets out of files.gitignore prevents accidental token commitseve-tokens.json or configs with real tokensThe default auth flow requests these scopes:
| Scope | Purpose |
|-------|---------|
| esi-wallet.read_character_wallet.v1 | ISK balance, journal, transactions |
| esi-assets.read_assets.v1 | Item inventory |
| esi-skills.read_skills.v1 | Trained skills, SP |
| esi-skills.read_skillqueue.v1 | Skill queue |
| esi-clones.read_clones.v1 | Jump clones, home station |
| esi-clones.read_implants.v1 | Active implants |
| esi-location.read_location.v1 | Current system/station |
| esi-location.read_ship_type.v1 | Current ship |
| esi-location.read_online.v1 | Online status |
| esi-planets.manage_planets.v1 | PI colonies and extractors |
| esi-industry.read_character_jobs.v1 | Industry jobs |
| esi-markets.read_character_orders.v1 | Market orders |
| esi-contracts.read_character_contracts.v1 | Contracts |
| esi-killmails.read_killmails.v1 | Killmails |
| esi-characters.read_notifications.v1 | Notifications |
| esi-characters.read_fatigue.v1 | Jump fatigue |
| esi-mail.read_mail.v1 | EVE mail |
Edit SCOPES in auth_flow.py to customize.
redis package (optional, only needed for price cache)Redis is used to cache PI market prices with a 1-hour TTL. Without it, market prices are fetched live from ESI on every request.
# Install Redis
sudo apt install redis-server
sudo systemctl enable redis-server
# Install Python redis package
pip3 install redis
# Test
redis-cli ping # → PONG
The companion script cache_market_prices.py (not part of this repo, lives in the agent workspace) fetches PI product prices from ESI and caches them in Redis under the key schema eve:market:price:{type_id}.
File v1.0.6:_meta.json
{ "ownerId": "kn70krghga32ef4e3s75ew2vf980rh5b", "slug": "eve-esi", "version": "1.0.6", "publishedAt": 1771728287485 }
File v1.0.6:references/authentication.md
EVE ESI uses OAuth 2.0 Authorization Code flow via EVE SSO (Single Sign-On).
Base SSO URL: https://login.eveonline.com
http://localhost:8080/callback)https://login.eveonline.com/v2/oauth/authorize/?response_type=code&redirect_uri=<CALLBACK_URL>&client_id=<CLIENT_ID>&scope=<SCOPES>&state=<RANDOM_STATE>
scope: space-separated list (e.g. esi-wallet.read_character_wallet.v1 esi-assets.read_assets.v1)state: random string to prevent CSRFcurl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=<AUTH_CODE>" \
-d "client_id=<CLIENT_ID>" \
-d "code_verifier=<CODE_VERIFIER>"
Response:
{
"access_token": "eyJ...",
"expires_in": 1199,
"token_type": "Bearer",
"refresh_token": "abc123..."
}
Access tokens expire after ~20 minutes. Refresh with:
curl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "refresh_token=<REFRESH_TOKEN>" \
-d "client_id=<CLIENT_ID>"
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
https://login.eveonline.com/oauth/verify
Response includes CharacterID, CharacterName, Scopes.
Pass the access token as a Bearer header:
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
"https://esi.evetech.net/latest/characters/<CHARACTER_ID>/wallet/"
EVE SSO supports PKCE for public clients (no secret key). Generate a code_verifier (random 43-128 char string) and derive code_challenge via SHA-256:
import hashlib, base64, secrets
code_verifier = secrets.token_urlsafe(64)
code_challenge = base64.urlsafe_b64encode(
hashlib.sha256(code_verifier.encode()).digest()
).rstrip(b"=").decode()
Add &code_challenge=<CHALLENGE>&code_challenge_method=S256 to the authorize URL. Include code_verifier in the token exchange.
| Category | Scope |
|----------|-------|
| Wallet | esi-wallet.read_character_wallet.v1 |
| Assets | esi-assets.read_assets.v1 |
| Skills | esi-skills.read_skills.v1, esi-skills.read_skillqueue.v1 |
| Clones | esi-clones.read_clones.v1, esi-clones.read_implants.v1 |
| Location | esi-location.read_location.v1, esi-location.read_ship_type.v1, esi-location.read_online.v1 |
| Contacts | esi-characters.read_contacts.v1 |
| Contracts | esi-contracts.read_character_contracts.v1 |
| Fittings | esi-fittings.read_fittings.v1 |
| Mail | esi-mail.read_mail.v1 |
| Calendar | esi-calendar.read_calendar_events.v1 |
| Industry | esi-industry.read_character_jobs.v1 |
| Market Orders | esi-markets.read_character_orders.v1 |
| Killmails | esi-killmails.read_killmails.v1 |
| Blueprints | esi-characters.read_blueprints.v1 |
| Notifications | esi-characters.read_notifications.v1 |
| Bookmarks | esi-bookmarks.read_character_bookmarks.v1 |
| Loyalty | esi-characters.read_loyalty.v1 |
| Mining | esi-industry.read_character_mining.v1 |
| Roles | esi-characters.read_corporation_roles.v1 |
| Standings | esi-characters.read_standings.v1 |
| Fatigue | esi-characters.read_fatigue.v1 |
| Medals | esi-characters.read_medals.v1 |
| Titles | esi-characters.read_titles.v1 |
| Agent Research | esi-characters.read_agents_research.v1 |
| FW Stats | esi-characters.read_fw_stats.v1 |
File v1.0.6:references/endpoints.md
Base URL: https://esi.evetech.net/latest
All authenticated endpoints require Authorization: Bearer <TOKEN> header. Replace {character_id} with the numeric character ID from SSO verify.
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/ | -- | Public character info (name, corp, birthday, etc.) |
| GET | /characters/{character_id}/online/ | esi-location.read_online.v1 | Online status, last login/logout |
| POST | /characters/affiliation/ | -- | Bulk lookup corp/alliance/faction for character IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/wallet/ | esi-wallet.read_character_wallet.v1 | ISK balance |
| GET | /characters/{character_id}/wallet/journal/ | esi-wallet.read_character_wallet.v1 | Wallet journal (paginated) |
| GET | /characters/{character_id}/wallet/transactions/ | esi-wallet.read_character_wallet.v1 | Wallet transactions |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/assets/ | esi-assets.read_assets.v1 | All assets (paginated) |
| POST | /characters/{character_id}/assets/locations/ | esi-assets.read_assets.v1 | Locations for specific item IDs |
| POST | /characters/{character_id}/assets/names/ | esi-assets.read_assets.v1 | Names for specific item IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/skills/ | esi-skills.read_skills.v1 | All trained skills + total SP |
| GET | /characters/{character_id}/skillqueue/ | esi-skills.read_skillqueue.v1 | Current skill queue |
| GET | /characters/{character_id}/attributes/ | esi-skills.read_skills.v1 | Character attributes (int, mem, etc.) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/clones/ | esi-clones.read_clones.v1 | Jump clones and home location |
| GET | /characters/{character_id}/implants/ | esi-clones.read_implants.v1 | Active implant type IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/location/ | esi-location.read_location.v1 | Current solar system, station/structure |
| GET | /characters/{character_id}/ship/ | esi-location.read_ship_type.v1 | Current ship type and name |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/contacts/ | esi-characters.read_contacts.v1 | Contact list |
| POST | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Add contacts |
| PUT | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Edit contacts |
| DELETE | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Delete contacts |
| GET | /characters/{character_id}/contacts/labels/ | esi-characters.read_contacts.v1 | Contact labels |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/contracts/ | esi-contracts.read_character_contracts.v1 | All contracts (paginated) |
| GET | /characters/{character_id}/contracts/{contract_id}/bids/ | esi-contracts.read_character_contracts.v1 | Bids on a contract |
| GET | /characters/{character_id}/contracts/{contract_id}/items/ | esi-contracts.read_character_contracts.v1 | Items in a contract |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/calendar/ | esi-calendar.read_calendar_events.v1 | Upcoming events (50 max) |
| GET | /characters/{character_id}/calendar/{event_id}/ | esi-calendar.read_calendar_events.v1 | Event details |
| GET | /characters/{character_id}/calendar/{event_id}/attendees/ | esi-calendar.read_calendar_events.v1 | Event attendees |
| PUT | /characters/{character_id}/calendar/{event_id}/ | esi-calendar.respond_calendar_events.v1 | Respond to event |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fittings/ | esi-fittings.read_fittings.v1 | Saved fittings |
| POST | /characters/{character_id}/fittings/ | esi-fittings.write_fittings.v1 | Create a fitting |
| DELETE | /characters/{character_id}/fittings/{fitting_id}/ | esi-fittings.write_fittings.v1 | Delete a fitting |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/industry/jobs/ | esi-industry.read_character_jobs.v1 | Industry jobs (manufacturing, research, etc.) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/killmails/recent/ | esi-killmails.read_killmails.v1 | Recent killmail IDs + hashes |
| GET | /killmails/{killmail_id}/{killmail_hash}/ | -- | Full killmail details (public) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/mail/ | esi-mail.read_mail.v1 | Mail headers (paginated) |
| GET | /characters/{character_id}/mail/{mail_id}/ | esi-mail.read_mail.v1 | Single mail body |
| POST | /characters/{character_id}/mail/ | esi-mail.send_mail.v1 | Send a mail |
| PUT | /characters/{character_id}/mail/{mail_id}/ | esi-mail.organize_mail.v1 | Update labels / mark read |
| DELETE | /characters/{character_id}/mail/{mail_id}/ | esi-mail.organize_mail.v1 | Delete a mail |
| GET | /characters/{character_id}/mail/labels/ | esi-mail.read_mail.v1 | Mail labels + unread counts |
| POST | /characters/{character_id}/mail/labels/ | esi-mail.organize_mail.v1 | Create mail label |
| GET | /characters/{character_id}/mail/lists/ | esi-mail.read_mail.v1 | Mailing lists |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/orders/ | esi-markets.read_character_orders.v1 | Active market orders |
| GET | /characters/{character_id}/orders/history/ | esi-markets.read_character_orders.v1 | Expired/cancelled orders (paginated) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/mining/ | esi-industry.read_character_mining.v1 | Mining ledger (last 30 days) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/notifications/ | esi-characters.read_notifications.v1 | All notifications |
| GET | /characters/{character_id}/notifications/contacts/ | esi-characters.read_notifications.v1 | Contact notifications |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/loyalty/points/ | esi-characters.read_loyalty.v1 | LP balances per corp |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/planets/ | esi-planets.manage_planets.v1 | List of colonies |
| GET | /characters/{character_id}/planets/{planet_id}/ | esi-planets.manage_planets.v1 | Colony layout and extractors |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/blueprints/ | esi-characters.read_blueprints.v1 | All blueprints (paginated) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/roles/ | esi-characters.read_corporation_roles.v1 | Corporation roles |
| GET | /characters/{character_id}/titles/ | esi-characters.read_titles.v1 | Corporation titles |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/standings/ | esi-characters.read_standings.v1 | NPC standings |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/bookmarks/ | esi-bookmarks.read_character_bookmarks.v1 | All bookmarks (paginated) |
| GET | /characters/{character_id}/bookmarks/folders/ | esi-bookmarks.read_character_bookmarks.v1 | Bookmark folders |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/medals/ | esi-characters.read_medals.v1 | Awarded medals |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/agents_research/ | esi-characters.read_agents_research.v1 | Research agents and points |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fatigue/ | esi-characters.read_fatigue.v1 | Jump fatigue expiry timestamps |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fw/stats/ | esi-characters.read_fw_stats.v1 | FW kill/VP stats |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/corporationhistory/ | -- | Public employment history |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/portrait/ | -- | Portrait URLs (64/128/256/512px) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/search/ | esi-search.search_structures.v1 | Authenticated search (includes structures) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fleet/ | esi-fleets.read_fleet.v1 | Current fleet info |
Paginated endpoints return X-Pages header. Append ?page=N (1-based). Always check X-Pages to determine total pages.
Every response includes Expires and Last-Modified headers. Do not request again before Expires. Use If-None-Match with the ETag header for conditional requests (returns 304 if unchanged).
403: Missing scope or wrong character404: Resource not found420: Error rate limited (back off and retry)502/503/504: Upstream server issue (retry with backoff)X-ESI-Error-Limit-Remain and X-ESI-Error-Limit-Reset headersFile v1.0.6:config/esi_endpoints.json
{ "pi_planets": { "path": "/characters/{character_id}/planets/", "method": "GET", "auth": true, "scope": "esi-planets.manage_planets.v1", "description": "Liste aller PI-Planeten eines Characters" }, "pi_planet_detail": { "path": "/characters/{character_id}/planets/{planet_id}/", "method": "GET", "auth": true, "scope": "esi-planets.manage_planets.v1", "description": "Extraktoren, Factories, Links und Routes eines Planeten" }, "universe_planet": { "path": "/universe/planets/{planet_id}/", "method": "GET", "auth": false, "description": "Planet-Metadaten (Name, Typ, System)" }, "market_prices": { "path": "/markets/prices/", "method": "GET", "auth": false, "description": "Alle adjusted/average Preise (global)" }, "market_orders": { "path": "/markets/10000002/orders/", "method": "GET", "auth": false, "params": [ "type_id", "order_type" ], "description": "Jita Buy/Sell Orders fuer ein bestimmtes Item" }, "system_kills": { "path": "/universe/system_kills/", "method": "GET", "auth": false, "description": "Ship/Pod/NPC Kills pro System (letzte Stunde)" }, "system_jumps": { "path": "/universe/system_jumps/", "method": "GET", "auth": false, "description": "Jump-Traffic pro System (letzte Stunde)" }, "route": { "path": "/route/{origin}/{destination}/", "method": "GET", "auth": false, "params": ["flag"], "description": "Routenplanung (flags: shortest, secure, insecure)" }, "system_info": { "path": "/universe/systems/{system_id}/", "method": "GET", "auth": false, "description": "System-Name, Security-Status, Constellation, Star" }, "incursions": { "path": "/incursions/", "method": "GET", "auth": false, "description": "Aktive NPC-Incursions (Constellation, Staging System, State)" }, "fw_systems": { "path": "/fw/systems/", "method": "GET", "auth": false, "description": "Faction-Warfare umkaempfte Systeme mit Ownership/Contested-Level" } }
File v1.0.6:config/example-config.json
{ "schema_version": "1.0",
"notification_channels": { "telegram": { "bot_token": "$ENV:TELEGRAM_BOT_TOKEN", "chat_id": "$ENV:TELEGRAM_CHAT_ID" } },
"characters": [ { "id": 2114794365, "name": "Main Character", "token": "$ENV:EVE_TOKEN_MAIN", "refresh_token": "$ENV:EVE_REFRESH_MAIN", "client_id": "$ENV:EVE_CLIENT_ID", "scopes": [ "esi-wallet.read_character_wallet.v1", "esi-skills.read_skills.v1", "esi-skills.read_skillqueue.v1", "esi-assets.read_assets.v1", "esi-clones.read_clones.v1", "esi-clones.read_implants.v1", "esi-location.read_location.v1", "esi-location.read_ship_type.v1", "esi-location.read_online.v1", "esi-characters.read_notifications.v1", "esi-industry.read_character_jobs.v1", "esi-markets.read_character_orders.v1", "esi-contracts.read_character_contracts.v1", "esi-killmails.read_killmails.v1", "esi-planets.manage_planets.v1", "esi-characters.read_fatigue.v1", "esi-mail.read_mail.v1" ], "corporation": { "id": 98000001, "name": "My Corp" }, "enabled": true } ],
"alerts": { "enabled": true, "check_interval": "5m", "channels": ["telegram"], "rules": [ { "type": "war_declared", "severity": "critical" }, { "type": "structure_under_attack", "severity": "critical" }, { "type": "structure_fuel_low", "severity": "warning", "threshold": 24 }, { "type": "skill_complete", "severity": "info", "cooldown": "1h" }, { "type": "wallet_large_deposit", "severity": "info", "threshold": 1000000000 }, { "type": "industry_job_complete", "severity": "info", "cooldown": "30m" }, { "type": "pi_extractor_expired", "severity": "warning" }, { "type": "killmail", "severity": "info" }, { "type": "contract_expired", "severity": "warning", "cooldown": "2h" } ] },
"reports": { "enabled": true, "schedule": "0 9,21 * * *", "timezone": "Europe/Berlin", "channels": ["telegram"], "templates": [ { "name": "net_worth", "format": "short" }, { "name": "skill_queue", "format": "detailed" }, { "name": "wallet_summary", "format": "short" }, { "name": "assets_summary", "format": "short" } ] },
"market": { "enabled": true, "check_interval": "30m", "channels": ["telegram"], "items": [ { "type_id": 44992, "name": "PLEX", "region_id": 10000002, "region_name": "The Forge", "alert_above": 4500000, "alert_below": 3500000, "trend_alert": { "change_percent": 10, "time_window": "1h" }, "cooldown": "1h" }, { "type_id": 34, "name": "Tritanium", "region_id": 10000002, "region_name": "The Forge", "trend_alert": { "change_percent": 15, "time_window": "6h" } }, { "type_id": 16274, "name": "Skill Injector", "region_id": 10000002, "region_name": "The Forge", "alert_below": 800000000, "cooldown": "2h" } ] } }
File v1.0.6:config/schema.json
{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "EVE Dashboard Config", "description": "Modular config schema for the EVE Command Center. Each user configures which alerts, reports, and market trackers they need.", "type": "object", "properties": {
"schema_version": {
"type": "string",
"description": "Schema version for future migrations",
"default": "1.0",
"enum": ["1.0"]
},
"notification_channels": {
"type": "object",
"description": "Connection details for notification channels. Values can be literal or $ENV:VARIABLE_NAME references.",
"properties": {
"telegram": {
"type": "object",
"properties": {
"bot_token": {
"type": "string",
"description": "Telegram Bot Token (e.g. '123456:ABC-DEF...' or '$ENV:TELEGRAM_BOT_TOKEN')"
},
"chat_id": {
"type": "string",
"description": "Telegram Chat ID (e.g. '-100123456789' or '$ENV:TELEGRAM_CHAT_ID')"
}
},
"required": ["bot_token", "chat_id"]
},
"discord": {
"type": "object",
"properties": {
"webhook_url": {
"type": "string",
"description": "Discord Webhook URL (or '$ENV:DISCORD_WEBHOOK_URL')"
}
},
"required": ["webhook_url"]
}
},
"additionalProperties": false
},
"characters": {
"type": "array",
"description": "EVE characters to monitor, with auth tokens and granted scopes",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "EVE Character ID (from SSO /oauth/verify)"
},
"name": {
"type": "string",
"description": "Display name (optional, for readability)"
},
"token": {
"type": "string",
"description": "ESI Access Token (or '$ENV:EVE_TOKEN_MAIN'). Expires after ~20min."
},
"refresh_token": {
"type": "string",
"description": "ESI Refresh Token for automatic renewal (or '$ENV:EVE_REFRESH_MAIN')"
},
"client_id": {
"type": "string",
"description": "EVE Developer App Client ID (or '$ENV:EVE_CLIENT_ID')"
},
"scopes": {
"type": "array",
"description": "List of granted ESI scopes. Validated against required scopes during config check.",
"items": {
"type": "string"
},
"examples": [
["esi-wallet.read_character_wallet.v1", "esi-skills.read_skills.v1", "esi-skills.read_skillqueue.v1"]
]
},
"corporation": {
"type": "object",
"description": "Corporation association (optional, otherwise derived from ESI)",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" }
}
},
"enabled": {
"type": "boolean",
"description": "Whether to actively monitor this character",
"default": true
}
},
"required": ["id", "token", "refresh_token", "client_id", "scopes"]
},
"minItems": 1
},
"alerts": {
"type": "object",
"description": "Real-time alerts via ESI polling. Checks for changes at regular intervals.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"check_interval": {
"type": "string",
"description": "Polling interval (e.g. '5m', '15m', '1h')",
"default": "5m",
"pattern": "^[0-9]+(s|m|h)$"
},
"channels": {
"type": "array",
"description": "Which notification channels to use for alerts",
"items": {
"type": "string",
"enum": ["telegram", "discord"]
}
},
"rules": {
"type": "array",
"description": "Alert rules. Each rule defines a trigger type with optional thresholds.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"war_declared",
"war_surrendered",
"structure_fuel_low",
"structure_under_attack",
"skill_complete",
"wallet_large_deposit",
"wallet_large_withdrawal",
"contract_expired",
"industry_job_complete",
"pi_extractor_expired",
"clone_jump_available",
"mail_received",
"killmail"
],
"description": "Alert type. Each type requires specific ESI scopes."
},
"severity": {
"type": "string",
"enum": ["info", "warning", "critical"],
"default": "info",
"description": "Severity level — affects notification formatting and priority"
},
"threshold": {
"type": "number",
"description": "Numeric threshold (e.g. ISK amount for wallet alerts, fuel hours for structure alerts)"
},
"cooldown": {
"type": "string",
"description": "Minimum time between repeated alerts of the same type",
"default": "1h",
"pattern": "^[0-9]+(s|m|h)$"
},
"character_filter": {
"type": "array",
"items": { "type": "integer" },
"description": "Only trigger for specific character IDs. Empty = all characters."
}
},
"required": ["type"]
}
}
},
"additionalProperties": false
},
"reports": {
"type": "object",
"description": "Scheduled reports — generated and sent on a cron schedule.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"schedule": {
"type": "string",
"description": "Cron expression (e.g. '0 9 * * *' = daily at 9am, '0 9,21 * * *' = 9am and 9pm)",
"default": "0 9 * * *"
},
"timezone": {
"type": "string",
"description": "IANA timezone for the cron schedule",
"default": "Europe/Berlin"
},
"channels": {
"type": "array",
"items": { "type": "string", "enum": ["telegram", "discord"] }
},
"templates": {
"type": "array",
"description": "Which reports to generate",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": [
"net_worth",
"skill_queue",
"industry_jobs",
"market_orders",
"wallet_summary",
"assets_summary"
],
"description": "Report template name"
},
"format": {
"type": "string",
"enum": ["short", "detailed"],
"default": "short",
"description": "'short' = compact summary, 'detailed' = full report"
},
"character_filter": {
"type": "array",
"items": { "type": "integer" },
"description": "Only include specific character IDs. Empty = all characters."
}
},
"required": ["name"]
}
}
},
"additionalProperties": false
},
"market": {
"type": "object",
"description": "Price tracking for items with threshold and trend alerts.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"check_interval": {
"type": "string",
"description": "Polling interval for market prices",
"default": "30m",
"pattern": "^[0-9]+(s|m|h)$"
},
"channels": {
"type": "array",
"items": { "type": "string", "enum": ["telegram", "discord"] },
"description": "Where to send market alerts. If empty, falls back to alerts.channels."
},
"items": {
"type": "array",
"description": "Items to track with price thresholds",
"items": {
"type": "object",
"properties": {
"type_id": {
"type": "integer",
"description": "EVE Type ID (e.g. 44992 = PLEX). Resolve via /universe/types/{id}/"
},
"name": {
"type": "string",
"description": "Display name of the item"
},
"region_id": {
"type": "integer",
"description": "Region ID for market data",
"default": 10000002
},
"region_name": {
"type": "string",
"description": "Region display name",
"default": "The Forge"
},
"alert_above": {
"type": "number",
"description": "Alert when price exceeds this value (ISK)"
},
"alert_below": {
"type": "number",
"description": "Alert when price drops below this value (ISK)"
},
"trend_alert": {
"type": "object",
"description": "Percentage price change within a time window",
"properties": {
"change_percent": {
"type": "number",
"description": "Percentage change that triggers an alert",
"default": 10
},
"time_window": {
"type": "string",
"description": "Time window for trend calculation",
"default": "1h",
"pattern": "^[0-9]+(m|h|d)$"
}
}
},
"cooldown": {
"type": "string",
"description": "Cooldown between market alerts for this item",
"default": "1h",
"pattern": "^[0-9]+(s|m|h)$"
}
},
"required": ["type_id", "name"]
}
}
},
"additionalProperties": false
}
}, "required": ["schema_version", "characters", "notification_channels"], "additionalProperties": false }
Archive v1.0.5: 11 files, 23504 bytes
Files: config/example-config.json (3738b), config/schema.json (11304b), README.md (5142b), references/authentication.md (4082b), references/endpoints.md (12013b), scripts/auth_flow.py (6321b), scripts/esi_query.py (4596b), scripts/get_token.py (3364b), scripts/validate_config.py (13527b), SKILL.md (10095b), _meta.json (126b)
File v1.0.5:SKILL.md
name: eve-esi description: "Query and manage EVE Online characters via the ESI (EVE Swagger Interface) REST API. Use when the user asks about EVE Online character data, wallet balance, ISK transactions, assets, skill queue, skill points, clone locations, implants, fittings, contracts, market orders, mail, industry jobs, killmails, planetary interaction, loyalty points, or any other EVE account management task." env:
This skill communicates exclusively with the official EVE Online ESI API (esi.evetech.net) and EVE SSO (login.eveonline.com).
No character data is exfiltrated to third-party servers.
Optional integrations (Telegram, Discord) are user-configured via environment variables and only transmit alerts defined by the user.
The ESI (EVE Swagger Interface) is the official REST API for EVE Online third-party development.
https://esi.evetech.net/latesthttps://esi.evetech.net/latest/swagger.jsonAll scripts live at: ~/.openclaw/workspace/skills/eve-esi/scripts/
Always use full paths when calling scripts:
SKILL=~/.openclaw/workspace/skills/eve-esi
Tokens are stored in ~/.openclaw/eve-tokens.json (created by auth_flow.py, chmod 600).
All scripts (get_token.py, esi_query.py) read from this file directly — no env vars are required for normal operation.
First-time setup (once per character):
# 1. Set up SSH tunnel on your local PC:
# ssh -L 8080:127.0.0.1:8080 user@your-server -N
# 2. Run auth flow on server (pass Client ID directly):
python3 ~/.openclaw/workspace/skills/eve-esi/scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# 3. Open the shown URL in browser, log in with EVE account
Get a fresh access token (tokens expire after ~20min, refresh is automatic):
TOKEN=$(python3 ~/.openclaw/workspace/skills/eve-esi/scripts/get_token.py --char main)
List authenticated characters:
python3 ~/.openclaw/workspace/skills/eve-esi/scripts/get_token.py --list
For full OAuth2/PKCE details: see references/authentication.md.
# Character public info
curl -s "https://esi.evetech.net/latest/characters/2114794365/" | python -m json.tool
# Portrait URLs
curl -s "https://esi.evetech.net/latest/characters/2114794365/portrait/"
# Corporation history
curl -s "https://esi.evetech.net/latest/characters/2114794365/corporationhistory/"
# Bulk affiliation lookup
curl -s -X POST "https://esi.evetech.net/latest/characters/affiliation/" \
-H "Content-Type: application/json" \
-d '[2114794365, 95538921]'
TOKEN="<your_access_token>"
CHAR_ID="<your_character_id>"
# Online status (scope: esi-location.read_online.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/online/"
# Balance (scope: esi-wallet.read_character_wallet.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/"
# Journal (paginated)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/journal/?page=1"
# Transactions
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/wallet/transactions/"
# All assets (paginated; scope: esi-assets.read_assets.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/?page=1"
# Resolve item locations
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[1234567890, 9876543210]' \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/locations/"
# Resolve item names
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '[1234567890]' \
"https://esi.evetech.net/latest/characters/$CHAR_ID/assets/names/"
# All trained skills + total SP (scope: esi-skills.read_skills.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/skills/"
# Skill queue (scope: esi-skills.read_skillqueue.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/skillqueue/"
# Attributes (intelligence, memory, etc.)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/attributes/"
# Current location (scope: esi-location.read_location.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/location/"
# Current ship (scope: esi-location.read_ship_type.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/ship/"
# Jump clones + home station (scope: esi-clones.read_clones.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/clones/"
# Active implants (scope: esi-clones.read_implants.v1)
curl -s -H "Authorization: Bearer $TOKEN" \
"https://esi.evetech.net/latest/characters/$CHAR_ID/implants/"
For contracts, fittings, mail, industry, killmails, market orders, mining, planetary interaction, loyalty points, notifications, blueprints, standings, and all other character endpoints, see references/endpoints.md.
The skill supports a modular dashboard config for alerts, reports, and market tracking. Each user defines what they need in a JSON config file.
| Module | Description | |--------|-------------| | Alerts | Real-time polling for war decs, structure attacks, skill completions, wallet changes, industry jobs, PI extractors, killmails, contracts, clone jumps, mail | | Reports | Cron-scheduled summaries: net worth, skill queue, industry, market orders, wallet, assets | | Market | Price tracking with absolute thresholds and trend detection |
Tokens should not be stored in plain text. Use environment variable references:
{
"token": "$ENV:EVE_TOKEN_MAIN",
"refresh_token": "$ENV:EVE_REFRESH_MAIN"
}
The config file should live outside the workspace (e.g. ~/.openclaw/eve-dashboard-config.json).
python scripts/validate_config.py path/to/config.json
# Show example config
python scripts/validate_config.py --example
# Show JSON schema
python scripts/validate_config.py --schema
SKILL=~/.openclaw/workspace/skills/eve-esi
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
CHAR_ID=$(python3 $SKILL/scripts/get_token.py --char main --json | python3 -c "import sys,json; print(json.load(sys.stdin))" 2>/dev/null)
# Simple query
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/wallet/" --pretty
# Fetch all pages of assets
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/assets/" --pages --pretty
# POST request (e.g. asset names)
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" --endpoint "/characters/$CHAR_ID/assets/names/" \
--method POST --body '[1234567890]' --pretty
Expires header; do not poll before it expires.X-ESI-Error-Limit-Remain; back off when low.X-Pages response header; iterate with ?page=N./latest/ for current stable routes. /dev/ may change without notice.ESI returns numeric type IDs (e.g. for ships, items, skills). Resolve names via:
# Single type
curl -s "https://esi.evetech.net/latest/universe/types/587/"
# Bulk names (up to 1000 IDs)
curl -s -X POST "https://esi.evetech.net/latest/universe/names/" \
-H "Content-Type: application/json" \
-d '[587, 638, 11393]'
File v1.0.5:README.md
An OpenClaw skill for interacting with the EVE Online ESI API (EVE Swagger Interface).
eve-esi/
├── SKILL.md # OpenClaw skill instructions
├── README.md # This file
├── scripts/
│ ├── auth_flow.py # One-time EVE SSO OAuth2 authentication
│ ├── get_token.py # Token refresh helper (auto-rotates)
│ ├── esi_query.py # ESI query helper with pagination
│ └── validate_config.py # Dashboard config validator
├── config/
│ ├── schema.json # JSON Schema for dashboard config
│ └── example-config.json # Ready-to-use template
└── references/
├── authentication.md # EVE SSO OAuth2 + PKCE details
└── endpoints.md # All character endpoints + scopes
cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi
Prerequisites:
http://127.0.0.1:8080/callbackOne-time auth per character (requires browser access):
# If on a remote server, set up an SSH tunnel first:
ssh -L 8080:127.0.0.1:8080 user@your-server -N
# Run the auth flow:
python3 scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# Open the shown URL in your browser and log in with your EVE account
Tokens are stored in ~/.openclaw/eve-tokens.json (chmod 600).
Authenticate additional characters:
python3 scripts/auth_flow.py --client-id <CLIENT_ID> --char-name alt1
SKILL=~/.openclaw/workspace/skills/eve-esi
# Get a fresh access token (auto-refreshes on every call)
TOKEN=$(python3 $SKILL/scripts/get_token.py --char main)
# List all authenticated characters
python3 $SKILL/scripts/get_token.py --list
# Wallet balance
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/wallet/" --pretty
# Skill queue
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/skillqueue/" --pretty
# All assets (paginated)
python3 $SKILL/scripts/esi_query.py --token "$TOKEN" \
--endpoint "/characters/<CHAR_ID>/assets/" --pages --pretty
Set up automated alerts, scheduled reports, and market price tracking:
# Copy example config
cp config/example-config.json ~/.openclaw/eve-dashboard-config.json
# Edit with your character IDs and preferences
# Use $ENV:VARIABLE_NAME for tokens — never store secrets in plain text
# Validate
python3 scripts/validate_config.py ~/.openclaw/eve-dashboard-config.json
See config/schema.json for the full schema.
| Alert | Description |
|-------|-------------|
| war_declared | New war declaration against your corp |
| structure_under_attack | Structure attacked |
| structure_fuel_low | Fuel below threshold (hours) |
| skill_complete | Skill training finished |
| wallet_large_deposit | ISK deposit above threshold |
| industry_job_complete | Manufacturing/research job done |
| pi_extractor_expired | Planetary extraction head expired |
| killmail | New killmail received |
| contract_expired | Contract expired |
| Report | Description |
|--------|-------------|
| net_worth | Total ISK across wallet + assets |
| skill_queue | Current training status |
| industry_jobs | Active manufacturing/research jobs |
| market_orders | Open buy/sell orders |
| wallet_summary | Recent transaction summary |
| assets_summary | Top asset locations by value |
~/.openclaw/eve-tokens.json with chmod 600$ENV:VARIABLE_NAME to keep secrets out of fileseve-tokens.json or configs with real tokensFile v1.0.5:_meta.json
{ "ownerId": "kn70krghga32ef4e3s75ew2vf980rh5b", "slug": "eve-esi", "version": "1.0.5", "publishedAt": 1771461710973 }
File v1.0.5:references/authentication.md
EVE ESI uses OAuth 2.0 Authorization Code flow via EVE SSO (Single Sign-On).
Base SSO URL: https://login.eveonline.com
http://localhost:8080/callback)https://login.eveonline.com/v2/oauth/authorize/?response_type=code&redirect_uri=<CALLBACK_URL>&client_id=<CLIENT_ID>&scope=<SCOPES>&state=<RANDOM_STATE>
scope: space-separated list (e.g. esi-wallet.read_character_wallet.v1 esi-assets.read_assets.v1)state: random string to prevent CSRFcurl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=<AUTH_CODE>" \
-d "client_id=<CLIENT_ID>" \
-d "code_verifier=<CODE_VERIFIER>"
Response:
{
"access_token": "eyJ...",
"expires_in": 1199,
"token_type": "Bearer",
"refresh_token": "abc123..."
}
Access tokens expire after ~20 minutes. Refresh with:
curl -X POST https://login.eveonline.com/v2/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "refresh_token=<REFRESH_TOKEN>" \
-d "client_id=<CLIENT_ID>"
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
https://login.eveonline.com/oauth/verify
Response includes CharacterID, CharacterName, Scopes.
Pass the access token as a Bearer header:
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
"https://esi.evetech.net/latest/characters/<CHARACTER_ID>/wallet/"
EVE SSO supports PKCE for public clients (no secret key). Generate a code_verifier (random 43-128 char string) and derive code_challenge via SHA-256:
import hashlib, base64, secrets
code_verifier = secrets.token_urlsafe(64)
code_challenge = base64.urlsafe_b64encode(
hashlib.sha256(code_verifier.encode()).digest()
).rstrip(b"=").decode()
Add &code_challenge=<CHALLENGE>&code_challenge_method=S256 to the authorize URL. Include code_verifier in the token exchange.
| Category | Scope |
|----------|-------|
| Wallet | esi-wallet.read_character_wallet.v1 |
| Assets | esi-assets.read_assets.v1 |
| Skills | esi-skills.read_skills.v1, esi-skills.read_skillqueue.v1 |
| Clones | esi-clones.read_clones.v1, esi-clones.read_implants.v1 |
| Location | esi-location.read_location.v1, esi-location.read_ship_type.v1, esi-location.read_online.v1 |
| Contacts | esi-characters.read_contacts.v1 |
| Contracts | esi-contracts.read_character_contracts.v1 |
| Fittings | esi-fittings.read_fittings.v1 |
| Mail | esi-mail.read_mail.v1 |
| Calendar | esi-calendar.read_calendar_events.v1 |
| Industry | esi-industry.read_character_jobs.v1 |
| Market Orders | esi-markets.read_character_orders.v1 |
| Killmails | esi-killmails.read_killmails.v1 |
| Blueprints | esi-characters.read_blueprints.v1 |
| Notifications | esi-characters.read_notifications.v1 |
| Bookmarks | esi-bookmarks.read_character_bookmarks.v1 |
| Loyalty | esi-characters.read_loyalty.v1 |
| Mining | esi-industry.read_character_mining.v1 |
| Roles | esi-characters.read_corporation_roles.v1 |
| Standings | esi-characters.read_standings.v1 |
| Fatigue | esi-characters.read_fatigue.v1 |
| Medals | esi-characters.read_medals.v1 |
| Titles | esi-characters.read_titles.v1 |
| Agent Research | esi-characters.read_agents_research.v1 |
| FW Stats | esi-characters.read_fw_stats.v1 |
File v1.0.5:references/endpoints.md
Base URL: https://esi.evetech.net/latest
All authenticated endpoints require Authorization: Bearer <TOKEN> header. Replace {character_id} with the numeric character ID from SSO verify.
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/ | -- | Public character info (name, corp, birthday, etc.) |
| GET | /characters/{character_id}/online/ | esi-location.read_online.v1 | Online status, last login/logout |
| POST | /characters/affiliation/ | -- | Bulk lookup corp/alliance/faction for character IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/wallet/ | esi-wallet.read_character_wallet.v1 | ISK balance |
| GET | /characters/{character_id}/wallet/journal/ | esi-wallet.read_character_wallet.v1 | Wallet journal (paginated) |
| GET | /characters/{character_id}/wallet/transactions/ | esi-wallet.read_character_wallet.v1 | Wallet transactions |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/assets/ | esi-assets.read_assets.v1 | All assets (paginated) |
| POST | /characters/{character_id}/assets/locations/ | esi-assets.read_assets.v1 | Locations for specific item IDs |
| POST | /characters/{character_id}/assets/names/ | esi-assets.read_assets.v1 | Names for specific item IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/skills/ | esi-skills.read_skills.v1 | All trained skills + total SP |
| GET | /characters/{character_id}/skillqueue/ | esi-skills.read_skillqueue.v1 | Current skill queue |
| GET | /characters/{character_id}/attributes/ | esi-skills.read_skills.v1 | Character attributes (int, mem, etc.) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/clones/ | esi-clones.read_clones.v1 | Jump clones and home location |
| GET | /characters/{character_id}/implants/ | esi-clones.read_implants.v1 | Active implant type IDs |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/location/ | esi-location.read_location.v1 | Current solar system, station/structure |
| GET | /characters/{character_id}/ship/ | esi-location.read_ship_type.v1 | Current ship type and name |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/contacts/ | esi-characters.read_contacts.v1 | Contact list |
| POST | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Add contacts |
| PUT | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Edit contacts |
| DELETE | /characters/{character_id}/contacts/ | esi-characters.write_contacts.v1 | Delete contacts |
| GET | /characters/{character_id}/contacts/labels/ | esi-characters.read_contacts.v1 | Contact labels |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/contracts/ | esi-contracts.read_character_contracts.v1 | All contracts (paginated) |
| GET | /characters/{character_id}/contracts/{contract_id}/bids/ | esi-contracts.read_character_contracts.v1 | Bids on a contract |
| GET | /characters/{character_id}/contracts/{contract_id}/items/ | esi-contracts.read_character_contracts.v1 | Items in a contract |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/calendar/ | esi-calendar.read_calendar_events.v1 | Upcoming events (50 max) |
| GET | /characters/{character_id}/calendar/{event_id}/ | esi-calendar.read_calendar_events.v1 | Event details |
| GET | /characters/{character_id}/calendar/{event_id}/attendees/ | esi-calendar.read_calendar_events.v1 | Event attendees |
| PUT | /characters/{character_id}/calendar/{event_id}/ | esi-calendar.respond_calendar_events.v1 | Respond to event |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fittings/ | esi-fittings.read_fittings.v1 | Saved fittings |
| POST | /characters/{character_id}/fittings/ | esi-fittings.write_fittings.v1 | Create a fitting |
| DELETE | /characters/{character_id}/fittings/{fitting_id}/ | esi-fittings.write_fittings.v1 | Delete a fitting |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/industry/jobs/ | esi-industry.read_character_jobs.v1 | Industry jobs (manufacturing, research, etc.) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/killmails/recent/ | esi-killmails.read_killmails.v1 | Recent killmail IDs + hashes |
| GET | /killmails/{killmail_id}/{killmail_hash}/ | -- | Full killmail details (public) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/mail/ | esi-mail.read_mail.v1 | Mail headers (paginated) |
| GET | /characters/{character_id}/mail/{mail_id}/ | esi-mail.read_mail.v1 | Single mail body |
| POST | /characters/{character_id}/mail/ | esi-mail.send_mail.v1 | Send a mail |
| PUT | /characters/{character_id}/mail/{mail_id}/ | esi-mail.organize_mail.v1 | Update labels / mark read |
| DELETE | /characters/{character_id}/mail/{mail_id}/ | esi-mail.organize_mail.v1 | Delete a mail |
| GET | /characters/{character_id}/mail/labels/ | esi-mail.read_mail.v1 | Mail labels + unread counts |
| POST | /characters/{character_id}/mail/labels/ | esi-mail.organize_mail.v1 | Create mail label |
| GET | /characters/{character_id}/mail/lists/ | esi-mail.read_mail.v1 | Mailing lists |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/orders/ | esi-markets.read_character_orders.v1 | Active market orders |
| GET | /characters/{character_id}/orders/history/ | esi-markets.read_character_orders.v1 | Expired/cancelled orders (paginated) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/mining/ | esi-industry.read_character_mining.v1 | Mining ledger (last 30 days) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/notifications/ | esi-characters.read_notifications.v1 | All notifications |
| GET | /characters/{character_id}/notifications/contacts/ | esi-characters.read_notifications.v1 | Contact notifications |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/loyalty/points/ | esi-characters.read_loyalty.v1 | LP balances per corp |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/planets/ | esi-planets.manage_planets.v1 | List of colonies |
| GET | /characters/{character_id}/planets/{planet_id}/ | esi-planets.manage_planets.v1 | Colony layout and extractors |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/blueprints/ | esi-characters.read_blueprints.v1 | All blueprints (paginated) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/roles/ | esi-characters.read_corporation_roles.v1 | Corporation roles |
| GET | /characters/{character_id}/titles/ | esi-characters.read_titles.v1 | Corporation titles |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/standings/ | esi-characters.read_standings.v1 | NPC standings |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/bookmarks/ | esi-bookmarks.read_character_bookmarks.v1 | All bookmarks (paginated) |
| GET | /characters/{character_id}/bookmarks/folders/ | esi-bookmarks.read_character_bookmarks.v1 | Bookmark folders |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/medals/ | esi-characters.read_medals.v1 | Awarded medals |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/agents_research/ | esi-characters.read_agents_research.v1 | Research agents and points |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fatigue/ | esi-characters.read_fatigue.v1 | Jump fatigue expiry timestamps |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fw/stats/ | esi-characters.read_fw_stats.v1 | FW kill/VP stats |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/corporationhistory/ | -- | Public employment history |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/portrait/ | -- | Portrait URLs (64/128/256/512px) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/search/ | esi-search.search_structures.v1 | Authenticated search (includes structures) |
| Method | Path | Scope | Description |
|--------|------|-------|-------------|
| GET | /characters/{character_id}/fleet/ | esi-fleets.read_fleet.v1 | Current fleet info |
Paginated endpoints return X-Pages header. Append ?page=N (1-based). Always check X-Pages to determine total pages.
Every response includes Expires and Last-Modified headers. Do not request again before Expires. Use If-None-Match with the ETag header for conditional requests (returns 304 if unchanged).
403: Missing scope or wrong character404: Resource not found420: Error rate limited (back off and retry)502/503/504: Upstream server issue (retry with backoff)X-ESI-Error-Limit-Remain and X-ESI-Error-Limit-Reset headersFile v1.0.5:config/example-config.json
{ "schema_version": "1.0",
"notification_channels": { "telegram": { "bot_token": "$ENV:TELEGRAM_BOT_TOKEN", "chat_id": "$ENV:TELEGRAM_CHAT_ID" } },
"characters": [ { "id": 2114794365, "name": "Main Character", "token": "$ENV:EVE_TOKEN_MAIN", "refresh_token": "$ENV:EVE_REFRESH_MAIN", "client_id": "$ENV:EVE_CLIENT_ID", "scopes": [ "esi-wallet.read_character_wallet.v1", "esi-skills.read_skills.v1", "esi-skills.read_skillqueue.v1", "esi-assets.read_assets.v1", "esi-clones.read_clones.v1", "esi-clones.read_implants.v1", "esi-location.read_location.v1", "esi-location.read_ship_type.v1", "esi-location.read_online.v1", "esi-characters.read_notifications.v1", "esi-industry.read_character_jobs.v1", "esi-markets.read_character_orders.v1", "esi-contracts.read_character_contracts.v1", "esi-killmails.read_killmails.v1", "esi-planets.manage_planets.v1", "esi-characters.read_fatigue.v1", "esi-mail.read_mail.v1" ], "corporation": { "id": 98000001, "name": "My Corp" }, "enabled": true } ],
"alerts": { "enabled": true, "check_interval": "5m", "channels": ["telegram"], "rules": [ { "type": "war_declared", "severity": "critical" }, { "type": "structure_under_attack", "severity": "critical" }, { "type": "structure_fuel_low", "severity": "warning", "threshold": 24 }, { "type": "skill_complete", "severity": "info", "cooldown": "1h" }, { "type": "wallet_large_deposit", "severity": "info", "threshold": 1000000000 }, { "type": "industry_job_complete", "severity": "info", "cooldown": "30m" }, { "type": "pi_extractor_expired", "severity": "warning" }, { "type": "killmail", "severity": "info" }, { "type": "contract_expired", "severity": "warning", "cooldown": "2h" } ] },
"reports": { "enabled": true, "schedule": "0 9,21 * * *", "timezone": "Europe/Berlin", "channels": ["telegram"], "templates": [ { "name": "net_worth", "format": "short" }, { "name": "skill_queue", "format": "detailed" }, { "name": "wallet_summary", "format": "short" }, { "name": "assets_summary", "format": "short" } ] },
"market": { "enabled": true, "check_interval": "30m", "channels": ["telegram"], "items": [ { "type_id": 44992, "name": "PLEX", "region_id": 10000002, "region_name": "The Forge", "alert_above": 4500000, "alert_below": 3500000, "trend_alert": { "change_percent": 10, "time_window": "1h" }, "cooldown": "1h" }, { "type_id": 34, "name": "Tritanium", "region_id": 10000002, "region_name": "The Forge", "trend_alert": { "change_percent": 15, "time_window": "6h" } }, { "type_id": 16274, "name": "Skill Injector", "region_id": 10000002, "region_name": "The Forge", "alert_below": 800000000, "cooldown": "2h" } ] } }
File v1.0.5:config/schema.json
{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "EVE Dashboard Config", "description": "Modular config schema for the EVE Command Center. Each user configures which alerts, reports, and market trackers they need.", "type": "object", "properties": {
"schema_version": {
"type": "string",
"description": "Schema version for future migrations",
"default": "1.0",
"enum": ["1.0"]
},
"notification_channels": {
"type": "object",
"description": "Connection details for notification channels. Values can be literal or $ENV:VARIABLE_NAME references.",
"properties": {
"telegram": {
"type": "object",
"properties": {
"bot_token": {
"type": "string",
"description": "Telegram Bot Token (e.g. '123456:ABC-DEF...' or '$ENV:TELEGRAM_BOT_TOKEN')"
},
"chat_id": {
"type": "string",
"description": "Telegram Chat ID (e.g. '-100123456789' or '$ENV:TELEGRAM_CHAT_ID')"
}
},
"required": ["bot_token", "chat_id"]
},
"discord": {
"type": "object",
"properties": {
"webhook_url": {
"type": "string",
"description": "Discord Webhook URL (or '$ENV:DISCORD_WEBHOOK_URL')"
}
},
"required": ["webhook_url"]
}
},
"additionalProperties": false
},
"characters": {
"type": "array",
"description": "EVE characters to monitor, with auth tokens and granted scopes",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "EVE Character ID (from SSO /oauth/verify)"
},
"name": {
"type": "string",
"description": "Display name (optional, for readability)"
},
"token": {
"type": "string",
"description": "ESI Access Token (or '$ENV:EVE_TOKEN_MAIN'). Expires after ~20min."
},
"refresh_token": {
"type": "string",
"description": "ESI Refresh Token for automatic renewal (or '$ENV:EVE_REFRESH_MAIN')"
},
"client_id": {
"type": "string",
"description": "EVE Developer App Client ID (or '$ENV:EVE_CLIENT_ID')"
},
"scopes": {
"type": "array",
"description": "List of granted ESI scopes. Validated against required scopes during config check.",
"items": {
"type": "string"
},
"examples": [
["esi-wallet.read_character_wallet.v1", "esi-skills.read_skills.v1", "esi-skills.read_skillqueue.v1"]
]
},
"corporation": {
"type": "object",
"description": "Corporation association (optional, otherwise derived from ESI)",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" }
}
},
"enabled": {
"type": "boolean",
"description": "Whether to actively monitor this character",
"default": true
}
},
"required": ["id", "token", "refresh_token", "client_id", "scopes"]
},
"minItems": 1
},
"alerts": {
"type": "object",
"description": "Real-time alerts via ESI polling. Checks for changes at regular intervals.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"check_interval": {
"type": "string",
"description": "Polling interval (e.g. '5m', '15m', '1h')",
"default": "5m",
"pattern": "^[0-9]+(s|m|h)$"
},
"channels": {
"type": "array",
"description": "Which notification channels to use for alerts",
"items": {
"type": "string",
"enum": ["telegram", "discord"]
}
},
"rules": {
"type": "array",
"description": "Alert rules. Each rule defines a trigger type with optional thresholds.",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"war_declared",
"war_surrendered",
"structure_fuel_low",
"structure_under_attack",
"skill_complete",
"wallet_large_deposit",
"wallet_large_withdrawal",
"contract_expired",
"industry_job_complete",
"pi_extractor_expired",
"clone_jump_available",
"mail_received",
"killmail"
],
"description": "Alert type. Each type requires specific ESI scopes."
},
"severity": {
"type": "string",
"enum": ["info", "warning", "critical"],
"default": "info",
"description": "Severity level — affects notification formatting and priority"
},
"threshold": {
"type": "number",
"description": "Numeric threshold (e.g. ISK amount for wallet alerts, fuel hours for structure alerts)"
},
"cooldown": {
"type": "string",
"description": "Minimum time between repeated alerts of the same type",
"default": "1h",
"pattern": "^[0-9]+(s|m|h)$"
},
"character_filter": {
"type": "array",
"items": { "type": "integer" },
"description": "Only trigger for specific character IDs. Empty = all characters."
}
},
"required": ["type"]
}
}
},
"additionalProperties": false
},
"reports": {
"type": "object",
"description": "Scheduled reports — generated and sent on a cron schedule.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"schedule": {
"type": "string",
"description": "Cron expression (e.g. '0 9 * * *' = daily at 9am, '0 9,21 * * *' = 9am and 9pm)",
"default": "0 9 * * *"
},
"timezone": {
"type": "string",
"description": "IANA timezone for the cron schedule",
"default": "Europe/Berlin"
},
"channels": {
"type": "array",
"items": { "type": "string", "enum": ["telegram", "discord"] }
},
"templates": {
"type": "array",
"description": "Which reports to generate",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": [
"net_worth",
"skill_queue",
"industry_jobs",
"market_orders",
"wallet_summary",
"assets_summary"
],
"description": "Report template name"
},
"format": {
"type": "string",
"enum": ["short", "detailed"],
"default": "short",
"description": "'short' = compact summary, 'detailed' = full report"
},
"character_filter": {
"type": "array",
"items": { "type": "integer" },
"description": "Only include specific character IDs. Empty = all characters."
}
},
"required": ["name"]
}
}
},
"additionalProperties": false
},
"market": {
"type": "object",
"description": "Price tracking for items with threshold and trend alerts.",
"properties": {
"enabled": {
"type": "boolean",
"default": true
},
"check_interval": {
"type": "string",
"description": "Polling interval for market prices",
"default": "30m",
"pattern": "^[0-9]+(s|m|h)$"
},
"channels": {
"type": "array",
"items": { "type": "string", "enum": ["telegram", "discord"] },
"description": "Where to send market alerts. If empty, falls back to alerts.channels."
},
"items": {
"type": "array",
"description": "Items to track with price thresholds",
"items": {
"type": "object",
"properties": {
"type_id": {
"type": "integer",
"description": "EVE Type ID (e.g. 44992 = PLEX). Resolve via /universe/types/{id}/"
},
"name": {
"type": "string",
"description": "Display name of the item"
},
"region_id": {
"type": "integer",
"description": "Region ID for market data",
"default": 10000002
},
"region_name": {
"type": "string",
"description": "Region display name",
"default": "The Forge"
},
"alert_above": {
"type": "number",
"description": "Alert when price exceeds this value (ISK)"
},
"alert_below": {
"type": "number",
"description": "Alert when price drops below this value (ISK)"
},
"trend_alert": {
"type": "object",
"description": "Percentage price change within a time window",
"properties": {
"change_percent": {
"type": "number",
"description": "Percentage change that triggers an alert",
"default": 10
},
"time_window": {
"type": "string",
"description": "Time window for trend calculation",
"default": "1h",
"pattern": "^[0-9]+(m|h|d)$"
}
}
},
"cooldown": {
"type": "string",
"description": "Cooldown between market alerts for this item",
"default": "1h",
"pattern": "^[0-9]+(s|m|h)$"
}
},
"required": ["type_id", "name"]
}
}
},
"additionalProperties": false
}
}, "required": ["schema_version", "characters", "notification_channels"], "additionalProperties": false }
Machine endpoints, contract coverage, trust signals, runtime metrics, benchmarks, and guardrails for agent-to-agent use.
Machine interfaces
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/snapshot"
curl -s "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/contract"
curl -s "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/trust"
Operational fit
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Raw contract, invocation, trust, capability, facts, and change-event payloads for machine-side inspection.
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "CLAWHUB",
"generatedAt": "2026-04-17T06:20:28.946Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile"
}Facts JSON
[
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Clawhub",
"href": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceUrl": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "964 downloads",
"href": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceUrl": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-04-15T00:45:39.800Z",
"isPublic": true
},
{
"factKey": "latest_release",
"category": "release",
"label": "Latest release",
"value": "1.0.6",
"href": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceUrl": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-22T02:44:47.485Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/clawhub-burnshall-ui-eve-esi/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "release",
"title": "Release 1.0.6",
"description": "eve-esi 1.0.6 - Added .gitignore for better repository hygiene. - Introduced config/esi_endpoints.json for improved endpoint organization. - add pi workflow - skill provides threat intelligence for PI operations in low/null-sec systems",
"href": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceUrl": "https://clawhub.ai/burnshall-ui/eve-esi",
"sourceType": "release",
"confidence": "medium",
"observedAt": "2026-02-22T02:44:47.485Z",
"isPublic": true
}
]Sponsored
Ads related to Eve online Esi Skill and adjacent AI workflows.