This site publishes a small, unauthenticated HTTP surface. It is documented here because the pages themselves use it, and because anyone auditing this site should be able to read what it answers without reverse-engineering the JavaScript.

The machine-readable copy of what follows is /openapi.json (OpenAPI 3.1), and the assistant-facing manifest is /.well-known/ai-plugin.json.

Endpoints

GET /healthz

Liveness probe for the vhost. Answers 200 with the plain-text body ok.

1
2
$ curl -s https://ymrtech.com/healthz
ok

GET /contact/token.json

Returns the token the contact form sends as X-Contact-Token:

1
{ "token": "…" }

It ships with the site and is not a secret — anything in a page’s source is public. Its job is to reject tokenless bots before they can spend a real visitor’s rate-limit budget. The per-IP rate limit, not the token, is what bounds a caller who reads the token.

POST /contact/submit

The contact form. Accepts application/x-www-form-urlencoded or multipart/form-data.

Field Required Notes
name yes  
email yes  
message yes  
company no  
service no one of the values in the form’s own list
budget no one of the values in the form’s own list
website — hidden bot trap; must be left empty

Requires the X-Contact-Token header. Responses:

Status Meaning
200 handed to the mail relay; the form follows to /contact/thanks/
400 missing or malformed fields ({"ok": false, "error": "…"})
403 missing or wrong token
413 body above the accepted maximum
415 unsupported content type
429 per-IP rate limit exhausted

POST /vpn/rum/collect

The first-party, cookieless telemetry beacon that this site’s own pages POST to: one page_view event per page, web-vitals timings, and uncaught errors. It is same-origin by design and changes with the client, so it is described here to be complete, not offered as an integration point. What it does and does not collect is stated in the privacy policy and enforced by a build gate.

Not a public API

Everything under /api/* belongs to the client portal (/account): it is session-authenticated, it carries device and subscription data, and it changes with the portal. It is deliberately absent from the OpenAPI document. If you need something from it, ask — do not build against it.

Machine-readable site metadata

Path What it is
/llms.txt curated summary and link map for language models
/openapi.json this page, as a spec
/sitemap.xml crawl surface
/robots.txt crawl rules
/.well-known/security.txt RFC 9116 security contact
/security-policy/ what is in scope for a report
/.well-known/ai-plugin.json assistant-facing manifest

Every one of those files is generated from this repository and checked by a gate on every build — a metadata file that stops parsing, or an Expires date that came too close, fails CI rather than shipping.

ymrtech@ymrtech | NixOS | UTF-8