§ API · Programmatic Access · Restricted
Upcoming

Event Intelligence API

This is a preliminary technical specification — the API is not yet publicly available. Every endpoint, schema, limit, and date on this page is planned and indicative, and may change before release. To discuss programmatic access for your desk, contact directly.

A machine-readable interface to the Event Intelligence Desk. The pipeline that produces desk memos — catalyst extraction, source reconciliation, materiality assessment, narrative-dislocation measurement, signal classification, and invalidation framing — is exposed over REST, gRPC, a multiplexed streaming channel, and a signed webhook bus, under a hardened cryptographic protocol.

Engineered for systematic desks integrating event intelligence directly into research, execution, and risk systems. Every request is authenticated, signed, replay-bounded, and audited. Access is provisioned per tenant and is not anonymous. No market data is redistributed; outputs are interpretive research artifacts.

Base URL
https://api.aster-ridge.com/v2
Transport
REST · gRPC · WebSocket · SSE
Stream
wss://stream.aster-ridge.com/v2
TLS
1.3 only · X25519MLKEM768 (hybrid PQ)
Request auth
mTLS + HTTP Message Signatures (RFC 9421)
Token model
OAuth2 CC · mTLS-bound (RFC 8705) · DPoP
Schemas
OpenAPI 3.1.0 · AsyncAPI 2.6.0 · Protobuf
§01

Transport & cryptographic profile

Hardened by default. TLS 1.3 only, hybrid post-quantum key agreement, and an explicit, auditable cipher posture.

All traffic terminates over TLS 1.3 with downgrade protection and HSTS preload. Key agreement defaults to the hybrid post-quantum group X25519MLKEM768, combining ML-KEM-768 with X25519 so that recorded sessions remain confidential against a future quantum adversary. Dedicated tenants may additionally pin mutual TLS at the edge with SPIFFE-issued client certificates.

Cryptographic profile
TransportTLS 1.3 (RFC 8446), downgrade-pinned. Suites: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256.
Key agreementHybrid post-quantum X25519MLKEM768 (ML-KEM-768 + X25519); classical fallback secp384r1. HSTS + OCSP must-staple.
Channel bindingOptional mTLS (RFC 8705) with SPIFFE SVID client certs; certificate pinning by SPKI SHA-256.
Request authnHTTP Message Signatures (RFC 9421), Ed25519 detached over a canonical signing base; Content-Digest (RFC 9530).
TokensOAuth2 client-credentials (RFC 6749) + mTLS / DPoP (RFC 9449) sender-constraint; access tokens PASETO v4.public (Ed25519) or JWT/EdDSA.
Payload (optional)JWE (RFC 7516) ECDH-ES+A256KW / A256GCM for field-level encryption of restricted attributes.
Webhook authnHMAC-SHA256 + detached Ed25519 (JWKS-published); timestamped, single-use delivery ids.
Anti-replayServer-issued single-use nonces, 120 s acceptance window, monotonic created param, strict clock-skew bound.
§02

Identity & access tokens

Sender-constrained credentials only. Bearer tokens are never accepted unbound.

Tenants authenticate via OAuth2 client-credentials. Access tokens are sender-constrained — bound either to the mTLS client certificate (RFC 8705) or to a DPoP proof key (RFC 9449) — so a captured token cannot be replayed from another channel. Tokens are short-lived (≤ 600 s), audience-restricted, and issued as PASETO v4.public (Ed25519) or JWT/EdDSA.

Token — mTLS-bound client credentials
POST /v2/oauth/token            # presented over the mTLS channel
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&scope=memos:read signals:read stream:subscribe
&audience=https://api.aster-ridge.com/v2

→ 200 OK
{ "access_token": "v4.public.eyJ…",         # PASETO v4, Ed25519
  "token_type": "DPoP", "expires_in": 600,
  "cnf": { "x5t#S256": "9f2c…" } }           # confirmed cert thumbprint
§03

Request authentication — message signatures

Every request carries a detached Ed25519 signature over a canonical base. This is the spine of the protocol.

Aster Ridge implements HTTP Message Signatures (RFC 9421). The client signs a canonical base composed of the request method, path, authority, the Content-Digest (RFC 9530), the key id, and a server-issued single-use nonce, with the created timestamp inside the signature parameters. Requests outside a 120-second window, or reusing a nonce, are rejected with 401 invalid_signature.

Signed request (RFC 9421 + RFC 9530)
POST /v2/memos HTTP/2
Host: api.aster-ridge.com
AR-Version: 2025-09-30
AR-Key-Id: ak_live_7f3c9b21
AR-Nonce: 0r5Qd1mN8t2hVb9w         # single-use, server-issued
Content-Digest: sha-256=:RBNvo1WzZ4oRRq0W9+hknpT7T8If536DEMBg9hyq/4o=:
Idempotency-Key: 1f0b8d2e-7a44-4c0e-9b6e-2c8a4f0d1e22
Signature-Input: sig1=("@method" "@path" "@authority" \
  "content-digest" "ar-key-id" "ar-nonce");\
  created=1790000000;keyid="ak_live_7f3c9b21";alg="ed25519"
Signature: sig1=:k8s9…Ed25519…detached…signature==:
Content-Type: application/json

{"ticker":"AAPL"}
Canonical signing base (what the signature covers)
"@method": POST
"@path": /v2/memos
"@authority": api.aster-ridge.com
"content-digest": sha-256=:RBNvo1WzZ4oRRq0W9+hknpT7T8If536DEMBg9hyq/4o=:
"ar-key-id": ak_live_7f3c9b21
"ar-nonce": 0r5Qd1mN8t2hVb9w
"@signature-params": ("@method" "@path" "@authority" "content-digest" \
  "ar-key-id" "ar-nonce");created=1790000000;keyid="ak_live_7f3c9b21";alg="ed25519"

Nonces are obtained from POST /v2/auth/nonce (cheap, unsigned) or piggybacked on the prior response's AR-Nonce-Next header. Responses are themselves signed; verify them against the tenant JWKS for end-to-end integrity.

§04

Authorization, scopes & entitlements

Two-layer authorization: OAuth scopes gate verbs; coverage entitlements gate rows.

A token's scopes constrain which routes it may call. Independently, a per-tenant coverage entitlement constrains which securities are visible — an attribute-based filter applied at the data layer. A call with the right scope but outside entitlement returns 403 entitlement_denied, never a silent empty set.

Scopes
memos:readRead generated desk memos and reconciled source sets.
memos:writeSubmit memo-generation jobs across the entitled universe.
signals:readRead current and point-in-time signal classifications.
events:readRead catalysts, materiality, and narrative-dislocation scores.
reconcile:writeSubmit source sets for cross-source reconciliation.
exports:writeInitiate bulk exports to object storage.
stream:subscribeOpen streaming subscriptions over WebSocket/gRPC/SSE.
webhooks:manageRegister, rotate, replay, and delete webhook endpoints.
keys:manageIssue, rotate, and revoke API keys; manage the tenant JWKS.
audit:readRead and export the tenant audit log.
§05

Conventions & header reference

Versioning is date-based and conservative. Additive fields are not breaking; consumers must tolerate unknown keys.
Idempotency. Required on all POST; the original result is replayed for 24 h, keyed by request fingerprint.
Pagination. Opaque, HMAC-signed (tamper-evident) cursors; never offset.
Concurrency. ETag + If-Match optimistic control on mutable resources.
Tracing. W3C traceparent in and out; Server-Timing on every response.
Time. RFC 3339, UTC, millisecond precision, monotonic sequence on streams.
Numbers. Scores are decimals in [0,1]; returns are signed percent; money is integer minor units.
HeaderDirectionPurpose
AR-VersionrequestPins the date-versioned API contract, e.g. 2025-09-30.
AR-Key-IdrequestIdentifies the signing key (ak_live_…).
AR-NoncerequestServer-issued single-use nonce for replay defense.
Signature-Input / SignaturerequestRFC 9421 covered components and Ed25519 signature.
Content-Digestrequest/responseRFC 9530 SHA-256/512 digest of the representation.
Idempotency-KeyrequestDedupe key for POST; 24 h replay of the original result.
If-Match / ETagrequest/responseOptimistic concurrency on mutable resources.
DPoP / AuthorizationrequestSender-constrained proof + bearer/DPoP access token.
traceparent / tracestaterequest/responseW3C Trace Context for distributed correlation.
RateLimit / Retry-AfterresponseToken-bucket budget, reset, and backoff guidance.
AR-Request-IdresponseStable per-request id; quote in support and audit.
Deprecation / SunsetresponseRFC 8594 lifecycle signaling on retiring routes.
§06

REST resources

Fourteen resource families over the desk's output and control plane. Coverage is entitlement-scoped.
Memos
POST
/v2/memos
Enqueue a desk memo. 202 → job; resolves via memo.completed or poll.memos:write
POST
/v2/memos:batch
Submit up to 100 generation jobs atomically; returns a batch handle.memos:write
GET
/v2/memos/{memo_id}
Retrieve a memo: signal, confidence, horizon, materiality, invalidation.memos:read
GET
/v2/memos
Cursor-paginate. Filters: ticker, signal, since, source_set_status.memos:read
GET
/v2/memos/{memo_id}/sources
Reconciled source set with relevance and materiality weights.memos:read
POST
/v2/jobs/{job_id}:cancel
Cooperatively cancel an in-flight generation job.memos:write
Signals
GET
/v2/signals
Current classifications. Filters: signal, min_confidence, horizon.signals:read
GET
/v2/signals/{ticker}
Latest classification with the active invalidation level.signals:read
GET
/v2/signals/{ticker}/history
Point-in-time history for survivorship-free backtest reconstruction.signals:read
GET
/v2/signals:delta
Changes since a watermark; pairs with stream replay.signals:read
Events & Catalysts
GET
/v2/events
Detected catalysts. Filters: type, ticker, window, min_materiality.events:read
GET
/v2/events/{event_id}
Event detail: classification, materiality, dislocation, linked sources.events:read
POST
/v2/events:classify
Classify a caller-supplied event payload without persistence.events:read
Reconciliation
POST
/v2/reconcile
Submit a source set; returns a consistency matrix and materiality weights.reconcile:write
GET
/v2/reconcile/{run_id}
Retrieve a reconciliation run and its evidence graph.events:read
GET
/v2/sources/{source_id}
Normalized source metadata: publisher, published_at, relevance, materiality.events:read
Universe & Securities
GET
/v2/securities
Covered universe with coverage tier and data-availability flags.signals:read
GET
/v2/securities/{ticker}
Security profile, coverage status, and most-recent desk activity.signals:read
GET
/v2/entitlements
The caller's coverage entitlement and per-route scope grants.signals:read
Signal Board
GET
/v2/board
Signal Board snapshot — the desk's current classification set as one document.signals:read
GET
/v2/board:delta
Board changes since a watermark for incremental reconstruction.signals:read
Backtest & Point-in-Time
POST
/v2/pit/query
As-of reconstruction of signals/memos at a historical timestamp.signals:read
POST
/v2/backtests
Materialize a point-in-time panel to object storage for evaluation.exports:write
Exports
POST
/v2/exports
Async export (Parquet/Arrow) to a signed object-store URL.exports:write
GET
/v2/exports/{export_id}
Export status, manifest, row count, and content digests.exports:write
Credentials & Keys
POST
/v2/keys
Issue a scoped API key bound to an Ed25519 public key.keys:manage
POST
/v2/keys/{key_id}:rotate
Rotate signing material with an overlap window; old key sunset-dated.keys:manage
DELETE
/v2/keys/{key_id}
Immediately revoke a key and invalidate bound tokens.keys:manage
GET
/v2/.well-known/jwks.json
Tenant JWKS for verifying response and webhook signatures.—
Webhooks (management)
POST
/v2/webhooks
Register an endpoint; returns the endpoint signing secret once.webhooks:manage
GET
/v2/webhooks/{id}/deliveries
Inspect delivery attempts, response codes, and dead-letters.webhooks:manage
POST
/v2/webhooks/{id}:replay
Replay a delivery or a window of events to the endpoint.webhooks:manage
Streaming & Metering
POST
/v2/stream/tokens
Mint a short-lived (≤ 300 s) DPoP-bound stream token.stream:subscribe
GET
/v2/usage
Metered consumption by route, with quota and overage counters.audit:read
Audit & Status
GET
/v2/audit/events
Tamper-evident audit log (Merkle-chained); exportable to SIEM.audit:read
GET
/v2/status
Component health, region status, and active incident references.—
Example — generate then resolve a memo
# 1 — enqueue (signed, idempotent)
POST /v2/memos                 → 202 Accepted
{ "job_id": "job_29x…", "status": "queued",
  "poll_after_ms": 1500, "ticker": "AAPL" }

# 2 — resolve (poll or receive memo.completed webhook)
GET /v2/memos/mem_5b2…         → 200 OK   (response is signature-verified)
{ "memo_id": "mem_5b2…", "ticker": "AAPL", "company_name": "Apple Inc.",
  "signal": "HOLD", "confidence": 0.62, "horizon": "3–5 weeks",
  "estimated_return": { "low": -2.5, "high": 3.2 }, "risk_level": "medium",
  "event_classification": "post-event narrative digestion",
  "materiality_score": 0.41, "narrative_dislocation_score": 0.55,
  "insight_quality_score": 0.90, "source_set_status": "partial",
  "invalidation": "close > 211.40 on volume > 1.5×ADV invalidates HOLD",
  "sources": 8, "generated_at": "2026-06-25T14:18:02.114Z" }
§07

Streaming — WebSocket / gRPC / SSE

One multiplexed channel, three transports. Ordered, sequence-numbered, replayable, with backpressure.

Subscribe over WebSocket, server-streaming gRPC, or SSE. The upgrade is authenticated with a short-lived DPoP-bound stream token from POST /v2/stream/tokens. Frames carry a monotonic seq; on reconnect, present the last seq to replay the gap (exactly-once via consumer-side dedupe). Slow consumers are signaled via credit-based backpressure before the server sheds; heartbeats every 15 s.

WebSocket subscribe
// wss://stream.aster-ridge.com/v2?token=st_live_…  (DPoP-bound)
→ { "op": "subscribe",
    "channels": ["signals", "memos", "board"],
    "filter": { "tickers": ["AAPL","NVDA","MSFT"], "min_confidence": 0.5 },
    "resume_from_seq": 81419 }

← { "op": "ack", "channels": ["signals","memos","board"], "seq": 81420 }
← { "ch": "signals", "seq": 81421, "type": "signal.updated",
    "data": { "ticker": "NVDA", "signal": "BUY", "confidence": 0.71,
              "invalidation": "loses 168.00 intraday" } }
← { "op": "credit", "available": 512 }     // backpressure window
← { "op": "heartbeat", "seq": 81422, "ts": "2026-06-25T14:18:17.004Z" }
gRPC (Protobuf / AsyncAPI 2.6)
service EventIntelligence {
  rpc Subscribe(SubscribeRequest) returns (stream Frame);
  rpc GetMemo(GetMemoRequest) returns (Memo);
}
// channel binding: ALPN h2, per-RPC deadline, mTLS-bound token in metadata
§08

Webhooks & delivery guarantees

Push delivery, doubly signed (HMAC + Ed25519), ordered per ticker, at-least-once, with dead-letter and replay.
memo.completedA memo job resolved; payload carries the full memo object.
memo.failedA job terminated without a memo; payload carries the reason.
signal.createdA new classification was published for a ticker.
signal.updatedConfidence, horizon, or estimated range changed.
signal.invalidatedA stated invalidation level was breached; signal retired.
event.detectedA catalyst crossed the materiality threshold.
reconcile.completedA reconciliation run finished; consistency available.
export.completedA bulk export is materialized and signed.
board.updatedThe Signal Board snapshot changed; payload carries a delta.
key.rotatedTenant signing material rotated; refresh the JWKS.

Each delivery carries an HMAC-SHA256 over the raw body under your endpoint secret AND a detached Ed25519 signature verifiable against the published JWKS, plus X-AR-Timestamp and X-AR-Delivery-Id. Optionally require mTLS to your endpoint. Respond 2xx within 5 s; non-2xx retries 8× over ~6 h with jittered backoff, then dead-letters. Deliveries are at-least-once and ordered per ticker — dedupe on delivery id.

Signed delivery
POST https://desk.your-fund.com/hooks/aster
AR-Version: 2025-09-30
X-AR-Event: signal.invalidated
X-AR-Delivery-Id: dlv_a91f3c
X-AR-Timestamp: 1790000189
X-AR-Signature: t=1790000189,
  v1=7b9f…hmac_sha256(endpoint_secret),
  v2=:Ed25519…detached…(verify via JWKS):

{ "id": "evt_77c…", "type": "signal.invalidated",
  "created": "2026-06-25T14:31:09.512Z", "sequence": 998211,
  "data": { "ticker": "AAPL", "prior_signal": "HOLD",
            "reason": "invalidation level breached", "memo_id": "mem_5b2…" } }
§09

Data model

Stable object shapes. Additive fields may appear; tolerate unknown keys.
Memo object
{
  "memo_id":            "string",          // mem_…
  "ticker":             "string",
  "company_name":       "string|null",
  "signal":             "BUY|SELL|HOLD",
  "confidence":         "number[0,1]",
  "horizon":            "string",          // human range, e.g. "3–5 weeks"
  "estimated_return":   { "low": "number", "high": "number" },  // percent
  "risk_level":         "low|medium|high",
  "event_classification":       "string|null",
  "materiality_score":          "number[0,1]|null",
  "narrative_dislocation_score":"number[0,1]|null",
  "insight_quality_score":      "number[0,1]|null",
  "source_set_status":  "full|partial|thin",
  "invalidation":       "string",          // the condition under which it is wrong
  "executive_desk_summary": "string|null",
  "sources":            "Source[]",
  "etag":               "string",          // for If-Match
  "generated_at":       "rfc3339"
}
Signal & Source objects
Signal {
  "ticker": "string", "signal": "BUY|SELL|HOLD",
  "confidence": "number[0,1]", "horizon": "string",
  "estimated_return": { "low": "number", "high": "number" },
  "invalidation": "string", "memo_id": "string|null",
  "classified_at": "rfc3339", "superseded_at": "rfc3339|null" }

Source {
  "source_id": "string", "publisher": "string|null", "url": "string|null",
  "published_at": "rfc3339|null", "relevance_score": "number[0,1]",
  "materiality_score": "number[0,1]", "title": "string|null" }
§10

Rate limits & quotas

Token-bucket, per key + per route + per IP. Dedicated and colocated tenants negotiate ceilings.
DimensionStandardDedicatedColocated
REST sustained (token bucket)10 req/s100 req/sNegotiated
REST burst30300Negotiated
gRPC concurrent RPCs16256Dedicated
Concurrent streams232256
Subscriptions / socket501,00010,000
Webhook endpoints350Unlimited
Memo jobs / day250NegotiatedNegotiated
Export volume / day5 GB500 GBDedicated
History retention90 days7 yearsCustom
§11

Errors — problem+json

RFC 9457 Problem Details with a stable type URI, machine code, and request id. Retry only idempotent calls.
HTTPCodeMeaning
400invalid_requestMalformed syntax, bad parameter, or unparseable body.
401invalid_signatureMissing/invalid message signature, nonce, or skewed timestamp.
401invalid_tokenExpired, malformed, or unbound (mTLS/DPoP) access token.
403insufficient_scopeAuthenticated but lacking the scope for this resource.
403entitlement_deniedResource is outside the tenant's coverage entitlement.
404not_foundResource does not exist or is not visible to the caller.
409idempotency_conflictIdempotency-Key reused with a different request body.
412precondition_failedIf-Match did not match the current ETag.
422unprocessable_entityWell-formed but semantically invalid (e.g., uncovered ticker).
429rate_limitedQuota exceeded. Honor Retry-After and RateLimit-* headers.
500internal_errorUnexpected condition. Retry idempotent calls with backoff.
503capacity_exceededSynthesis capacity saturated; retry with exponential backoff.
application/problem+json (RFC 9457)
HTTP/2 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 1
RateLimit-Limit: 100, RateLimit-Remaining: 0, RateLimit-Reset: 1

{ "type": "https://aster-ridge.com/problems/rate_limited",
  "title": "Sustained rate exceeded",
  "status": 429, "code": "rate_limited",
  "request_id": "req_3a8…", "trace_id": "4bf92f3577b34da6…",
  "retry_after_ms": 740 }
§12

Bulk, exports & point-in-time

Move panels, not pages. Async exports to your object store; survivorship-free as-of reconstruction.

Exports materialize columnar Parquet/Arrow to a pre-signed object-store URL (your bucket via cross-account role, or ours with short-lived credentials), with a manifest of row counts and per-file content digests. Point-in-time queries reconstruct the exact signal/memo state as of any historical instant for leakage-free backtests.

Export → object store
POST /v2/exports
{ "dataset": "signals", "format": "parquet",
  "range": { "from": "2025-01-01", "to": "2025-12-31" },
  "destination": { "type": "s3", "role_arn": "arn:aws:iam::…:role/ar-export" } }

→ 202 { "export_id": "exp_5d…", "status": "running" }
GET /v2/exports/exp_5d…
→ 200 { "status": "completed", "rows": 4821339,
        "files": [ { "url": "https://…signed…", "sha-256": "…" } ] }
§13

Key management & crypto governance

Keys are issued, bound, rotated, and revoked per tenant.
IssuancePer-tenant, per-environment, scoped keys bound to a client Ed25519 public key.
RotationOverlap window on rotation; the old key carries a Sunset date.
RevocationImmediate; bound tokens invalidated.
BYOK / HYOKBring/hold-your-own-key via external KMS (AWS/GCP/Azure).
TransparencyServer signing keys appended to a Merkle log; inclusion proofs on request.
JWKSVerify response and webhook signatures against /v2/.well-known/jwks.json.
§14

Reliability, DR & compliance

Planned operating profile: signed, audited, observable, regionally separable.
DeliveryWebhooks at-least-once, signed, ordered per ticker; 8 retries over ~6 h; dead-letter.
Durability / DRMulti-AZ with cross-region async replication.
RegionsPrimary us-east-1; eu-west-1 and ap-northeast-1 read replicas; data residency on request.
NetworkIP allowlisting, AWS PrivateLink / GCP Private Service Connect, static egress for webhooks.
AuditPer-key request log, Merkle-chained, retained 400 days; SIEM export (CEF/OCSF).
§15

Versioning & deprecation

Two axes: an immutable base path (/v2) and a date-pinned contract sent per request.

Breaking changes ship under a new date version; you pin one via the AR-Version header and migrate on your schedule. Retiring routes carry Deprecation and Sunset headers (RFC 8594) for a minimum of 180 days. Additive fields are never breaking.

SpecReleasedNotes
1.0GAREST · WebSocket · signed webhooks · SDK GA across all languages.
0.9Private betagRPC transport; point-in-time query API; signed cursors.
0.8Private betaRFC 9421 message signatures; DPoP token binding; problem+json errors.
0.5Private betaInitial tenants; mTLS-bound tokens (RFC 8705); per-ticker webhook ordering.
§16

SDKs & tooling

First-party clients handle signing, token binding, retries, idempotency, pagination, and stream reconnection.
Pythonasterridge — signing, retries, idempotency, stream reconnect.
TypeScript@aster-ridge/sdk — isomorphic, typed, WebSocket + webhooks helpers.
Gogithub.com/aster-ridge/ar-go — context-aware, gRPC-native.
Rustasterridge — async (tokio), zero-copy decoding.
Javacom.asterridge:ar-sdk — JVM, reactive streams.
CLIarctl — provisioning, key rotation, export, stream tap, replay.
Python
# example shape

from asterridge import Client
ar = Client(key_id="ak_live_…", signing_key="ed25519.pem", mtls=("client.crt","client.key"))

memo = ar.memos.create(ticker="AAPL").wait()       # blocks to resolution
print(memo.signal, memo.confidence, memo.invalidation)

for ev in ar.stream(channels=["signals"], tickers=["NVDA"]):
    if ev.type == "signal.invalidated":
        risk.flatten(ev.data["ticker"])

OpenAPI 3.1 + AsyncAPI 2.6 specifications, a Protobuf bundle, and a Postman collection will ship with tenant credentials. Sandbox keys return deterministic fixtures for CI; a staging environment mirrors production crypto.

§17

Access & Provisioning

Programmatic Access
from $10,000 / month
Provisioned per tenant. Pricing scales with coverage universe, request/stream ceilings, history retention, region replication, dedicated or colocated deployment, and support tier. Bespoke coverage, on-prem key custody, and private connectivity are negotiated directly.
  • ·Dedicated scoped keys, mTLS + DPoP, sandbox
  • ·REST · gRPC · WebSocket · signed webhooks
  • ·Per-tenant coverage entitlement
  • ·OpenAPI 3.1 · AsyncAPI 2.6 · Protobuf · SDKs
  • ·Solutions engineering + onboarding
  • ·PrivateLink, BYOK/HYOK, SIEM audit export
Contact Directly →Engagement is limited to qualified institutional desks. Onboarding includes a security review.

No public performance guarantees. API outputs are informational research artifacts; signal classifications are conditional on stated invalidation levels. Access does not create an advisory relationship. No market-data redistribution.