Skip to content
Apex
Developers · Aether API

Call the model directly.

The Aether API exposes the one foundation model with streaming trajectories, capability-gated tool use, durable memory and built-in evaluation. Python, TypeScript, Go and Rust SDKs are first-class; a raw OpenAPI surface lets you wire the model into anything else.

Streaming

Time-step-by-time-step rollouts

Trajectories stream as they unfold. Interrupt, branch and steer the rollout without re-running from scratch. Server-Sent Events or gRPC streams.

Tool use

Solvers and instruments as first-class tools

Register your solvers, your CAD kernel and your bench instruments. The model decides when to call them — under your capability policy.

Memory

Durable across sessions

Episodic and semantic memory with provenance. Sessions resume cleanly across days. Memories are queryable, versioned and exportable.

Eval

Built-in evaluation runs

Submit a workload and a target metric — the API returns scored, traced runs that you can replay and bisect.

Pricing

Tokens for thought, compute for work

Reasoning is billed per million tokens (frontier-model-comparable). Simulation runs — CFD, FEA, MD, DFT, FEP, ADMET, RTL synthesis — are billed per compute-unit, the way AWS bills GPU-hours. The runtime itself is per-seat.

Surface

Stable v1 with semver

v1 is committed. Breaking changes go through a six-month deprecation window and a v2 alias.

A real example

Not a hello-world. A turbine blade.

Couple thermal and structural across a transient load step on a turbine blade. Stream the trajectory, watch the stress field, steer the rollout when a limit is approached. The same call in four languages.

from apex import Aether

aether = Aether(api_key=os.environ["APEX_API_KEY"])

# Couple thermal -> structural across a transient load step
trajectory = aether.simulate(
    domain="multiphysics",
    geometry=open("blade.step", "rb").read(),
    physics=["thermal", "structural"],
    boundary_conditions={
        "inlet":  {"T": 1450, "p": 2.2e6},
        "outlet": {"p": 1.0e5},
        "root":   {"fixed": True},
    },
    horizon_s=12.0,
    stream=True,
)

for step in trajectory:
    print(step.time, step.max_stress_MPa, step.tip_temperature_K)
    if step.max_stress_MPa > 850:
        trajectory.steer(redesign="root_fillet+1.5mm")
The surface

Every endpoint we ship. Every discipline.

The v1 surface is small on purpose. Specialisation lives in the agents you call, not in a sprawl of endpoints.

MethodPathPurpose
POST/v1/simulateRun a forward-in-time simulation, optionally streamed and steerable.
POST/v1/designGenerative design — molecules, geometries, layouts — under specified constraints.
POST/v1/dockProtein-ligand docking with optional induced-fit refinement.
POST/v1/fepAlchemical free-energy perturbation; relative and absolute binding free energies.
POST/v1/admetADMET endpoints. Returns per-endpoint score, calibration, and confidence.
POST/v1/rtl/synthesiseRTL synthesis with PPA targets. Hands off to placement on success.
POST/v1/lab/planBind reagents, schedule plates, allocate instruments — returns a runnable plan.
POST/v1/code/editPlan and execute a whole-repo edit. Returns a diff, tests, and a review.
POST/v1/agents/{id}:invokeCall a specialised agent directly. Each discipline ships with dozens.
GET/v1/sessions/{id}Resume a long-horizon session. Memory and tool history are restored.
POST/v1/eval/runRun a workload against a target metric. Returns scored, traced replay.
GET/v1/traces/{id}Pull the full audit trace for a run — every decision and tool call.
Errors

Failures, readable.

Every error is a documented code with a corrective hint in the body. We don't return generic 500s. We don't surface internal stack traces. The error you get is the error your retry logic can act on.

400validation_error

Your request didn't parse, or a constraint was invalid. The body contains a JSON-Pointer to the offending field and a corrective hint.

401missing_credentials

No API key or an invalid one. Rotate via /v1/keys; the runtime forces rotation after seven days of unused keys.

403policy_denied

Capability policy refused the action — dual-use refusal, controlled-pathogen lookup, export-control gate, or RBAC. Body explains which rule and why.

409concurrent_modification

Optimistic-concurrency clash. Refetch the resource, replay your edit, retry. Idempotency keys avoid this on writes.

429rate_limited

Concurrency or compute cap hit. Retry-After header is authoritative. Per-seat plans have no per-token throttle.

503model_overloaded

Transient capacity pressure. Retry with exponential backoff. Critical workloads can pin a dedicated capacity slice.

How the API is billed

Three meters, honest about compute.

Aether is a simulation-native model. One call can emit a few thousand reasoning tokens and then consume hours of solver compute on a CAD geometry. Hiding that cost inside a per-token meter would be misleading, so we don't. Three meters, shaped like the work — and like AWS, the customer's mental model already.

Meter 01 · per-token

Tokens for thought

Reasoning, planning, code edits, dialog, tool-use decisions, audit traces. Billed per million input and output tokens — the same meter frontier model providers use. Prompt caching and batch get the standard discounts.

  • Used by: /v1/code/edit, /v1/agents, /v1/sessions, /v1/eval
  • Variants: Aether 7B, 40B, 280B-MoE, Bio 12B
  • Discounts: cached input, batch API
Meter 02 · per compute-unit

Compute for simulation

Running a real workload — CFD, FEA, MD, DFT, FEP, ADMET, RTL synthesis, docking. The solvers are tool calls, and we pass through the GPU- and CPU-hours they actually consume, normalised to a single compute-unit.

  • Used by: /v1/simulate, /v1/dock, /v1/fep, /v1/admet, /v1/rtl/synthesise, /v1/design
  • Pricing: per CU · reserved capacity available
  • Discounts: committed-use, spot-class jobs
Meter 03 · per-seat

Seat for the runtime

The IDE adapters, the long-horizon agent runtime, the memory store, the capability-policy engine, the audit log. Each seat ships with a monthly token and compute allowance; overage rolls into Meters 01 and 02.

  • Used by: every IDE adapter, memory, agent runtime
  • Allowance: bundled tokens + CU per seat
  • Discounts: annual, education, sovereign
SDKs and surfaces

Reach the model from wherever you work.

First-class SDKs in four languages. A documented OpenAPI surface for the rest. A CLI for the work you'd rather scope in a terminal. MCP for agentic clients.

Python
3.10+, async + sync, typed
TypeScript
Node + Bun + Deno, ESM
Go
Modules, generics
Rust
Tokio, native async
OpenAPI
Generators for any language
CLI
`aether` — for scripting and CI
VS Code
Run, observe, replay
JetBrains
IntelliJ, PyCharm, GoLand
MCP
Model Context Protocol server
Webhooks
Lifecycle events to your endpoint
API billing

A key is a separate purchase from a plan.

A plan buys a person the right to work in the products. An API key buys a program the right to call them, unattended and at any volume. Bundling the second into the first would price the plan for the worst case — so the API is prepaid, and never draws on your plan's monthly allowance.

Same unit

API calls burn the same credit, at the same published rate, as a run you start in the console. One currency, one rate card.

Separate balance

API credits are prepaid and held apart from your plan. One runaway script cannot consume a team’s month before anyone opens a browser.

Prepaid bundleCreditsYou payEffective rate
10% off list5,000$45$0.0090 / credit
20% off list25,000$200$0.0080 / credit
30% off list100,000$700$0.0070 / credit
Pay as you goany—$0.01 / credit

Credits do not expire. Buying ahead should not become a deadline.

TierRequests / minConcurrent jobsHow you get it
Start602On any paid plan
Build60010After $100 of API spend
Scale3,00050After $2,500 of API spend
Custom——Arranged with your account team

Tiers are assigned automatically by spend. Nothing to buy, nothing to apply for.

Wire the model into your stack.

An API key is a separate purchase from a plan. Buy credits, call anything in the catalogue, pay the same published rate as an interactive run.