Real-world data your AI agents can prove.
Ask about any place on Earth and get what was actually observed there, with a receipt anyone can check. Verifying is free and needs no account. Built on the open emem protocol.
How busy is Trafalgar Square right now?
about usual
- ✓cryptographic hash — sha256 of the payload's canonical bytes equals payload_sha256
- ✓source identity — the key this receipt names is geo.qa's published signing keykid geoqa-2026-06 · geoqa
- ✓cryptographic — ed25519 over the payload's canonical bytes, under the key above
- ✓binding — the envelope's outer schema label equals the schema inside the signed payload
- —binding — the signed payload is the kind the caller expected (not asked: pass expect_schema to pin the kind)
- ✓record lookup (not a proof) — a leaf for this cid exists in geoqa-transparency-v1geoqa-transparency-v1 · 0 independent witnessesno independent party has co-signed this log's head yet, so a different history shown to someone else would go undetectedcheck it yourself: GET /verify/log/proof/8f4b9f1291cfb775937a37471712678ab2404aec23866abae8b4604b78e1cdcc -- fold the audit path to the signed root yourself
Signed 2026-09-18 16:37 UTC. Checked by this page 2026-09-18 16:44 UTC.
- that the observation is accurate: the signature proves these bytes came from geo.qa unchanged, not that the sensor or the model got the world right
- that any sentence written about this payload is true: text around a receipt is not signed by it unless it is inside payload
# No key. No account. A live London camera frame.
curl -X POST https://geo.qa/api/v1/object-detection \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk/00001.06508.jpg",
"prompts": ["car", "person", "bicycle"]
}'{
"detections": [
{
"label": "car",
"confidence": 0.967,
"bbox": [37.4, 120.0, 83.2, 140.6],
"bbox_normalized": [0.106, 0.417, 0.236, 0.488],
"area": 938.95
}
],
"total_objects": 14,
"model": "fasterrcnn_mobilenet_v3_large_fpn (cpu_detect@3)",
"processing_time_ms": 1005
}Objects in any image, no key and no account. You name the classes when you call it, and a class the detector on duty has no head for comes back in refused_prompts — named, with the reason — rather than as an empty list you would read as 'nothing there'.
Why it exists
Models guess about places. This one checks.
Put an agent in production and sooner or later it answers a question about somewhere it has never seen. Fluently, and wrong. geo.qa gives it the observations instead.
One address per place
Every point on Earth maps to a stable cell about ten metres across. Every observation, from any sensor, files against it. Two agents asking about the same ground get the same address, not two descriptions of it.
Observed, not generated
Satellites, your own cameras, drones and ground sensors all write into one record. An answer is the observations that support it. When there are none, it says so rather than guessing.
A receipt with every answer
Each fact is signed and logged. You can check any receipt yourself, offline, against the open protocol. You pay to ask. Checking is free, always.
The API
16 routes. Eleven need no key.
This is the whole published surface. Everything below is in the OpenAPI spec, and it speaks MCP, so an agent can pick it up without an integration.
Perceive
Send an image, a satellite tile or a live feed and get structured objects back.
- GET
/api/worlds/londonno keyA whole place at once: what London's cameras see now, the trend, and the receipt under each count.
- POST
/api/v1/object-detectionno keyOpen-vocabulary detection + segmentation masks on any image. You name the classes at call time.
- POST
/api/mcp · analyze_scenekeyA written description of what is actually in the frame.
- POST
/api/tool/camera-stream/detectionskeyDetections across a live camera feed, not a single frame.
Ground
Turn a place into an answer. Every result resolves to a cell64 address, so two agents asking about the same ground get the same address rather than two descriptions of it.
- GET
/api/tool/satellite/lulc/analyzekeyLand use and land cover at a point, from Sentinel-2, Landsat or Sentinel-1.
- POST
/api/tool/satellite/lulc/bboxkeyThe same over a bounding box, as fractional coverage per class.
- POST
/api/tool/satellite/lulc/polygonkeyThe same, clipped to an arbitrary polygon: a field, a concession, a district.
Prove
Every answer carries a signed receipt. These nine routes check one — including the signature on the agent card itself — and none of them need a key, so an auditor or a customer can confirm an answer without an account.
- POST
/api/world-model/verifyno keyOne door for any token or receipt: a fact, a bundle, a card, a bare content id. No key.
- GET
/api/world-model/verify/by-cid/{cid}no keyVerify a receipt by its content id and get the full per-step verdict. The path the London page and the tools point at.
- POST
/api/world-model/verify/receiptno keyRe-check one signed receipt. ed25519, offline-checkable, no account.
- POST
/api/world-model/verify/batchno keyUp to 256 receipts in one call. Over that it refuses rather than truncating.
- GET
/api/world-model/verify/log/sthno keyThe signed head of the transparency log. Every inclusion proof resolves to it.
- GET
/api/world-model/verify/log/proof/{cid}no keyRFC 6962 inclusion proof: this fact is in the log, at this position.
- GET
/api/world-model/verify/log/consistencyno keyConsistency proof between two tree sizes: entries were only ever appended.
- POST
/api/world-model/verify/agent-cardno keyCheck the signature on our agent card — the document an agent reads before it trusts anything else here. Detached JWS over RFC 8785; the key is at /.well-known/jwks.json.
- GET
/api/world-model/media/receipt/{sha256}no keyHash a file you were handed and ask whether geo.qa holds a signed custody record for those exact bytes. Proves the file has not changed since we received it — not that what it shows is true.
Pricing
Priced per answer.
One number to compare. Real-world data costs more than a web fetch because a satellite pass is not a page load, and the price says so plainly.
You pay per answer. A detection, a land-cover read or a recall each count as one. Anything that returns signed data is an answer.
Checking costs nothing, on every tier. Verifying a receipt, pulling an inclusion proof or auditing the transparency log is free forever, because an answer you have to pay us to re-check was never proof.
- Answers
- 30,000 / month
- Storage
- 50 GB
For one person putting an agent into production
Start Pro- Answers
- 250,000 / month
- Storage
- 500 GB
For a team watching many places at once
Start Max- Answers
- Unmetered
- Storage
- Unlimited
For a deployment that has to run inside your boundary
Talk to salesTeam seats and annual billing are on the full pricing page. Prices in USD, billed through Razorpay.
Give your model a memory.
Let it cite what was seen instead of guessing what is likely.
geo.qa · the managed deployment of the emem protocol