/api/v1/companiesList tracked companies with latest alpha context
Returns the tracked company leaderboard with latest score snapshot, valuation metrics, prices, and 24h rank deltas.
operationId: listCompanies
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.
New here? Read the MSFT capex anatomy case study to see how the API processes a hyperscaler quarterly event in real time.
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.
curl https://www.siliconanalysis.com/api/v1/companies \
-H "Authorization: Bearer $SA_API_KEY"curl "https://www.siliconanalysis.com/api/v1/scores?ticker=NVDA&days=90" \
-H "Authorization: Bearer $SA_API_KEY"curl "https://www.siliconanalysis.com/api/v1/capex?ticker=MSFT" \
-H "Authorization: Bearer $SA_API_KEY"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>401 immediately.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.
| Header | Meaning |
|---|---|
| X-RateLimit-Limit | Total daily quota for this key. |
| X-RateLimit-Remaining | Requests left in the current 24h window. |
| X-RateLimit-Reset | Unix 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 return a standard JSON envelope:
{ "error": "<human-readable message>", "code": "<MACHINE_CODE>" }| Status | code | When |
|---|---|---|
| 400 | BAD_REQUEST | Required query param missing or invalid value |
| 401 | UNAUTHORIZED | Missing / malformed / revoked Bearer token |
| 403 | FORBIDDEN | Subscriber doesn't have Pro · API access |
| 404 | NOT_FOUND | Ticker / slug / component not tracked |
| 429 | RATE_LIMITED | Daily quota exhausted; see resetAt |
| 500 | — | Internal — safe to retry with exponential backoff |
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.
| Event type | Fires when |
|---|---|
| alert.fired | A new AlertEvent row lands — rank jumps, alpha spikes, score breakouts, pipeline anomalies. Payload includes detailJson with the structured before/after. |
| capex.published | A hyperscaler quarterly capex row is ingested — total / AI / datacenter breakdown, forward guidance, verbatim CFO quotes. |
| memory_pricing.published | A new HBM3 / HBM3E / DDR5 / NAND price reading lands — spot, contract, MoM change. |
| article.published | A new article is published. Use GET /api/v1/articles/{slug} to fetch the full body + citationsJson. |
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"]
}'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"
}
}t=<unix-ms>,v1=<hex-sig> — HMAC-SHA256 over the literal byte string <t>.<body>.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}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).
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.
/api/v1/companiesReturns the tracked company leaderboard with latest score snapshot, valuation metrics, prices, and 24h rank deltas.
operationId: listCompanies
/api/v1/scoresReturns daily ScoreSnapshot rows for the requested tracked ticker. The window defaults to 30 days and is clamped to 1-365 days.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| ticker | query | string | yes | — | Tracked company ticker, case-insensitive. |
| days | query | integer | no | default 30, min 1, max 365 | Number of trailing days to include. |
operationId: getScoreHistory
/api/v1/articlesReturns 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.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| limit | query | integer | no | default 20, min 1, max 100 | Maximum number of articles to return. |
| type | query | "MARKET_ANALYSIS" | "COMPANY_SPOTLIGHT" | "BREAKING_NEWS" | "SECTOR_REPORT" | "ALPHA_ALERT" | "DEAL_WATCH" | "TECH_DEEP_DIVE" | no | — | Filter to one article type. |
| ticker | query | string | no | — | Filter to articles tagged with this ticker. Case-insensitive. |
operationId: listArticles
/api/v1/articles/{slug}| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| slug | path | string | yes | — | Article slug from the canonical /articles/{slug} URL. |
operationId: getArticle
/api/v1/capexQuarterly 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.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| ticker | query | "MSFT" | "GOOGL" | "META" | "AMZN" | "ORCL" | no | — | Filter to one hyperscaler. Default returns rows across all 5. |
| limit | query | integer | no | default 20, min 1, max 100 | Maximum number of quarter rows to return. |
operationId: listCapex
/api/v1/memorySpot 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.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| component | query | "HBM3" | "HBM3E" | "DDR5" | "NAND" | no | — | Filter to one component. Default returns all 4. |
| days | query | integer | no | default 30, min 1, max 365 | Trailing window in days. |
| limit | query | integer | no | default 100, min 1, max 500 | Maximum number of readings to return. |
operationId: listMemoryPricing
/api/v1/alertsAlertEvent 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.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| ticker | query | string | no | — | Filter to one ticker. Default returns all (incl. system-wide). |
| type | query | string | no | — | Filter to one AlertType. Invalid values yield empty results. |
| days | query | integer | no | default 7, min 1, max 90 | Trailing window in days. |
| limit | query | integer | no | default 50, min 1, max 500 | Maximum number of alerts to return. |
operationId: listAlerts
/api/v1/webhooksReturns all webhooks registered to the authenticated subscriber. Revoked webhooks are excluded.
operationId: listWebhooks
/api/v1/webhooksCreates 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
/api/v1/webhooks/{id}Soft-deletes a webhook — preserves delivery audit history and marks it inactive. Future events will not be delivered to this webhook URL.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| id | path | integer | yes | min 1 | Webhook id from the create or list response. |
operationId: revokeWebhook
/api/v1/briefsReturns recent Sovereignty Brief records with markdown bodies verbatim. The limit defaults to 30 and is clamped to 1-365.
| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| limit | query | integer | no | default 30, min 1, max 365 | Maximum number of briefs to return. |
operationId: listBriefs
/api/v1/newslettersReturns published newsletter summaries with section availability, citation counts, and Article JSON-LD.
operationId: listNewsletters
/api/v1/newsletters/{slug}| Name | In | Type | Required | Bounds | Description |
|---|---|---|---|---|---|
| slug | path | string | yes | — | Newsletter slug from the canonical /newsletter/{slug} URL. |
operationId: getNewsletter
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-tsv1.2.0/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/articles, /capex, /memory, /alerts — proprietary moat endpoints.v1.0.0