Claim this agent
Agent DossierCLAWHUBSafety 84/100

Xpersona Agent

Eve online Esi Skill

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,...

OpenClaw · self-declared
964 downloadsTrust evidence available
clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esi

Overall 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

Overview

Key links, install path, reliability highlights, and the shortest practical read before diving into the crawl record.

Self-declaredCLAWHUB

Overview

Executive 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,... Capability contract not published. No trust telemetry is available yet. 964 downloads reported by the source. Last updated 4/15/2026.

No verified compatibility signals964 downloads

Trust score

Unknown

Compatibility

OpenClaw

Freshness

Mar 1, 2026

Vendor

Clawhub

Artifacts

0

Benchmarks

0

Last release

1.0.6

Install & run

Setup Snapshot

clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esi
  1. 1

    Install using `clawhub skill install kn70krghga32ef4e3s75ew2vf980rh5b:eve-esi` in an isolated environment before connecting it to live workloads.

  2. 2

    No published capability contract is available yet, so validate auth and request/response behavior manually.

  3. 3

    Review the upstream CLAWHUB listing at https://clawhub.ai/burnshall-ui/eve-esi before using production credentials.

Evidence & Timeline

Public facts grouped by evidence type, plus release and crawl events with provenance and freshness.

Self-declaredCLAWHUB

Public facts

Evidence Ledger

Vendor (1)

Vendor

Clawhub

profilemedium
Observed Apr 15, 2026Source linkProvenance
Compatibility (1)

Protocol compatibility

OpenClaw

contractmedium
Observed Apr 15, 2026Source linkProvenance
Release (1)

Latest release

1.0.6

releasemedium
Observed Feb 22, 2026Source linkProvenance
Adoption (1)

Adoption signal

964 downloads

profilemedium
Observed Apr 15, 2026Source linkProvenance
Security (1)

Handshake status

UNKNOWN

trustmedium
Observed unknownSource linkProvenance

Artifacts & Docs

Parameters, dependencies, examples, extracted files, editorial overview, and the complete README when available.

Self-declaredCLAWHUB

Captured outputs

Artifacts Archive

Extracted files

5

Examples

2

Snippets

0

Languages

Unknown

Executable Examples

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
Extracted Files

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`, `esi

references/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 & README

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

Full README

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 organization.
  • add pi workflow
  • skill provides threat intelligence for PI operations in low/null-sec systems

v1.0.5 | 2026-02-19T00:41:50.973Z | user

eve-esi 1.0.5 changelog

  • Updated documentation to use a generic placeholder for SSH tunnel instructions, changing the example user and host to "user@your-server" instead of a specific example.
  • No changes to code or environment variables; only documentation was revised for clarity and privacy.

v1.0.4 | 2026-02-19T00:37:07.251Z | user

eve-esi 1.0.4 changelog

  • Environment variables for EVE credentials (EVE_CLIENT_ID, EVE_TOKEN_MAIN, EVE_REFRESH_MAIN) are now fully optional—normal operation uses ~/.openclaw/eve-tokens.json directly.
  • Updated SKILL.md documentation to clarify that scripts auto-manage tokens, and only require env vars if using $ENV: references in dashboard configs.
  • Revised authentication instructions: Client ID should be passed directly to auth_flow.py; environment variables are only necessary for specific config styles.
  • Adjusted required flags on EVE credentials env vars from true to false, reflecting their optional usage in most setups.
  • No code changes to the skill itself; documentation and environment requirements only.

v1.0.3 | 2026-02-19T00:28:14.217Z | user

eve-esi 1.0.3

  • Added scripts for OAuth2 authentication flow (auth_flow.py) and programmatic access token retrieval (get_token.py)
  • Added README.md with setup instructions and authentication usage
  • Updated docs to clarify script locations, token storage, and usage examples
  • First-time setup and token refresh workflow now documented for easier onboarding

v1.0.2 | 2026-02-11T10:01:37.302Z | user

  • Added Data Handling section documenting exclusive communication with official EVE Online ESI and SSO, and clarifying alert/report integration privacy.
  • Declared EVE_REFRESH_MAIN as the primary credential for the skill.

v1.0.1 | 2026-02-11T09:41:09.364Z | user

  • Added explicit environment variable definitions for EVE SSO and notification integrations (Telegram, Discord) in SKILL.md.
  • Removed the sample README.md file.
  • No functional code or API changes in this version; documentation and configuration only.

v1.0.0 | 2026-02-08T23:59:35.203Z | user

eve-esi 1.0.0 – initial release

  • Provides EVE Online character management via the ESI (EVE Swagger Interface) REST API.
  • Supports queries for wallet, assets, skills, location, clones, implants, and more.
  • Includes public and authenticated endpoint documentation with example curl and Python script usage.
  • Features modular dashboard configuration for alerts, scheduled reports, and market tracking.
  • Documents best practices for authentication, pagination, caching, and API error handling.

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:

  • 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.

Skill Location

All scripts live at: ~/.openclaw/workspace/skills/eve-esi/scripts/

Always use full paths when calling scripts:

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):

# 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.

Public endpoints (no auth)

# 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]'

Character info (authenticated)

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/"

Wallet

# 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/"

Assets

# 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/"

Skills

# 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/"

Location and ship

# 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/"

Clones and implants

# 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/"

More endpoints

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.

Dashboard Config

The skill supports a modular dashboard config for alerts, reports, and market tracking. Each user defines what they need in a JSON config file.

Features

| 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 |

Security

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).

Validate a config

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

Using the query script

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

Best practices

  • Caching: respect the Expires header; do not poll before it expires.
  • Error limits: monitor X-ESI-Error-Limit-Remain; back off when low.
  • User-Agent: always set a descriptive User-Agent with contact info.
  • Rate limits: some endpoints (mail, contracts) have internal rate limits returning HTTP 520.
  • Pagination: check the X-Pages response header; iterate with ?page=N.
  • Versioning: use /latest/ for current stable routes. /dev/ may change without notice.

Threat Assessment & Route Planning

The skill provides threat intelligence for PI systems in low/null-sec space. Data sources: ESI (kills, jumps, FW, incursions) and zKillboard (PVP activity).

ESI Threat Endpoints

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

Threat Assessment Scripts (Workspace)

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

Threat Levels

| 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 Cache

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

Resolving type IDs

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

EVE ESI Skill for OpenClaw

An OpenClaw skill for interacting with the EVE Online ESI API (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

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.

Authentication Setup

Prerequisites

  1. Register an app at developers.eveonline.com
  2. Set callback URL to http://127.0.0.1:8080/callback
  3. Select the scopes you need (PI requires esi-planets.manage_planets.v1)
  4. Note your Client ID

One-time auth per character

# 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).

Multiple characters

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

Quick Start

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

Planetary Interaction (PI)

The skill includes high-level PI actions that parse raw ESI data into actionable status reports.

PI Actions

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

PI Status Output

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 |

What PI can and cannot do

ESI provides read-only access to PI. The skill can:

  • Monitor extractor timers and warn before expiry
  • Track launchpad/storage fill levels
  • Show factory routing and production chains
  • Compare market prices for PI products

It cannot restart extractors, reroute products, or modify planet setups — that must be done in-game.

Market Prices

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

The jita_price action returns lowest sell, highest buy, spread, and order counts for The Forge region.

Action mode parameters

  • --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_price

37636f5 (docs: update README for PI action workflow)

Dashboard Config

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 Types

| 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 Templates

| 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 |

Threat Assessment & Route Planning

The skill provides threat intelligence for PI operations in low/null-sec systems.

Data Sources

| 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 |

Threat Levels

| 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 |

ESI Actions

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

Threat Assessment (Workspace Scripts)

The threat scoring logic and caching live in the agent workspace (~/.openclaw/workspace/scripts/), not in this repo. See SKILL.md for usage details.

Security

  • Tokens stored in ~/.openclaw/eve-tokens.json with chmod 600
  • Refresh tokens rotate on every use (EVE SSO best practice)
  • PKCE flow — no client secret needed
  • Dashboard config supports $ENV:VARIABLE_NAME to keep secrets out of files
  • .gitignore prevents accidental token commits
  • Never commit eve-tokens.json or configs with real tokens

Scopes

The 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.

Requirements

  • Python 3.8+ (stdlib only for core ESI queries)
  • OpenClaw gateway (for agent integration)
  • Redis (optional, for PI market price caching)
  • Python redis package (optional, only needed for price cache)

Redis Setup (optional)

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}.

Links

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 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

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:

{
  "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:

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

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:

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:

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, 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

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

| 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/{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 |

Location

| 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 |

Contacts

| 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 |

Contracts

| 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 |

Calendar

| 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 |

Fittings

| 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 |

Industry

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/industry/jobs/ | esi-industry.read_character_jobs.v1 | Industry jobs (manufacturing, research, etc.) |

Killmails

| 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) |

Mail

| 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 |

Market Orders

| 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) |

Mining

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/mining/ | esi-industry.read_character_mining.v1 | Mining ledger (last 30 days) |

Notifications

| 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 |

Loyalty Points

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/loyalty/points/ | esi-characters.read_loyalty.v1 | LP balances per corp |

Planets (PI)

| 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 |

Blueprints

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/blueprints/ | esi-characters.read_blueprints.v1 | All blueprints (paginated) |

Roles and Titles

| 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 |

Standings

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/standings/ | esi-characters.read_standings.v1 | NPC standings |

Bookmarks

| 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 |

Medals

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/medals/ | esi-characters.read_medals.v1 | Awarded medals |

Agent Research

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/agents_research/ | esi-characters.read_agents_research.v1 | Research agents and points |

Fatigue

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fatigue/ | esi-characters.read_fatigue.v1 | Jump fatigue expiry timestamps |

Faction Warfare

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fw/stats/ | esi-characters.read_fw_stats.v1 | FW kill/VP stats |

Corporation History

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/corporationhistory/ | -- | Public employment history |

Portrait

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/portrait/ | -- | Portrait URLs (64/128/256/512px) |

Search

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/search/ | esi-search.search_structures.v1 | Authenticated search (includes structures) |

Fleet

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fleet/ | esi-fleets.read_fleet.v1 | Current fleet info |


Pagination

Paginated endpoints return X-Pages header. Append ?page=N (1-based). Always check X-Pages to determine total pages.

Caching

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).

Error Handling

  • 403: Missing scope or wrong character
  • 404: Resource not found
  • 420: Error rate limited (back off and retry)
  • 502/503/504: Upstream server issue (retry with backoff)
  • Check X-ESI-Error-Limit-Remain and X-ESI-Error-Limit-Reset headers

File 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:

  • 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.

Skill Location

All scripts live at: ~/.openclaw/workspace/skills/eve-esi/scripts/

Always use full paths when calling scripts:

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):

# 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.

Public endpoints (no auth)

# 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]'

Character info (authenticated)

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/"

Wallet

# 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/"

Assets

# 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/"

Skills

# 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/"

Location and ship

# 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/"

Clones and implants

# 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/"

More endpoints

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.

Dashboard Config

The skill supports a modular dashboard config for alerts, reports, and market tracking. Each user defines what they need in a JSON config file.

Features

| 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 |

Security

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).

Validate a config

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

Using the query script

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

Best practices

  • Caching: respect the Expires header; do not poll before it expires.
  • Error limits: monitor X-ESI-Error-Limit-Remain; back off when low.
  • User-Agent: always set a descriptive User-Agent with contact info.
  • Rate limits: some endpoints (mail, contracts) have internal rate limits returning HTTP 520.
  • Pagination: check the X-Pages response header; iterate with ?page=N.
  • Versioning: use /latest/ for current stable routes. /dev/ may change without notice.

Resolving type IDs

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

EVE ESI Skill for OpenClaw

An OpenClaw skill for interacting with the EVE Online ESI API (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

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

Installation

cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi

Authentication Setup

Prerequisites:

  1. Register an app at developers.eveonline.com
  2. Set callback URL to http://127.0.0.1:8080/callback
  3. Note your Client ID

One-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

Quick Start

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

Dashboard Config

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 Types

| 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 Templates

| 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 |

Security

  • Tokens stored in ~/.openclaw/eve-tokens.json with chmod 600
  • Refresh tokens rotate on every use (EVE SSO best practice)
  • Dashboard config supports $ENV:VARIABLE_NAME to keep secrets out of files
  • Never commit eve-tokens.json or configs with real tokens

Requirements

  • Python 3.8+ (stdlib only — no pip dependencies)
  • OpenClaw gateway

Links

File v1.0.5:_meta.json

{ "ownerId": "kn70krghga32ef4e3s75ew2vf980rh5b", "slug": "eve-esi", "version": "1.0.5", "publishedAt": 1771461710973 }

File v1.0.5: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

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:

{
  "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:

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

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:

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:

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, 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

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

| 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/{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 |

Location

| 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 |

Contacts

| 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 |

Contracts

| 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 |

Calendar

| 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 |

Fittings

| 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 |

Industry

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/industry/jobs/ | esi-industry.read_character_jobs.v1 | Industry jobs (manufacturing, research, etc.) |

Killmails

| 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) |

Mail

| 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 |

Market Orders

| 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) |

Mining

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/mining/ | esi-industry.read_character_mining.v1 | Mining ledger (last 30 days) |

Notifications

| 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 |

Loyalty Points

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/loyalty/points/ | esi-characters.read_loyalty.v1 | LP balances per corp |

Planets (PI)

| 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 |

Blueprints

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/blueprints/ | esi-characters.read_blueprints.v1 | All blueprints (paginated) |

Roles and Titles

| 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 |

Standings

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/standings/ | esi-characters.read_standings.v1 | NPC standings |

Bookmarks

| 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 |

Medals

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/medals/ | esi-characters.read_medals.v1 | Awarded medals |

Agent Research

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/agents_research/ | esi-characters.read_agents_research.v1 | Research agents and points |

Fatigue

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fatigue/ | esi-characters.read_fatigue.v1 | Jump fatigue expiry timestamps |

Faction Warfare

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fw/stats/ | esi-characters.read_fw_stats.v1 | FW kill/VP stats |

Corporation History

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/corporationhistory/ | -- | Public employment history |

Portrait

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/portrait/ | -- | Portrait URLs (64/128/256/512px) |

Search

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/search/ | esi-search.search_structures.v1 | Authenticated search (includes structures) |

Fleet

| Method | Path | Scope | Description | |--------|------|-------|-------------| | GET | /characters/{character_id}/fleet/ | esi-fleets.read_fleet.v1 | Current fleet info |


Pagination

Paginated endpoints return X-Pages header. Append ?page=N (1-based). Always check X-Pages to determine total pages.

Caching

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).

Error Handling

  • 403: Missing scope or wrong character
  • 404: Resource not found
  • 420: Error rate limited (back off and retry)
  • 502/503/504: Upstream server issue (retry with backoff)
  • Check X-ESI-Error-Limit-Remain and X-ESI-Error-Limit-Reset headers

File 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 }

API & Reliability

Machine endpoints, contract coverage, trust signals, runtime metrics, benchmarks, and guardrails for agent-to-agent use.

MissingCLAWHUB

Machine interfaces

Contract & API

Contract coverage

Status

missing

Auth

None

Streaming

No

Data region

Unspecified

Protocol support

OpenClaw: self-declared

Requires: none

Forbidden: none

Guardrails

Operational confidence: low

No positive guardrails captured.
Invocation examples
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

Reliability & Benchmarks

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

Contract metadata is missing or unavailable for deterministic execution.
No benchmark suites or observed failure patterns are available.

Machine Appendix

Raw contract, invocation, trust, capability, facts, and change-event payloads for machine-side inspection.

MissingCLAWHUB

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.