The perception layer, as an API
Call the Digital Twin Earth over MCP or plain REST. Site intelligence, live hazards, buildings, traffic, place trends and street-level vision, every figure with disclosed provenance.
The API is keyless. Every endpoint answers without a key, without a card, without a signup. A key is optional and free: it names your usage and raises the per-minute ceiling from 120 to 600 requests per minute. That is all it does.
Keys and fair use
Keyless by default. A key is optional and free: it names your usage and raises the per-minute ceiling. That is all it does.
| Tier | Rate limit | Scope | Cost |
|---|---|---|---|
| Anonymous | 120 req/min | per IP | Nothing. Just call. |
| With a free key | 600 req/min | per key | free, issued on the developer dashboard |
Getting and using a key
Keys are issued for free on the developer dashboard. Rotating there issues a new key and kills the old one immediately. Pass it as the X-Api-Key header or as a ?key= query parameter.
curl "https://api.solyzer.ai/earth/usage" \
-H "X-Api-Key: YOUR_KEY"GET /earth/usage returns your own consumption: owner (masked), today's total and per-path breakdown, the month total and a daily series. Without a valid key it returns 401.
Rate limits and metering
Every /earth response carries X-RateLimit-Limit and X-RateLimit-Remaining. When you cross the ceiling you get a 429 with Retry-After: 60; back off and the window resets.
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118Usage is counted at the origin. Reads served by the edge cache never reach it and are free.
Usage counts origin hits only. Reads served by the edge cache are free and are never counted, so they do not touch your usage or your per-minute ceiling.
Read this before the numbers
The layer is honest by design. These five rules hold on every response; an agent that respects them will not be misled.
Figures carry confidence: high | low | unknown. UNKNOWN means the source could not answer, never treat it as zero. low means measured but from thin data or a reported sampling cap.
Every brief and score ships a caveats[] array. Read it before the numbers; it states assumptions and sampling limits.
Responses with health.sourcesUsable < health.sourcesQueried are served uncached and incomplete by design. Retry later for a full read.
A null score means the system refused to invent a number. Do not impute.
Per-record license fields matter: ODbL-1.0 sources are share-alike; CDLA / CC0 / public-domain are permissive. Keep them separable downstream.
Two ways in
Same tools, same contract, whichever door you pick. MCP and REST are two transports over one surface.
MCP
A Model Context Protocol server over streamable HTTP, stateless. Point an MCP-speaking agent at the endpoint and the earth_* tools appear.
{
"mcpServers": {
"solyzer-earth": {
"url": "https://api.solyzer.ai/mcp"
}
}
}REST
Plain HTTP for agents and code that do not speak MCP. No SDK, no signup, just a URL.
curl "https://api.solyzer.ai/earth/site-intel?\
lat=-6.2088&lon=106.8456&radius=500"The globe on your page
The same Digital Twin Earth, live, in one tag. Embedding on your own site takes a free publishable key, and a keyless frame renders only on solyzer.ai and on localhost while you build, so swap pk_earth_live_YOUR_KEY for your own. The key names your traffic and locks the frame to the domains you register. Source credit renders inside the frame and cannot be turned off.
Script tag
<!-- Solyzer Digital Twin Earth -->
<div
data-solyzer-earth
data-lat="-6.2088"
data-lon="106.8456"
data-zoom="9"
data-layers="quakes,disasters,cyclones"
data-key="pk_earth_live_YOUR_KEY"
data-height="520"
></div>
<script src="https://www.solyzer.ai/embed.js" async></script>Plain iframe
<iframe
src="https://www.solyzer.ai/embed/earth?lat=-6.2088&lon=106.8456&zoom=9&layers=quakes%2Cdisasters%2Ccyclones&k=pk_earth_live_YOUR_KEY"
title="Solyzer Digital Twin Earth"
width="100%"
height="520"
loading="lazy"
referrerpolicy="strict-origin-when-cross-origin"
allow="fullscreen"
sandbox="allow-scripts allow-same-origin allow-popups"
style="border:1px solid #26262a;border-radius:12px;display:block"
></iframe>The full surface
11 tools. Each MCP tool maps 1:1 to the REST path shown next to it.
The live manifest is unreachable right now, so this reference is the built-in fallback and may lag.
Swipe the table sideways for the rest of the columns.
| Method | Tool / Path | Params | Returns |
|---|---|---|---|
| GET | /earth/site-intelup to 60s cold | lat, lon, radius, category | Explained, auditable site score: signed contributions, per-feature confidence, caveats, evidence geometry. score is null when too little is known. |
| GET | /earth/site-scan | bbox, category | Ranked grid cells with per-cell confidence and nearest-road distance. |
| GET | /earth/events | - | Active GDACS events with alert levels, extent bounding boxes (not hazard outlines) and provenance. |
| GET | /earth/event-briefup to 60s cold | id | Exposure, lifelines, condition and observation joins for one event, every figure with confidence, caveats first. |
| GET | /earth/event-changes | - | New, escalated, deescalated and resolved events, newest first, plus the change-history subsystem status. |
| GET | /earth/places | bbox | Overture places (CDLA-permissive) in the box, sampled. |
| GET | /earth/infrastructure | bbox | Communication and power structures (ODbL). Absence is unknown, not zero. |
| GET | /earth/traffic-tiles | w, s, e, n | Precomputed traffic-equilibrium fingerprints per street segment. |
| GET | /earth/place-trends | bbox | Map churn between the two newest archived snapshots: places appeared and disappeared by id, with named samples. Conflates real change with mapping activity, disclosed in-band. |
| POST | /earth/read-storefront | imageId, imageUrl | VLM read of a street photo's signage: {tag, description}. |
| GET | /earth/agent-tools | - | This machine-readable manifest: the live contract and tool list. |
latLatitude of the point.lonLongitude of the point.radiusSearch radius in meters, 100 to 3000.categoryOptional business category the score is computed for.Returns: Explained, auditable site score: signed contributions, per-feature confidence, caveats, evidence geometry. score is null when too little is known.
bboxw,s,e,n bounding box, at most 0.05 degrees on a side.categoryOptional business category for the ranking.Returns: Ranked grid cells with per-cell confidence and nearest-road distance.
No parameters.
Returns: Active GDACS events with alert levels, extent bounding boxes (not hazard outlines) and provenance.
idGDACS event id, for example FL1102983.Returns: Exposure, lifelines, condition and observation joins for one event, every figure with confidence, caveats first.
No parameters.
Returns: New, escalated, deescalated and resolved events, newest first, plus the change-history subsystem status.
bboxw,s,e,n bounding box.Returns: Overture places (CDLA-permissive) in the box, sampled.
bboxw,s,e,n bounding box.Returns: Communication and power structures (ODbL). Absence is unknown, not zero.
wwest longitudessouth latitudeeeast longitudennorth latitude, box at most 0.6 degrees on a sideReturns: Precomputed traffic-equilibrium fingerprints per street segment.
bboxw,s,e,n bounding box, at most 1 degree on a side, Indonesia archive.Returns: Map churn between the two newest archived snapshots: places appeared and disappeared by id, with named samples. Conflates real change with mapping activity, disclosed in-band.
imageIdStreet photo id.imageUrlStreet photo URL.Returns: VLM read of a street photo's signage: {tag, description}.
No parameters.
Returns: This machine-readable manifest: the live contract and tool list.
The authoritative, always-current list lives at https://api.solyzer.ai/earth/agent-tools.
One server, no ceremony
The MCP server speaks streamable HTTP and is stateless: every call stands alone, nothing to session, nothing to hold open. It exposes exactly the tools in the reference above; the REST paths and the earth_* tools are the same surface.
Claude Desktop, Cursor, and friends
Add this to your client's MCP config and the tools appear. No auth step: keys are optional here too, and the fair-use limits above apply the same way.
{
"mcpServers": {
"solyzer-earth": {
"url": "https://api.solyzer.ai/mcp"
}
}
}Raw protocol
Or speak the protocol directly: POST https://api.solyzer.ai/mcp with a JSON-RPC body. Because the server is stateless you can load balance, retry and cache without ever thinking about a session.