Console coming soon
Browse documentation

Developer docs

Start from a live reference page.

Phone layout stays search-first: pick a page here, then read it in a full single-column view.

Getting Started

Models

API Reference

Operations

Enterprise

Console

Policies

EvaEsi Reasoning

Multi-step synthesis with cited evidence. For questions that need to hold up under scrutiny.

Overview

Reasoning is the deeper pipeline. It gathers evidence first, then composes the final answer from the collected sources. Use it when the question needs chained inference, comparison across sources, or a defensible position rather than a quick reply.

Reasoning supports the same streaming and citation surface as Instant. Output sizes can be twice as large to accommodate longer arguments.

Endpoint

POST https://evaesi.dev/api/v1/responses

Pass "model": "reasoning" in the JSON body to route through this surface.

When To Use Reasoning vs Instant

Question shapePick
Casual chat, definitions, short factual lookupsinstant
News summary with citationsinstant with web_search: true
Multi-step analysis or argumentationreasoning
Synthesis across multiple sourcesreasoning
"Why" questions requiring chained inferencereasoning

Limits

FieldValue
Max input rungs100,000
Max output rungs64,000
Context window4,096 model bytes (billing rungs are separate: 4,096 input bytes meter as 5,734 rungs here)
StreamingYes
BatchNo. The route is mounted but returns 503 EVA_UNAVAILABLE
ToolsNo

Billing

Reasoning is billed at 1.4× the Instant rate on both input and output rungs. The multiplier is applied server-side before any usage row is written, so the rungs reported on usage and on the x-evaesi-*-rungs headers already include the multiplier.

Example: a 100-byte prompt that produces 500 bytes of output charges 140 input rungs and 700 output rungs. A maximal 100,000-byte prompt meters as 140,000 input rungs.

The request

Same JSON shape as Instant. The web_search flag is accepted but the evidence-gather stage runs whenever the underlying pipeline determines it is needed.

FieldTypeRequiredDescription
promptstringYesPrompt text. Max 100,000 bytes.
modelstringYesPass "reasoning" to route here.
max_output_rungsu64?NoOutput cap, validated against the model's 64,000 limit (400 INVALID_REQUEST above it). Falls back to 64,000.
streambool?NoServer-sent event streaming.

Response

{
  "request_id": "req_e201...",
  "content": "...",
  "sources": [
    {
      "url": "https://example.org/report",
      "domain": "example.org",
      "title": "Example report",
      "tier": "t1_authoritative",
      "retrieved_at": "2026-05-12T09:00:00Z",
      "snippet": "Quoted evidence...",
      "stance": "supports"
    }
  ],
  "sources_url": "/api/v1/sources/req_e201...",
  "evidence_verdict": "supported",
  "usage": {
    "input_rungs": 168,
    "output_rungs": 980,
    "total_rungs": 1148
  },
  "model": "reasoning"
}

Notice 168 input rungs on a 120-byte prompt, that is the 1.4× multiplier showing up on the reported usage.

Examples

cURL

curl -X POST https://evaesi.dev/api/v1/responses \
    -H "Authorization: Bearer esi_dev_YOUR_KEY" \
    -H "Content-Type: application/json" \
  -d '{
    "prompt": "Compare the 2024 and 2026 UK energy policy reforms.",
    "model": "reasoning",
    "max_output_rungs": 2048
  }'

Python

import requests

response = requests.post(
    "https://evaesi.dev/api/v1/responses",
    headers={"Authorization": "Bearer esi_dev_YOUR_KEY"},
    json={
        "prompt": "Compare the 2024 and 2026 UK energy policy reforms.",
        "model": "reasoning",
        "max_output_rungs": 2048,
    },
)

data = response.json()
print(data["content"])
print(f"sources cited: {len(data['sources'])}")
print(f"verdict: {data.get('evidence_verdict')}")

JavaScript

const response = await fetch("https://evaesi.dev/api/v1/responses", {
  method: "POST",
  headers: {
    "Authorization": "Bearer esi_dev_YOUR_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    prompt: "Compare the 2024 and 2026 UK energy policy reforms.",
    model: "reasoning",
    max_output_rungs: 2048,
  }),
});

const data = await response.json();
console.log(data.content);
console.log(`sources: ${data.sources.length}, verdict: ${data.evidence_verdict}`);