API reference v1 · stable · OpenAPI 3.1 spec available API OPERATIONAL · p50 12ms
Build API · v1

Every regime, every signal, every briefing — programmatic.

Authenticated JSON over HTTPS, with webhooks, server-sent events, and first-class SDKs for Python, TypeScript, Go, and Rust. The API surfaces every primitive the product is built on — if it's visible in Intelligence or Signal, it's available via Build.

Base URLhttps://api.arcane.io/v1 AuthBearer token FormatJSON VersioningURL path SpecOpenAPI 3.1
Authentication

Two tokens, two environments.

Every request carries a bearer token in the Authorization header. Tokens are issued from the Build section of Your Arcane — one for production, one for sandbox. Sandbox responses are deterministic and free. Production counts against your plan quota.

Keys are prefixed by environment: production keys start ark_live_; sandbox keys start ark_test_. Keys are shown only once at issue time; rotate freely.

# A bearer token on every request curl https://api.arcane.io/v1/regime/SPY \ -H "Authorization: Bearer ark_live_k7a2...e9"

Security notes: never embed keys in client-side code; use ark_test_ for local development; revoke any key that may have been exposed from Your Arcane · Build.

Quickstart

Hello, SPY.

The three most common patterns, in four languages. Pick the one closest to your stack and adapt.

# Get current regime reading for SPY curl https://api.arcane.io/v1/regime/SPY \ -H "Authorization: Bearer $ARCANE_KEY" # Subscribe to all High Risk transitions via webhook curl -X POST https://api.arcane.io/v1/signals/subscribe \ -H "Authorization: Bearer $ARCANE_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"https://you.example/hook","events":["signal.high_risk"]}'
SDKs

First-class clients.

Typed, maintained, versioned, and published under Arcane. SDKs track API v1 exactly; major versions follow semver.

Python
v1.6.2 · 3.9+
pip install arcane-sdk
TypeScript
v1.6.0 · Node 18+
npm install @arcane/sdk
Go
v1.5.1 · Go 1.21+
go get github.com/arcane/go-sdk
Rust
v1.5.0 · 2021 ed.
cargo add arcane-sdk

Community-maintained clients (Ruby, Elixir, Java) are listed at arcane.io/sdks but are not covered by Arcane's support SLA.

Rate limits

We never fail your requests.

Quota is enforced through overage billing, not request denial. You can set a hard cap in Build settings if you want the service to return 429 at the limit instead.

PlanMonthly callsBurst / secSustained / min
Pro250,000101,000
Desk1,000,000505,000
InstitutionalContractContractContract

Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. Overage calls include X-RateLimit-Overage: 42 indicating how many calls into overage this request was.

Errors

Structured, actionable.

Errors return a 4xx or 5xx status with a JSON body containing code, message, and often a doc_url pointing at the exact section of this reference that explains the fix.

{ "error": { "code": "symbol_not_covered", "message": "Symbol 'XYZW' is not in the Arcane universe.", "doc_url": "https://docs.arcane.io/errors#symbol_not_covered", "request_id": "req_7h2Y9mN3q8" } }
StatusCodeMeaning
400invalid_requestMalformed parameters or body
401unauthorizedMissing or invalid API key
403forbiddenKey does not have access to this resource
404not_foundResource does not exist
404symbol_not_coveredSymbol is not in the Arcane universe
429rate_limitedHard cap reached
503temporarily_unavailableTry again after the delay in Retry-After
Pagination

Cursor-based, stable.

List endpoints paginate with cursors. Pass limit (max 100) and after (cursor from previous page). Response includes has_more and next_cursor.

Regimes

Get current regime.

GET/regime/{symbol}live · ~12ms p50
Returns the current regime reading for the given symbol. Freshness is live; for historical snapshots use /regime/{symbol}/history.
ParamTypeInDescription
symbolstringpath · reqArcane ticker · e.g. SPY, BTC, EURUSD
as_ofISO 8601query · optSnapshot at a specific time; defaults to now
curl https://api.arcane.io/v1/regime/SPY \ -H "Authorization: Bearer $ARCANE_KEY"
{ "symbol": "SPY", "regime": "institutional", "confidence": 0.87, "state": "normal", "breadth": 0.75, "flip_risk": "low", "stability_days": 3, "updated_at": "2026-04-22T18:38:00Z", "model": "vidi-8.4.2" }
GET/regime/{symbol}/historyrange query
Returns the regime history for the given symbol over a time window. Granularity is daily by default; use granularity=hour for intraday.
ParamTypeInDescription
fromISO 8601query · reqStart of range
toISO 8601query · optEnd of range; defaults to now
granularityenumquery · optday (default) · hour · minute (Institutional only)
GET/regimepaginated
List regime readings across your watchlist or the full universe. Supports filtering by state, regime, and class.
Signals

Transition events.

GET/signalspaginated · event log
Returns signal events (state transitions, confidence breaks, regime flips) across your watchlist. Default window is last 24 hours.
POST/signals/subscribewebhook registration
Register a webhook endpoint to receive signal events as they happen. Max 10 active subscriptions per account.
WS/signals/streamWebSocket · SSE fallback
Bidirectional stream of signal events. Supports filtering messages server-side by symbols, severity, and regime. Falls back to Server-Sent Events for clients behind restrictive proxies.
Briefings

The editorial archive.

GET/briefingspaginated
Returns briefings filtered by type (pre-market · midday · after-hours · weekly · transition · deep), author, or date range.
GET/briefings/{id}single briefing
Returns the full briefing — text in Markdown and HTML, metadata, cited signals, and chart specifications. Plan-gated by briefing type.
Webhooks

Push over pull.

Webhooks deliver events to your endpoint as they happen. Register via POST /signals/subscribe or from the Build section of Your Arcane.

Signing & verification

Every webhook carries an X-Arcane-Signature header. Verify by HMAC-SHA256 of the raw body with your signing secret.

import hmac, hashlib def verify(body: bytes, signature: str, secret: str) -> bool: expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, signature)

Event types

EventDescription
signal.normalAsset transitioned into Normal state
signal.elevatedAsset transitioned into Elevated state
signal.high_riskAsset transitioned into High Risk state
regime.flipPrimary regime classification changed
briefing.publishedNew briefing published; includes id and type
model.versionRegime model version updated (rare)

Retry policy

Arcane expects a 2xx response within 10 seconds. Non-2xx responses are retried with exponential backoff (5s, 30s, 2m, 10m, 1h) for up to 24 hours. After 24 hours of continuous failure, the subscription is auto-paused and an email is sent to the account owner.

Idempotency: every event carries a unique event_id. Your endpoint should be safe to receive the same event more than once.