Programmatic access to Axion's forecasting platform.
All endpoints require an API key passed as a Bearer token in the Authorization header:
Authorization: Bearer axn_sk_...
API keys are managed on the API Keys page. Keys are shown once at creation and cannot be retrieved later.
https://axion-main-api-axion---productionus.us-east-1.gists.org
API usage is billed separately from the Axion monthly plan. Users pre-purchase credits before usage.
| Model | Input rate | Output rate | Cached rate |
|---|---|---|---|
| Opus 4.7 | 750 | 3,750 | 75 |
| Sonnet 4.6 | 450 | 2,250 | 45 |
Rates are per 1M tokens. A single thread may use multiple models (coordinator + agents), so costs accumulate across all calls. Negative balances are allowed to guarantee delivery of in-progress results.
/forecastsStart a new forecast thread, or send a follow-up message to an existing one. Requires a positive API credit balance.
| Field | Type | Required | Description |
|---|---|---|---|
| input | string | required | The question or analysis prompt. |
| id | string | optional | Existing thread ID for follow-up messages. |
| max_forecasts | integer | optional | Number of forecasts to generate (1-10). Default 1. |
| effort | string | optional | Analysis depth: low, medium, or high. Default medium. |
| webhook_url | string | optional | URL to receive a POST callback on completion or failure. |
{
"input": "Will NVIDIA's data center revenue exceed $40B in Q1 2026?",
"max_forecasts": 3,
"effort": "high"
}{
"id": "thread_abc123",
"input": "Will NVIDIA's data center revenue exceed $40B in Q1 2026?",
"preliminary_result": null,
"status": "starting"
}/forecasts/{thread_id}Poll the status and results of a forecast thread.
startingin_progresscompletedfailed{
"id": "thread_abc123",
"input": "Will NVIDIA's data center revenue exceed $40B in Q1 2026?",
"preliminary_result": "Based on initial analysis...",
"status": "completed",
"result": "Final synthesis text...",
"credits_consumed": 4231,
"agents_progress": [
{ "slug": "web-search", "progress": 1.0, "turn": 12, "action": "done" },
{ "slug": "sec-filings", "progress": 1.0, "turn": 8, "action": "done" }
],
"forecasts": [
{
"forecast_text": "NVIDIA data center revenue will exceed $40B in Q1 2026",
"probability": 0.72,
"confidence_lower": 0.55,
"confidence_upper": 0.85,
"resolution_date": "2026-07-15",
"reasoning": "Based on current growth trajectory...",
"concludes_at": "2026-07-15",
"is_concluded": false,
"outcome": null,
"outcome_reasoning": null,
"created_at": "2026-04-14T10:30:00Z"
}
],
"artifacts": [
{ "component_name": "RevenueChart", "props": "{\"data\": [...]}" }
]
}/forecastsList all forecast threads for your account.
{
"forecasts": [
{
"id": "thread_abc123",
"input": "Will NVIDIA's data center revenue...",
"status": "completed",
"credits_consumed": 4231,
"created_at": "2026-04-14T10:30:00Z"
}
]
}/forecasts/{thread_id}/stopCancel an in-progress forecast. Credits consumed up to cancellation are still charged.
{ "success": true }/forecasts/{thread_id}Delete a forecast thread.
{ "success": true }/account/balanceReturns your current credit balance.
{ "credits": 3750 }/account/credits/purchaseCreate a Stripe Checkout session for a one-time credit purchase. Minimum amount is $50.
{ "amount": 50 }{ "checkout_url": "https://checkout.stripe.com/c/pay/cs_..." }If webhook_url is provided when creating a forecast, Axion sends a POST request to that URL when the thread reaches a terminal state (completed or failed). The payload matches the GET /forecasts/{thread_id} response.
Delivery is best-effort with up to 3 retries. Poll as a fallback if you need guaranteed delivery.
All errors return a JSON body with an error field:
{ "error": "insufficient credits" }| Status | Meaning |
|---|---|
| 400 | Invalid request |
| 401 | Invalid or missing API key |
| 402 | Insufficient credits |
| 404 | Thread not found |
| 422 | Invalid request body |
| 429 | Too many concurrent threads (max 10) |
| 500 | Internal error |
import requests
import time
API_KEY = "axn_sk_..."
BASE = "https://axion-main-api-axion---productionus.us-east-1.gists.org"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Create
r = requests.post(f"{BASE}/forecasts", headers=headers, json={
"input": "Will the Fed cut rates in June 2026?",
"effort": "high"
})
thread_id = r.json()["id"]
# Poll
while True:
r = requests.get(f"{BASE}/forecasts/{thread_id}", headers=headers)
data = r.json()
print(f"Status: {data['status']}")
if data["status"] in ("completed", "failed"):
break
time.sleep(5)
# Result
for f in data["forecasts"]:
print(f"{f['forecast_text']}: {f['probability']}")Eternis Inc.