v1 · free tier available · bearer-token auth required

API.

Read access to every data center, operator, country, and cloud region in the atlas. JSON or CSV, open CORS, edge-cached. Every request needs an API key — create a free one (no card) and you’re in.

Base URL
/api/v1
Auth
bearer (required)
Formats
json · csv
CORS
open
On this page
01

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.

02

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).

03

Authentication

#

Every request needs a key passed as Authorization: Bearer dcw_…. Unauthenticated calls return 401 Unauthorized.

Authenticated request
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.

04

Endpoints

#

Five endpoints, all GET. Each one accepts ?format=csv in addition to JSON.

GET/api/v1/facilitiesPaginated list of data centers. The workhorse endpoint.
Query parameters
countrystringISO-3166-1 alpha-2 codes, comma-separatedcountry=DE,FR
operatorstringOperator name. Single value uses prefix match; multiple values use exact match.operator=Equinix
min_power_mwnumberMinimum published power capacity, MWmin_power_mw=10
statusenumoperational | under_construction | plannedstatus=operational
limitnumber1–500, default 50limit=100
offsetnumber0+, default 0offset=100
formatstringjson (default) or csvformat=csv
Request
const res = await fetch(
  'https://datacenters.world/api/v1/facilities?country=US&limit=2',
  { headers: { Authorization: 'Bearer dcw_…' } }
);
const { data, meta } = await res.json();
Response (truncated)
{
  "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
  }
}
Response fields
slugstringUnique, URL-safe identifier. Stable across renames.
namestringDisplay name.
operatorstring | nullCompany that operates the facility.
codestring | nullOperator's internal facility code (e.g. CH5, NY9).
citystring | nullMunicipality.
countrystringISO-3166-1 alpha-2 country code.
latnumberLatitude (WGS-84).
lngnumberLongitude (WGS-84).
statusenumoperational · under_construction · planned · decommissioned.
power_mwnumber | nullPublished IT power capacity, megawatts. Sparse — only ~2% of rows.
space_sqftnumber | nullTotal facility area, square feet. ~10% of rows.
ups_redundancystring | nullUPS redundancy spec, e.g. "N+1", "2N".
uptime_slastring | nullUptime guarantee, e.g. "99.9999%+".
network_countnumberDistinct ASNs present per PeeringDB.
ix_countnumberDistinct internet exchanges present per PeeringDB.
GET/api/v1/facilities/{slug}Full record for one facility — specs, networks, IXPs, and source provenance.
Request
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();
Response (truncated)
{
  "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
  }
}
Response fields
slugstringUnique, URL-safe identifier. Stable across renames.
namestringDisplay name.
operatorstring | nullCompany that operates the facility.
codestring | nullOperator's internal facility code (e.g. CH5, NY9).
citystring | nullMunicipality.
countrystringISO-3166-1 alpha-2 country code.
latnumberLatitude (WGS-84).
lngnumberLongitude (WGS-84).
statusenumoperational · under_construction · planned · decommissioned.
power_mwnumber | nullPublished IT power capacity, megawatts. Sparse — only ~2% of rows.
space_sqftnumber | nullTotal facility area, square feet. ~10% of rows.
ups_redundancystring | nullUPS redundancy spec, e.g. "N+1", "2N".
uptime_slastring | nullUptime guarantee, e.g. "99.9999%+".
network_countnumberDistinct ASNs present per PeeringDB.
ix_countnumberDistinct internet exchanges present per PeeringDB.
tierenum | nullUptime Institute tier: I · II · III · IV.
year_builtnumber | nullYear construction completed.
puenumber | nullPower Usage Effectiveness (lower is better).
coolingstring | nullCooling system summary.
certificationsstring[] | nullCompliance certifications (SOC 2, ISO 27001, FedRAMP, etc.).
networksobject[]ASNs present at this facility. Each entry: name, asn, irr_policy.
ixesobject[]Internet exchanges present. Each entry: name, code, member_count.
sourcesobject[]Provenance records. Each entry: source, source_url, fetched_at.
GET/api/v1/operatorsOperators ranked by facility count, with country breadth.
Query parameters
countrystringRestrict to operators present in these countriescountry=DE,FR
min_facilitiesnumberMinimum facility countmin_facilities=5
limitnumber1–1000, default 100limit=20
formatstringjson or csvformat=csv
Request
const res = await fetch('https://datacenters.world/api/v1/operators?limit=5', {
  headers: { Authorization: 'Bearer dcw_…' },
});
const { data } = await res.json();
Response (truncated)
{
  "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 }
}
Response fields
operatorstringCanonical operator name (legal-suffix form, e.g. "Equinix, Inc.").
facility_countnumberTotal facilities operated.
country_countnumberDistinct countries with at least one facility.
GET/api/v1/countriesAll countries with at least one facility, ranked by count.
Query parameters
formatstringjson or csvformat=csv
Request
const res = await fetch('https://datacenters.world/api/v1/countries', {
  headers: { Authorization: 'Bearer dcw_…' },
});
const { data } = await res.json();
Response (truncated)
{
  "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 }
}
Response fields
countrystringISO-3166-1 alpha-2 code.
country_namestringFull English country name.
facility_countnumberTotal facilities in this country.
GET/api/v1/cloud-regionsAll public cloud regions across AWS, Google, Azure, and Oracle.
Query parameters
providerenumaws | gcp | azure | oracle, comma-separatedprovider=aws,gcp
countrystringISO-3166-1 alpha-2 codescountry=DE
formatstringjson or csvformat=csv
Request
const res = await fetch(
  'https://datacenters.world/api/v1/cloud-regions?provider=aws&country=DE',
  { headers: { Authorization: 'Bearer dcw_…' } }
);
const { data } = await res.json();
Response (truncated)
{
  "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 }
}
Response fields
providerenumaws · gcp · azure · oracle.
codestringRegion code, e.g. "eu-central-1".
namestringDisplay name, e.g. "Europe (Frankfurt)".
citystring | nullRegion city, when published.
countrystring | nullISO-3166-1 alpha-2 code, when published.
latnumberLatitude (WGS-84).
lngnumberLongitude (WGS-84).
launched_yearnumber | nullYear the region became GA.
05

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.

Endpoint
/api/mcp
Transport
streamable http
Auth
bearer (required)
Quota
shared with REST

Client config

Claude Desktop · Cursor · any HTTP-MCP client
{
  "mcpServers": {
    "datacenters-world": {
      "url": "https://datacenters.world/api/mcp",
      "headers": {
        "Authorization": "Bearer dcw_…"
      }
    }
  }
}
Claude Code (CLI)
claude mcp add datacenters-world \
  --transport http \
  --header "Authorization: Bearer dcw_…" \
  https://datacenters.world/api/mcp
Stdio-only clients (older builds) — wrap with 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.

ToolInputsReturns
search_facilitiescountry[], operator (prefix), min_power_mw, limitUp to 50 facilities with key facts + source_url.
get_facilityslugFull record — specs, top 50 ASNs, top 20 IXPs, source provenance.
list_operatorscountry[], min_facilities, limitOperators ranked by facility count + country breadth.
list_countries(none)All 148 countries with facility counts.
list_cloud_regionsprovider, 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.

06

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.

07

Errors & rate limits

#

Non-2xx responses use a uniform error envelope:

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
}
StatusWhenWhat to do
400Malformed query params (e.g. bad enum value).Fix the request; check the param table for the endpoint.
401Missing or invalid Authorization header.Sign in, create a key, re-send.
404Slug not found on a detail endpoint.List first, then look up by exact slug.
429Monthly quota exceeded for this key.Wait for next month, or upgrade tier on the dashboard.
5xxUpstream 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.

08

Pricing

#
TierQuotaPriceFor
Free1,000 / month$0Hobbyists, evaluation, indie tools.
Pro10,000 / month$9.99 / moProduction services, dashboards, internal tools.
Team50,000 / month$39.99 / moBulk analytics, market research, embedded data.
EnterprisecustomcontactSLA, 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.

09

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