# Axion

> Forecast the probability of a future event with the Axion API. Use when asked the odds, likelihood, or a prediction for an uncertain or future event.

- Skill: `eternisai/axion` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add eternisai/axion`
- Raw SKILL.md: https://api.skillmd.com/api/skills/eternisai/axion/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- License: MIT
- Author: EternisAI (https://skillmd.com/u/eternisai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/eternisai/axion

---


# Axion forecasting

Axion answers a question by running an orchestrator and a team of research agents (web search, market data, SEC filings, Fermi estimates) that cite their evidence and return graded probabilistic forecasts.

## When to use

Use Axion when the user wants the odds of a future event, a deal or scenario evaluated, or a research-backed estimate: "how likely is X", "forecast whether Y", "what are the odds of Z", elections, markets, deals, geopolitics, product launches.

## Setup

1. Create an account at https://axion.eternis.ai and create an API key on the API Keys page. Any account can create keys.
2. Add credits. API usage is prepaid and billed separately from the monthly plan; new accounts start at zero.
3. Provide the key as the `AXION_API_KEY` environment variable.

Before calling, confirm the key is present. If `AXION_API_KEY` is empty, stop and ask the user to set it. Do not proceed.

## Procedure

Forecasts run asynchronously: start one, then poll until it reaches a terminal status. Base URL `https://api.axion.eternis.ai`; the key is a Bearer token on every request.

1. Start a forecast:

```bash
curl -s https://api.axion.eternis.ai/forecasts \
  -H "Authorization: Bearer $AXION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": "Will the Fed cut rates in June 2026?", "effort": "high"}'
```

Returns `{"id": "<token>", "status": "starting"}` — `id` is an opaque token (e.g. `L2d5qNdtxXjyjXGKTmKVMX`), no fixed prefix. Use it to poll. Set `effort` `low`/`medium`/`high` and `max_forecasts` 1–10 to widen the run.

2. Poll until `status` is `completed` or `failed`, backing off a few seconds between calls:

```bash
curl -s https://api.axion.eternis.ai/forecasts/<id> \
  -H "Authorization: Bearer $AXION_API_KEY"
```

3. Read `forecasts[]`. Each carries `forecast_text`, `probability` (0–1), `confidence_lower`/`confidence_upper`, `resolution_date`, and `reasoning`. Present the probability and the reasoning behind it.

Full request and response fields, webhooks, and credit rates: see [references/axion-api.md](references/axion-api.md), mirrored from https://axion.eternis.ai/docs.md.

## Pitfalls

- A positive credit balance is required to start a forecast. A 402 with an insufficient-credits message means add credits at https://axion.eternis.ai.
- A run takes roughly 15 seconds to 3 minutes. Poll with backoff; do not block.
- Maximum 10 concurrent in-progress threads per account (429 with `"code": "CONCURRENCY_LIMIT"` otherwise). A 429 `CAPACITY_QUEUE_FULL` is a busy deployment rather than anything you did — wait out its `Retry-After` and send again.
- A 503 `MAINTENANCE_MODE` means Axion is read-only for planned maintenance. Reads and already-running forecasts are unaffected; retry the write after `Retry-After`.
- A 409 `THREAD_CANCELED` means the thread was stopped while your request was in flight — your own `stop` racing your own send, since you supply the thread `id`. Retrying against that thread keeps failing; start a new one.
- The key is read from the environment. Never print or hard-code it. In sandboxed runs, make sure `AXION_API_KEY` is provided to the sandbox, not only to the host.
- Successful responses are valid JSON, but a transient `5xx` (an upstream reset at the ingress) can return a short plain-text body instead of the usual `{"error": ...}` envelope. Check the HTTP status before parsing rather than parsing the body as JSON. Resending the same request unchanged is the right answer for a `5xx` only — the refusals above are deliberate, and each has its own, so retrying one of those on a timer just collects the same refusal.

## Verification

A successful run ends with `status` `completed` and a non-empty `forecasts[]` array carrying probabilities between 0 and 1.

