Appearance
Platform primitives
The same building blocks we use to run Latency, handed to you. Each platform primitive is a small HTTP API that nails one job (resolve a name, locate an IP, size up a host), and they're built to snap together.
Want proof they compose? The host inspector is really just geo + DNS + status catalog stacked into a single answer. Nothing behind the curtain you can't call yourself.
The primitives
| Primitive | What it does | Auth | Status |
|---|---|---|---|
| DNS | DNS-over-HTTPS resolver (RFC 8484 wire + JSON). | Public | Live |
| Geo | Geolocation and network operator (ASN) for an IP. | Public | Live |
| Inspect | Everything we know about a host, in one call. | Public | Live |
| Status catalog | Live status of major providers, reconciled against our probes. | Public | Live |
| Incidents | Confirmed and crowd-reported outages for a target. | Public | Live |
| Search | Find services and popular domains. | Public | Live |
| Key–value store | Durable, workspace-scoped storage for your functions. | Account | Beta |
Public vs. account
Public primitives need no sign-up and are rate-limited per IP. Point a tool at them and go. Account primitives store data on your behalf and require an API key. See Authentication.
Base URL
All primitives live under a single versioned host:
https://ws.latency.app/v1/Conventions
- Format. Responses are JSON unless a primitive documents otherwise (the DNS wire format returns binary).
- Rate limits. Public primitives are limited per client IP. Exceeding a limit returns
429with a JSON body; slow down and retry. - Errors. Failures return a non-2xx status and a JSON body of the shape
{ "error": "<code>" }, sometimes with adetailfield. - No secrets in URLs. For account primitives, send your key in the
Authorizationheader, never in the query string.
Rate limits
Public primitives are metered per client IP so one caller cannot starve the rest. Over a limit you get 429 with { "error": "rate_limited" } and a Retry-After header, slow down and retry.
| Surface | Default limit (per IP) | Notes |
|---|---|---|
| Public primitives (geo, inspect, status catalog, incidents, search) | ~1,200 requests/min (shared budget) | Strict on purpose, these are a shared public good, not a scraping backend. |
| DNS-over-HTTPS resolver | 600 requests/min | Free and unmetered, on the house. Never counted against any plan quota. |
| Running a published Function | 120 executions/min | Stricter, because each call runs code. |
Going past the public limits
The public budgets are sized for interactive and light programmatic use. For sustained or high-volume access, authenticate with an API key: account calls are governed by your plan quotas instead of the shared public budget. Heavy anonymous use will see 429s well before an authenticated caller would.
DNS is the exception
The resolver is deliberately generous and free. It is offered as a public utility, so its budget is only there to stop abuse, and its queries never touch your plan quotas. Everything else public is held to the stricter shared limit above.
A note on worker primitives
Internally, Latency's monitoring engine runs its own set of trusted building blocks: the checks that probe your services (check.http, check.tcp, check.tls) and the channels that deliver alerts (send.webhook, send.email, send.sms). These are worker primitives: you don't call them directly. Instead you configure them through monitors and alerts, which is where they're documented. This page is about the platform primitives above, the ones you can call yourself.