SYSTEM OPTIMAL
LATENCY: 12msALERT: HBM3E SUPPLY CONSTRAINED
20:42:33 UTC

SiliconANALYSIS API

Programmatic access to AI infrastructure intelligence: alpha-score history with explainable component decomposition, articles with full evidence-chain citations, hyperscaler capex, HBM pricing, real-time alerts.

OpenAPI 3.1Bearer auth10,000 req/dayJSON over HTTPS13 endpoints

New here? Read the MSFT capex anatomy case study to see how the API processes a hyperscaler quarterly event in real time.

Quickstart

Get an API key from /pricing (Pro · API tier), then call any gated endpoint with a Bearer header. Keys are prefixed sa_live_ and shown once at issuance.

List tracked companies + 24h alpha deltas

curl https://www.siliconanalysis.com/api/v1/companies \
  -H "Authorization: Bearer $SA_API_KEY"

90-day score history for one ticker

curl "https://www.siliconanalysis.com/api/v1/scores?ticker=NVDA&days=90" \
  -H "Authorization: Bearer $SA_API_KEY"

Hyperscaler capex — last quarters for Microsoft

curl "https://www.siliconanalysis.com/api/v1/capex?ticker=MSFT" \
  -H "Authorization: Bearer $SA_API_KEY"

Authentication

Pass your API key in the Authorization header as a Bearer token. Newsletter endpoints are open; everything else requires a key issued to a subscriber on the Pro · API plan.

Authorization: Bearer sa_live_<32-hex-character-key>
  • Issuance: in the dashboard settings after upgrading to Pro · API. You can mint multiple keys per account (different environments, services, machines); each has its own rate-limit bucket.
  • Storage: we only persist a SHA-256 hash. The plaintext value is shown once and cannot be recovered.
  • Revocation: any key can be revoked from settings; revoked keys return 401 immediately.

Rate Limits

Each API key has a daily request quota — 10,000 requests / day for the Pro · API plan. Every authenticated response includes three rate-limit headers so clients can pace themselves without a separate probe call.

HeaderMeaning
X-RateLimit-LimitTotal daily quota for this key.
X-RateLimit-RemainingRequests left in the current 24h window.
X-RateLimit-ResetUnix epoch seconds at which the quota resets.

When the quota is exhausted, requests return 429 RATE_LIMITED with a structured body that includes resetAt. If your workload needs higher volume, get in touch.

Errors

Errors return a standard JSON envelope:

{ "error": "<human-readable message>", "code": "<MACHINE_CODE>" }
StatuscodeWhen
400BAD_REQUESTRequired query param missing or invalid value
401UNAUTHORIZEDMissing / malformed / revoked Bearer token
403FORBIDDENSubscriber doesn't have Pro · API access
404NOT_FOUNDTicker / slug / component not tracked
429RATE_LIMITEDDaily quota exhausted; see resetAt
500Internal — safe to retry with exponential backoff

Webhooks

Subscribe to a URL and we'll POST events to it as they happen — alpha alerts, new hyperscaler capex prints, memory pricing updates, fresh articles. Receivers verify deliveries with HMAC-SHA256 against a per-webhook signing secret. Stripe-style envelope, idempotency keys for safe retry.

Available events

Event typeFires when
alert.firedA new AlertEvent row lands — rank jumps, alpha spikes, score breakouts, pipeline anomalies. Payload includes detailJson with the structured before/after.
capex.publishedA hyperscaler quarterly capex row is ingested — total / AI / datacenter breakdown, forward guidance, verbatim CFO quotes.
memory_pricing.publishedA new HBM3 / HBM3E / DDR5 / NAND price reading lands — spot, contract, MoM change.
article.publishedA new article is published. Use GET /api/v1/articles/{slug} to fetch the full body + citationsJson.

Register a webhook

The response includes a plaintext signing secret once. Persist it as $SA_WEBHOOK_SECRET on your receiver side — we store only the SHA-256 hash and cannot recover it later.

curl -X POST https://www.siliconanalysis.com/api/v1/webhooks \
  -H "Authorization: Bearer $SA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://hooks.slack.com/services/T.../B.../...",
    "name": "prod-slack-bridge",
    "events": ["alert.fired", "capex.published"]
  }'

Delivery format

Every delivery is a POST with three headers + a JSON body:

POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-SA-Signature: t=1763229384000,v1=4f7b3a...e2c1
X-SA-Event-Id: 7d83a04e-c1f8-4a3b-9d12-91b0a5e2f7c4
X-SA-Event-Type: alert.fired
User-Agent: SiliconAnalysis-Webhook/1.0

{
  "eventType": "alert.fired",
  "eventId": 18472,
  "data": {
    "id": 18472,
    "type": "ALPHA_SPIKE",
    "ticker": "NVDA",
    "headline": "NVDA alpha jumped +12.4 to 88.6",
    "detailJson": { "oldAlpha": 76.2, "newAlpha": 88.6, "delta": 12.4 },
    "dedupeKey": "ALPHA_SPIKE:NVDA:2026-05-15T18:45Z",
    "createdAt": "2026-05-15T18:45:13.221Z"
  }
}
  • X-SA-Signature t=<unix-ms>,v1=<hex-sig> — HMAC-SHA256 over the literal byte string <t>.<body>.
  • X-SA-Event-Id — stable across retries of the SAME delivery. Use it to dedupe at the receiver.
  • X-SA-Event-Type — echo of the event type for filter-by-header without parsing JSON.

Verify the signature

import hmac, hashlib, time
from fastapi import FastAPI, Request, Header, HTTPException

SECRET = os.environ["SA_WEBHOOK_SECRET"]  # whsec_… plaintext you saved at register time
TOLERANCE_SECONDS = 300  # reject deliveries older than 5 min

app = FastAPI()

@app.post("/sa-webhook")
async def receive(
    request: Request,
    x_sa_signature: str = Header(...),
    x_sa_event_id: str = Header(...),
):
    body_bytes = await request.body()
    # Parse "t=<ms>,v1=<hex>"
    parts = dict(p.split("=", 1) for p in x_sa_signature.split(","))
    ts_ms = int(parts["t"]); sig = parts["v1"]

    # Reject stale deliveries.
    if abs(time.time() * 1000 - ts_ms) > TOLERANCE_SECONDS * 1000:
        raise HTTPException(400, "timestamp_outside_tolerance")

    # Recompute HMAC over "<ts>.<body>" and constant-time compare.
    expected = hmac.new(
        SECRET.encode(),
        f"{ts_ms}.".encode() + body_bytes,
        hashlib.sha256,
    ).hexdigest()
    if not hmac.compare_digest(expected, sig):
        raise HTTPException(401, "signature_mismatch")

    # Dedupe on x_sa_event_id — retries reuse the same key.
    payload = await request.json()
    print(payload["eventType"], payload["data"])
    return {"ok": True}

Retry policy

Receivers MUST return a 2xx response within 10 seconds. Anything else (4xx, 5xx, timeout, network error) triggers a retry on this exponential schedule: 1s → 5s → 30s → 5m → 30m → 2h → 12h. After 7 failed attempts the delivery moves to DEAD_LETTER and we stop retrying. Override the retry budget per webhook via the maxRetries field (1-15).

Endpoint Reference

All endpoints are GET (read-only). Base URL: https://www.siliconanalysis.com. Each endpoint links to its operationId in the OpenAPI spec for SDK generation.

GET/api/v1/companies
Bearer required

List tracked companies with latest alpha context

Returns the tracked company leaderboard with latest score snapshot, valuation metrics, prices, and 24h rank deltas.

operationId: listCompanies

GET/api/v1/scores
Bearer required

Get score history for a ticker

Returns daily ScoreSnapshot rows for the requested tracked ticker. The window defaults to 30 days and is clamped to 1-365 days.

Parameters

NameInTypeRequiredBoundsDescription
tickerquerystringyesTracked company ticker, case-insensitive.
daysqueryintegernodefault 30, min 1, max 365Number of trailing days to include.

operationId: getScoreHistory

GET/api/v1/articles
Bearer required

List published articles with evidence-chain citations

Returns published articles with full citationsJson payload (deterministic evidence rows + LLM-stated claims + leadAnswer + faq). The structured citations are the moat over scraping the public /articles page — every numerical claim maps back to a row in citationsJson.rows.

Parameters

NameInTypeRequiredBoundsDescription
limitqueryintegernodefault 20, min 1, max 100Maximum number of articles to return.
typequery"MARKET_ANALYSIS" | "COMPANY_SPOTLIGHT" | "BREAKING_NEWS" | "SECTOR_REPORT" | "ALPHA_ALERT" | "DEAL_WATCH" | "TECH_DEEP_DIVE"noFilter to one article type.
tickerquerystringnoFilter to articles tagged with this ticker. Case-insensitive.

operationId: listArticles

GET/api/v1/articles/{slug}
Bearer required

Get a published article by slug with full body + evidence

Parameters

NameInTypeRequiredBoundsDescription
slugpathstringyesArticle slug from the canonical /articles/{slug} URL.

operationId: getArticle

GET/api/v1/capex
Bearer required

Hyperscaler capex tracker

Quarterly capital expenditure for MSFT/GOOGL/META/AMZN/ORCL — total capex, AI/datacenter carve-out (when disclosed), forward guidance, YoY change, sentiment, verbatim CFO/CEO quotes. Extracted from earnings call transcripts by the demand_fetch agent. This is the proprietary supply-chain feed: no other public API publishes structured AI-capex carve-outs across all 5 hyperscalers.

Parameters

NameInTypeRequiredBoundsDescription
tickerquery"MSFT" | "GOOGL" | "META" | "AMZN" | "ORCL"noFilter to one hyperscaler. Default returns rows across all 5.
limitqueryintegernodefault 20, min 1, max 100Maximum number of quarter rows to return.

operationId: listCapex

GET/api/v1/memory
Bearer required

HBM/DRAM/NAND memory pricing tracker

Spot and contract prices for HBM3, HBM3E, DDR5, and NAND with month-over-month change. HBM is the binding supply constraint on AI training silicon — spot price moves dictate Nvidia/AMD/Broadcom production schedules. Ingested from TrendForce, DRAMeXchange, and industry analyst reports by the demand_fetch agent.

Parameters

NameInTypeRequiredBoundsDescription
componentquery"HBM3" | "HBM3E" | "DDR5" | "NAND"noFilter to one component. Default returns all 4.
daysqueryintegernodefault 30, min 1, max 365Trailing window in days.
limitqueryintegernodefault 100, min 1, max 500Maximum number of readings to return.

operationId: listMemoryPricing

GET/api/v1/alerts
Bearer required

Recent alert events

AlertEvent rows — the same alerts that fire the dashboard activity feed and Pro-tier email/webhook delivery. Returns structured detail JSON ({oldRank, newRank, delta} for rank moves, {oldAlpha, newAlpha} for alpha jumps, etc.) so quant pipelines can react programmatically.

Parameters

NameInTypeRequiredBoundsDescription
tickerquerystringnoFilter to one ticker. Default returns all (incl. system-wide).
typequerystringnoFilter to one AlertType. Invalid values yield empty results.
daysqueryintegernodefault 7, min 1, max 90Trailing window in days.
limitqueryintegernodefault 50, min 1, max 500Maximum number of alerts to return.

operationId: listAlerts

GET/api/v1/webhooks
Bearer required

List active webhook subscriptions

Returns all webhooks registered to the authenticated subscriber. Revoked webhooks are excluded.

operationId: listWebhooks

POST/api/v1/webhooks
Bearer required

Register a new webhook subscription

Creates a webhook subscription. The response includes the plaintext signing secret ONCE — we persist only its SHA-256 hash. Store the secret as $SA_WEBHOOK_SECRET; it cannot be retrieved later.

operationId: createWebhook

DELETE/api/v1/webhooks/{id}
Bearer required

Revoke a webhook subscription

Soft-deletes a webhook — preserves delivery audit history and marks it inactive. Future events will not be delivered to this webhook URL.

Parameters

NameInTypeRequiredBoundsDescription
idpathintegeryesmin 1Webhook id from the create or list response.

operationId: revokeWebhook

GET/api/v1/briefs
Bearer required

List recent daily briefs

Returns recent Sovereignty Brief records with markdown bodies verbatim. The limit defaults to 30 and is clamped to 1-365.

Parameters

NameInTypeRequiredBoundsDescription
limitqueryintegernodefault 30, min 1, max 365Maximum number of briefs to return.

operationId: listBriefs

GET/api/v1/newsletters
Open

List published newsletters

Returns published newsletter summaries with section availability, citation counts, and Article JSON-LD.

operationId: listNewsletters

GET/api/v1/newsletters/{slug}
Open

Get a published newsletter by slug

Parameters

NameInTypeRequiredBoundsDescription
slugpathstringyesNewsletter slug from the canonical /newsletter/{slug} URL.

operationId: getNewsletter

Generate an SDK

The full OpenAPI 3.1 spec lives at /api/v1/openapi.json. Feed it to openapi-generator to scaffold a client in any language — Python, TypeScript, Go, Ruby, Java, Rust, Kotlin, Swift, etc.

# Python client
openapi-generator-cli generate \
  -i https://www.siliconanalysis.com/api/v1/openapi.json \
  -g python \
  -o ./silicon-analysis-py

# TypeScript-fetch client
openapi-generator-cli generate \
  -i https://www.siliconanalysis.com/api/v1/openapi.json \
  -g typescript-fetch \
  -o ./silicon-analysis-ts

Changelog

v1.2.0
Added /webhooks + delivery worker. Four event types: alert.fired, capex.published, memory_pricing.published, article.published. HMAC-SHA256 signing, idempotency keys, 7-attempt exponential backoff.
v1.1.0
Added /articles, /capex, /memory, /alerts — proprietary moat endpoints.
v1.0.0
Initial release: newsletters, companies, scores, briefs.