Overview
The datacenters.world API is a read-only REST interface over the same dataset that powers the public map and editorial pages.
- 5,675 data center facilities across 148 countries
- 34,732 networks (ASNs) + 1,309 internet exchanges
- 176 public cloud regions across AWS, Google, Azure, Oracle
JSON by default, CSV via ?format=csv. All responses are edge-cached with stale-while-revalidate and any-origin CORS. Sources include PeeringDB, OpenStreetMap, operator-published facility pages (Equinix, Digital Realty, DataBank, Cologix, CoreSite, CyrusOne, QTS, Iron Mountain), datacenters.google, and datacenters.atmeta.com.
Quick start
Sixty seconds end to end: sign in with GitHub, generate a key on the dashboard, then list the 5 largest German Equinix sites:
const res = await fetch(
'https://datacenters.world/api/v1/facilities?country=DE&operator=Equinix&limit=5',
{ headers: { Authorization: 'Bearer dcw_…' } }
);
const { data, meta } = await res.json();
console.log(data, meta);Free tier is 1,000 requests/month — no card required. Quota resets monthly on your signup anniversary (free) or billing cycle (paid).
Authentication
Every request needs a key passed as Authorization: Bearer dcw_…. Unauthenticated calls return 401 Unauthorized.
const res = await fetch(
'https://datacenters.world/api/v1/facilities?country=DE&limit=5',
{ headers: { Authorization: 'Bearer dcw_…' } }
);Keys are dcw_ + 43 base64url chars (256 bits of entropy fromcrypto.randomBytes). The plaintext is shown once at creation and stored sha256-hashed at rest. Lost a key? Revoke and regenerate from the dashboard — there’s no recovery path.
Every successful response sets X-RateLimit-Tier, X-RateLimit-Limit, and X-RateLimit-Remaining. See Errors & rate limits for the over-quota behavior.
Endpoints
Five endpoints, all GET. Each one accepts ?format=csv in addition to JSON.
/api/v1/facilities— Paginated list of data centers. The workhorse endpoint.| country | string | ISO-3166-1 alpha-2 codes, comma-separated | country=DE,FR |
| operator | string | Operator name. Single value uses prefix match; multiple values use exact match. | operator=Equinix |
| min_power_mw | number | Minimum published power capacity, MW | min_power_mw=10 |
| status | enum | operational | under_construction | planned | status=operational |
| limit | number | 1–500, default 50 | limit=100 |
| offset | number | 0+, default 0 | offset=100 |
| format | string | json (default) or csv | format=csv |
const res = await fetch(
'https://datacenters.world/api/v1/facilities?country=US&limit=2',
{ headers: { Authorization: 'Bearer dcw_…' } }
);
const { data, meta } = await res.json();{
"data": [
{
"slug": "equinix-inc-equinix-dc1-...",
"name": "Equinix DC1-DC15,DC21-DC22 - Ashburn",
"operator": "Equinix, Inc.",
"code": null,
"city": "Ashburn",
"country": "US",
"lat": 39.018593,
"lng": -77.539233,
"status": "operational",
"power_mw": null,
"space_sqft": null,
"ups_redundancy": null,
"uptime_sla": null,
"network_count": 504,
"ix_count": 7
}
],
"meta": {
"total": 1394,
"returned": 2,
"limit": 2,
"offset": 0,
"next_offset": 2
}
}| slug | string | Unique, URL-safe identifier. Stable across renames. |
| name | string | Display name. |
| operator | string | null | Company that operates the facility. |
| code | string | null | Operator's internal facility code (e.g. CH5, NY9). |
| city | string | null | Municipality. |
| country | string | ISO-3166-1 alpha-2 country code. |
| lat | number | Latitude (WGS-84). |
| lng | number | Longitude (WGS-84). |
| status | enum | operational · under_construction · planned · decommissioned. |
| power_mw | number | null | Published IT power capacity, megawatts. Sparse — only ~2% of rows. |
| space_sqft | number | null | Total facility area, square feet. ~10% of rows. |
| ups_redundancy | string | null | UPS redundancy spec, e.g. "N+1", "2N". |
| uptime_sla | string | null | Uptime guarantee, e.g. "99.9999%+". |
| network_count | number | Distinct ASNs present per PeeringDB. |
| ix_count | number | Distinct internet exchanges present per PeeringDB. |
/api/v1/facilities/{slug}— Full record for one facility — specs, networks, IXPs, and source provenance.const slug = 'equinix-inc-equinix-ny2-ny4-ny5-ny6-new-york-secaucus-secaucus';
const res = await fetch(`https://datacenters.world/api/v1/facilities/${slug}`, {
headers: { Authorization: 'Bearer dcw_…' },
});
const { data } = await res.json();{
"data": {
"slug": "equinix-inc-equinix-ny2-...",
"name": "Equinix NY2/NY4/NY5/NY6 - New York, Secaucus",
"operator": "Equinix, Inc.",
"power_mw": null,
"space_sqft": 129436,
"tier": null,
"year_built": null,
"pue": null,
"ups_redundancy": "N+1",
"uptime_sla": "99.9999%+",
"certifications": ["FISMA", "HIPAA", "ISO 27001", "..."],
"networks": [ /* 129 ASNs, each with name, asn, irr_policy */ ],
"ixes": [ /* 10 internet exchanges with member counts */ ],
"sources": [ /* 5 provenance records: source, source_url, fetched_at */ ],
"network_count": 129,
"ix_count": 10
}
}| slug | string | Unique, URL-safe identifier. Stable across renames. |
| name | string | Display name. |
| operator | string | null | Company that operates the facility. |
| code | string | null | Operator's internal facility code (e.g. CH5, NY9). |
| city | string | null | Municipality. |
| country | string | ISO-3166-1 alpha-2 country code. |
| lat | number | Latitude (WGS-84). |
| lng | number | Longitude (WGS-84). |
| status | enum | operational · under_construction · planned · decommissioned. |
| power_mw | number | null | Published IT power capacity, megawatts. Sparse — only ~2% of rows. |
| space_sqft | number | null | Total facility area, square feet. ~10% of rows. |
| ups_redundancy | string | null | UPS redundancy spec, e.g. "N+1", "2N". |
| uptime_sla | string | null | Uptime guarantee, e.g. "99.9999%+". |
| network_count | number | Distinct ASNs present per PeeringDB. |
| ix_count | number | Distinct internet exchanges present per PeeringDB. |
| tier | enum | null | Uptime Institute tier: I · II · III · IV. |
| year_built | number | null | Year construction completed. |
| pue | number | null | Power Usage Effectiveness (lower is better). |
| cooling | string | null | Cooling system summary. |
| certifications | string[] | null | Compliance certifications (SOC 2, ISO 27001, FedRAMP, etc.). |
| networks | object[] | ASNs present at this facility. Each entry: name, asn, irr_policy. |
| ixes | object[] | Internet exchanges present. Each entry: name, code, member_count. |
| sources | object[] | Provenance records. Each entry: source, source_url, fetched_at. |
/api/v1/operators— Operators ranked by facility count, with country breadth.| country | string | Restrict to operators present in these countries | country=DE,FR |
| min_facilities | number | Minimum facility count | min_facilities=5 |
| limit | number | 1–1000, default 100 | limit=20 |
| format | string | json or csv | format=csv |
const res = await fetch('https://datacenters.world/api/v1/operators?limit=5', {
headers: { Authorization: 'Bearer dcw_…' },
});
const { data } = await res.json();{
"data": [
{ "operator": "Equinix, Inc.", "facility_count": 263, "country_count": 35 },
{ "operator": "Digital Realty", "facility_count": 220, "country_count": 22 },
{ "operator": "CyrusOne Inc.", "facility_count": 83, "country_count": 9 },
{ "operator": "DataBank, Ltd.", "facility_count": 78, "country_count": 2 },
{ "operator": "QTS Realty Trust, Inc.", "facility_count": 61, "country_count": 3 }
],
"meta": { "total": 5 }
}| operator | string | Canonical operator name (legal-suffix form, e.g. "Equinix, Inc."). |
| facility_count | number | Total facilities operated. |
| country_count | number | Distinct countries with at least one facility. |
/api/v1/countries— All countries with at least one facility, ranked by count.| format | string | json or csv | format=csv |
const res = await fetch('https://datacenters.world/api/v1/countries', {
headers: { Authorization: 'Bearer dcw_…' },
});
const { data } = await res.json();{
"data": [
{ "country": "US", "country_name": "United States", "facility_count": 1394 },
{ "country": "DE", "country_name": "Germany", "facility_count": 359 },
{ "country": "BR", "country_name": "Brazil", "facility_count": 303 }
],
"meta": { "total": 148 }
}| country | string | ISO-3166-1 alpha-2 code. |
| country_name | string | Full English country name. |
| facility_count | number | Total facilities in this country. |
/api/v1/cloud-regions— All public cloud regions across AWS, Google, Azure, and Oracle.| provider | enum | aws | gcp | azure | oracle, comma-separated | provider=aws,gcp |
| country | string | ISO-3166-1 alpha-2 codes | country=DE |
| format | string | json or csv | format=csv |
const res = await fetch(
'https://datacenters.world/api/v1/cloud-regions?provider=aws&country=DE',
{ headers: { Authorization: 'Bearer dcw_…' } }
);
const { data } = await res.json();{
"data": [
{
"provider": "aws",
"code": "eu-central-1",
"name": "Europe (Frankfurt)",
"city": "Frankfurt",
"country": "DE",
"lat": 50.1109,
"lng": 8.6821,
"launched_year": 2014
}
],
"meta": { "total": 1 }
}| provider | enum | aws · gcp · azure · oracle. |
| code | string | Region code, e.g. "eu-central-1". |
| name | string | Display name, e.g. "Europe (Frankfurt)". |
| city | string | null | Region city, when published. |
| country | string | null | ISO-3166-1 alpha-2 code, when published. |
| lat | number | Latitude (WGS-84). |
| lng | number | Longitude (WGS-84). |
| launched_year | number | null | Year the region became GA. |
MCP (AI tool access)
The same atlas, exposed as Model Context Protocol tools. Add the endpoint below to Claude Desktop, Cursor, Claude Code, or any other MCP-aware client and your AI gets typed access to facilities, operators, networks, IXPs, and cloud regions — citations included.
Client config
{
"mcpServers": {
"datacenters-world": {
"url": "https://datacenters.world/api/mcp",
"headers": {
"Authorization": "Bearer dcw_…"
}
}
}
}claude mcp add datacenters-world \ --transport http \ --header "Authorization: Bearer dcw_…" \ https://datacenters.world/api/mcp
mcp-remote{
"mcpServers": {
"datacenters-world": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://datacenters.world/api/mcp",
"--header",
"Authorization: Bearer dcw_…"
]
}
}
}Tools
All five tools return a source_url pointing at the canonical facility / operator / IXP page so your AI can cite back to the dataset.
| Tool | Inputs | Returns |
|---|---|---|
| search_facilities | country[], operator (prefix), min_power_mw, limit | Up to 50 facilities with key facts + source_url. |
| get_facility | slug | Full record — specs, top 50 ASNs, top 20 IXPs, source provenance. |
| list_operators | country[], min_facilities, limit | Operators ranked by facility count + country breadth. |
| list_countries | (none) | All 148 countries with facility counts. |
| list_cloud_regions | provider, country[] | Hyperscale regions across AWS, Google, Azure, Oracle. |
Quota note: each MCP tool call counts as one request against your monthly quota — same path as /api/v1/*. AI agents typically fan out 3–6 tool calls per chat turn, so budget accordingly. Free tier (1,000/month) covers roughly 150–300 chat conversations.
Conventions
Response envelope
All JSON responses are { data, meta }. data is the result; meta carries totals and pagination cursors.
Pagination
Pass limit + offset. The response includes meta.next_offset (or null when exhausted). Lists cap at limit=500.
Caching
Lists: 5-minute edge cache. Details & aggregates: 1-hour. All responses use stale-while-revalidate so cache misses still serve instantly while the new value generates.
CSV exports
Append ?format=csv. Nested fields (e.g. networks, certifications) are serialized to JSON inside their cell so spreadsheets stay rectangular.
CORS
Open to any origin. No preflight required for plain GETs using only the Authorization header.
Stability
Field additions are non-breaking. Field renames or removals ship under a new major (/api/v2/) — never inside v1.
Errors & rate limits
Non-2xx responses use a uniform error envelope:
const res = await fetch('https://datacenters.world/api/v1/facilities', {
headers: { Authorization: 'Bearer dcw_…' },
});
if (!res.ok) {
const { error } = await res.json();
// error.status, error.message, optional details
}| Status | When | What to do |
|---|---|---|
| 400 | Malformed query params (e.g. bad enum value). | Fix the request; check the param table for the endpoint. |
| 401 | Missing or invalid Authorization header. | Sign in, create a key, re-send. |
| 404 | Slug not found on a detail endpoint. | List first, then look up by exact slug. |
| 429 | Monthly quota exceeded for this key. | Wait for next month, or upgrade tier on the dashboard. |
| 5xx | Upstream failure (rare). | Retry with backoff. All endpoints are idempotent. |
Rate-limit headers on every successful response: X-RateLimit-Tier (free | pro | team | enterprise), X-RateLimit-Limit (monthly cap), and X-RateLimit-Remaining. Quotas roll over on the 1st of each month in UTC.
Pricing
| Tier | Quota | Price | For |
|---|---|---|---|
| Free | 1,000 / month | $0 | Hobbyists, evaluation, indie tools. |
| Pro | 10,000 / month | $9.99 / mo | Production services, dashboards, internal tools. |
| Team | 50,000 / month | $39.99 / mo | Bulk analytics, market research, embedded data. |
| Enterprise | custom | contact | SLA, custom exports, on-prem mirror. |
Pro and Team ship with a 3-day free trial via Polar.sh — no charge until day 4, cancel anytime. Upgrades take effect immediately and every active key on your account inherits the new tier. Manage from the dashboard.
Versioning
All endpoints live under /api/v1/. Breaking changes ship under a new major (/api/v2/) — never inside v1. Additive changes (new optional query params, new response fields) ship without version bump.
Deprecation policy: any field or param removed from v1gets at least 90 days’ notice via the Deprecation response header and a note here.
Data from PeeringDB (CC-BY-SA), OpenStreetMap (ODbL), operator-published facility pages, datacenters.google, and datacenters.atmeta.com · Citing the API is appreciated · No usage analytics