Compute prices across 38 providers, 6,607 datacenter facilities, submarine cables, terrestrial fibre and power infrastructure — as a queryable API rather than a download. Every response says what licence it carries and how much of your allowance it used.
Every endpoint below requires access. There is no free or anonymous tier: unauthenticated
requests are refused with 401. We would rather issue access deliberately than run an
open endpoint while the billing and abuse controls are still being built.
How to get access today:
Requests without an issued key, from
anywhere other than our own site, return 401. The documentation below is published so
you can evaluate whether the data fits before asking — not as an invitation to collect it.
Requests carry an issued key. Without one the API answers 401.
curl -H "X-API-Key: $EC_KEY" \
"https://api.deploy.openmesh.cloud/api/v1/offers?cat=gpu&sort=cheap&limit=5"
Every response carries the licence and your remaining allowance in headers:
x-data-licence: proprietary; (c) OwnX Labs; attribution required
x-ratelimit-remaining: 1847
x-ratelimit-class: owned
Four tiers, because a coding agent and a procurement department cannot buy the same way. None of them is anonymous today.
| Tier | Who it is for | Identity | Payment |
|---|---|---|---|
| Evaluation | Assessing fit before committing | Issued key, time-limited | — |
| Metered | Agents and machine traffic | Key, or payment at time of request | Per request |
| Keyed | Companies, dashboards, integrations | Account + API key | Monthly, invoiced |
| Licensed | Resellers, research, bulk | Contract | Negotiated |
You are charged for rows returned, not requests made. A query that matches three offers should not cost what one returning five hundred does, and pricing per request would reward exactly the wide, indiscriminate queries we would rather not serve.
| Class | What it covers | Free allowance |
|---|---|---|
owned | Our compiled price observations — offers, instruments, unit cost | 2,000 rows/hour |
open | Openly-licensed records — facilities, cables, power, fibre | 200,000 rows/hour |
The split is deliberate. PeeringDB and OpenStreetMap data is open, and rate-limiting it as though it were ours would be both unfriendly and dishonest. What is scarce is the price corpus we build and maintain, so that is what is metered tightly.
| Data | Source | Licence |
|---|---|---|
| Prices, instruments, unit cost | Our own observations | Proprietary © OwnX Labs — attribution required |
| Facilities, networks, exchanges | PeeringDB | CC BY 4.0 |
| AI model catalogue and price ladders | Vendor APIs, OpenRouter, Epoch AI | Proprietary compilation; sources cited per row |
| Buildings, power, terrestrial fibre | OpenStreetMap contributors | ODbL 1.0 |
| Global imagery | Sentinel-2 cloudless, EOX IT Services | CC BY 4.0 |
| US 0.3 m imagery | NAIP / USGS | Public domain |
/layers/* versus /offers — keeps each licence attached to the data it
actually governs.
Base URL https://api.deploy.openmesh.cloud/api/v1. All endpoints are
GET and return JSON.
| Endpoint | Returns | Key parameters |
|---|---|---|
GET/offers | Priced offers, one page | cat (vgpu·gpu·cpu·ram·storage), tier, provider,
location, gpu, min_ram, min_cores,
sort (cheap·dear·ram·cores·new·provider), limit (max 500),
cursor |
GET/facets | Offer counts per tier | — |
GET/dimensions | Provider, region and GPU lists for building filters | — |
GET/compare/bootstrap | Category counts, regions, providers, GPU histogram, totals | cat |
next; pass
it back as cursor. There is no page=9000, so the corpus cannot be walked
by incrementing an integer — and deep OFFSET would degrade the database for everyone.
{
"rows": [ … ],
"count": 25,
"next": "vastai|1xrtx306012gb",
"meter": { "class": "owned", "used": 25, "remaining": 1975 }
}
| Endpoint | Returns |
|---|---|
GET/instruments | All 10 indices with point counts |
GET/instruments/:metric | Monthly series — median, low/high band, segment and observation counts |
GET/metrics/tree | Metric taxonomy (5 categories, 10 metrics) |
GET/unitcost | Unit cost by year, with as_of_year and stale_years |
GET/fx | Currency rates used for USD normalisation, with as_of |
Metrics: cpu, ram, storage, gpu,
tflop, llm, power, cloudram,
hwssd, egress.
| Endpoint | Returns | Key parameters |
|---|---|---|
GET/models | Model catalogue — GPU rentals, LLM, image, embedding, audio, OpenRouter | dataset, category, brand, q, limit, cursor |
GET/models/facets | Counts per dataset and category, and how many carry a price | — |
GET/models/:id | One model with its host ladder and any published price history | — |
unit; converting them to a common basis would invent a number nobody is charged.
Models the vendor lists without publishing a price are kept with NULL prices rather than
dropped — "this exists and nobody publishes its cost" is a fact worth returning.
| Endpoint | Returns | Key parameters |
|---|---|---|
GET/facility/:id | One facility, its networks and nearby sites | — |
GET/layers/facilities | Datacenters in a box | bbox=w,s,e,n, limit (max 2000) |
GET/layers/power | Power stations, with fuel and capacity | bbox, limit |
GET/layers/landings | Cable landing points | bbox, limit |
GET/layers/cables | Submarine cable routes | — |
GET/layers/terrestrial | Terrestrial fibre routes | bbox, limit |
GET/ixps | Internet exchange points — 1,326 across 171 countries | country, q, limit, cursor |
/layers/* caps at 2,000 rows per call. Stated because it is easy to miss: a
single unbounded request returns a fraction of the estate and looks complete. Walk longitude bands
to enumerate everything — twelve 30° bands covers all 6,607 facilities.
| Status | Meaning | What to do |
|---|---|---|
400 | Missing or malformed parameter (e.g. bbox absent) | Fix the request; the body names the field |
404 | Unknown facility or instrument | Check the identifier |
401 | No key, and not our own site | Request access — there is no anonymous tier |
429 | Hourly row allowance exhausted | Wait for Retry-After, or move to a paid tier |
402 | Planned. Payment required to continue | The body will carry payment details; retry once settled |
Most machine traffic will not read this page, so the API is built to be usable without it: parameters are guessable, errors name the field at fault, and every response reports its own metering state so a client can pace itself rather than discovering a limit by hitting it.
MCP is planned but not yet available. When it ships it will front these same endpoints with the same metering and licence headers — an MCP server is exactly as open as the API behind it, so it will not be published before a payment path exists.