Skip to content

Documentation

Ayonix Public Web API

The read-only endpoints published by ayonix.com, and how to call them. Every endpoint on this page was called against production and answered HTTP 200 on 2026-09-21; anything that could not be verified is not listed.

Discovery

This API is announced at /.well-known/api-catalog as an RFC 9727 catalog, served as application/linkset+json. It carries a machine-readable OpenAPI 3.1 document, a link back to this page, and the health endpoint below.

curl -H 'Accept: application/linkset+json' https://ayonix.com/.well-known/api-catalog

Two call conventions

Read this part before the endpoint list, because it is the most likely reason a first call appears to return nothing useful. /api/health is plain JSON. Everything under /api/trpc/ is a tRPC procedure: arguments go in a single JSON-encoded input query parameter, and the payload comes back wrapped in an envelope.

# arguments in, JSON-encoded, as one query parameter
curl -G https://ayonix.com/api/trpc/news.list \
  --data-urlencode 'input={"json":{"page":1,"limit":5}}'

# payload out, wrapped - the part you want is at result.data.json
{"result":{"data":{"json":{"articles":[],"total":0,"page":1,"totalPages":0}}}}

Procedures whose arguments are all optional can be called with no input at all.

Endpoints

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

Why there are no write endpoints here

The inquiry, consultation, partnership and careers forms do accept submissions, and they are not documented on this page. When the deployment has a Cloudflare Turnstile challenge configured, a submission must carry a token from that challenge, so a documented POST would stop working the moment that setting changed — and a published call that breaks on a configuration change is the same problem as a published endpoint that does not exist. If you are a person with a question, the form at /inquiry is the supported route.

Fair use

These endpoints are rate-limited and offered without an uptime commitment. They are here so an automated client can read published content without scraping rendered HTML. If you need volume beyond casual polling, or a guarantee behind it, ask us at /inquiry rather than scaling up quietly.