GET/api/health
Service health
Liveness of the Worker that serves this site and its API. Returns plain JSON, not the tRPC envelope. This is the endpoint the catalog's `status` relation points at.
Returns: `{ "status": "ok", "timestamp": "<ISO 8601>" }`
Verified 2026-09-21: HTTP 200
GET/api/trpc/news.list
List published news articles
Paginated list of published articles, newest first, optionally filtered by category. Only articles marked published are returned; there is no way to reach a draft through this endpoint.
Input (optional): {"json":{"page":<integer >= 1, default 1>,"limit":<1-50, default 20>,"category":<optional: product_updates | industry_insights | partnerships | recognition | research | company_news>}}
Returns: `{ articles: Article[], total: number, page: number, totalPages: number }`
Verified 2026-09-21: HTTP 200
GET/api/trpc/news.get
Fetch one published article by id
The full record, including body content, for a single published article. Returns null rather than an error when the id is unknown or the article is not published, so a caller cannot use this endpoint to tell a draft from a missing article.
Input (required): {"json":{"id":<integer>}}
Returns: `Article` or `null`
Verified 2026-09-21: HTTP 200
GET/api/trpc/news.latest
The most recent published articles
A short list for a homepage or sidebar, carrying summary fields only: id, title, excerpt, category, imageUrl and publishedAt. Use news.get for the body.
Input (optional): {"json":{"limit":<1-10, default 3>}}
Returns: `ArticleSummary[]`
Verified 2026-09-21: HTTP 200
GET/api/trpc/news.categoryCounts
Published article count per category
Counts of published articles keyed by category, with a total. Enough to build a filter without listing every article first.
Returns: `{ counts: Record<string, number>, total: number }`
Verified 2026-09-21: HTTP 200
GET/api/trpc/contact.formConfig
Contact form configuration
What the inquiry form needs before it renders. Carries the Cloudflare Turnstile *site* key, which is public by design and appears in the widget's own markup; the secret half never leaves the Worker. A null site key means no challenge is configured on this deployment.
Returns: `{ turnstileSiteKey: string | null }`
Verified 2026-09-21: HTTP 200