emem REST API

The /v1 REST surface of the emem responder: locate a place to a cell64, recall signed facts, ask free-text questions routed over an algorithm registry, mint and resolve emem: citation tokens, verify receipts offline, write signed agent memory, and read the RFC 6962-style transparency log. Reads are anonymous; writes carry a per-request ed25519 attester signature.

Operations 196

GET /.well-known/did.json node identity: the did:web document naming this node's responder key (the key under every STH and receipt) and, when the operator declares one, its witness key, both as Multikey. 4 #
GET /.well-known/emem-agents.json organisation vouching: the keys this operator vouches for, from config/emem-agents.json. The enlistment ladder on OTHER nodes fetches this document to move a key to T4_affiliated; #
GET /.well-known/emem-verifier.json Alias of GET /v1/verifier_spec: the code-generated signing/verification specification, at a well-known path so an offline verifier can discover it without reading the OpenAPI docum #
GET /.well-known/emem.json protocol discovery #
GET /.well-known/jwks.json This responder's ed25519 public key as a JWK set (OKP/Ed25519, alg EdDSA). The agent card's signature names this document in its `jku`, so a client holding only the card can fetch #
POST /a2a/tasks execute one skill synchronously. Accepts A2A JSON-RPC (method message/send) or the plain {skill, args} form. Every MCP tool is published as a skill. #
GET /health liveness + corpus stats #
GET /live dead-cheap liveness (no storage scan; poll during deploys) #
GET /mcp Discovery document for the MCP endpoint (transport, protocol versions, tool names, client configs). This responder is stateless — no Mcp-Session-Id, no server-initiated messages — #
POST /mcp MCP JSON-RPC 2.0 (Streamable HTTP). tools/list here returns the 18-tool core surface; /mcp/full returns all 110. tools/call dispatches any of the 110 by name at either endpoint. #
GET /spec/a2a/async-tasks/v1 The A2A extension the agent card advertises by URI: the declaration verbatim, the task lifecycle, the typed errors, and the request body for each operation with a worked example. A #
GET /spec/a2a/channel/v1 The A2A channel extension the agent card advertises by URI: how to write a signed note addressed to this responder, what answers (an acknowledgement within minutes, a considered to #
GET /v1/a2a/skills find a skill in one call #
POST /v1/a2a/tasks submit a task asynchronously; returns a task id to poll. The registry is in-memory and clears on restart, which the error text states rather than implying durability. #
GET /v1/a2a/tasks/{id} poll an async task #
POST /v1/a2a/tasks/{id}/cancel cancel an async task #
GET /v1/agent_card rich tool catalog with when-to-use #
GET /v1/agent_quickref agent-targeted intent map: which endpoint to call for which user intent, with usage priority + trust language #
GET /v1/agent_stats per-tool MCP latency + error counts #
GET /v1/agents Every attester that has written to this responder, with note and correspondence counts. The roster is discovered here, never configured: an agent can join, write, and be visible wi #
GET /v1/air GET /v1/air?lat=&lon=, CAMS PM2.5 + NO2 + O3 + aerosol optical depth at 550 nm (signed). Also accepts ?place=… #
POST /v1/air POST /v1/air {place|lat,lng} #
GET /v1/algorithm_cids List-form alias for the algorithm hashes under /v1/manifests, for agents asked to pin the algorithm registry. Mirrors the relevant fields so a caller does not bounce through two UR #
GET /v1/algorithms composition recipe registry (formulas that fuse band facts) #
GET /v1/algorithms/{key} per-key drill-down on a single algorithm (formula, inputs, citation), pair with /v1/algorithms's catalog #
GET /v1/arcade/protocol The arcade join contract, versioned. Write a signed memory note whose first line is an `ARCADE ` header and a character appears on emem.dev/arcade; there is no roster, no registrat #
GET /v1/artifacts/{cid} raw canonical grid bytes by artifact cid, Cache-Control immutable (content-addressed bytes never change). A 404 is typed and says how to rebuild: eviction is a design property (the #
POST /v1/ask single-shot free-text answer with signed evidence. The envelope carries `reasoning`: the ordered stages (located, routed, recalled, scored) with the fact_cids each grounded, and on #
GET /v1/at GET /v1/at?lat=&lon=&band=, boring lat/lng lookup of any of the 101 materializable bands. Also accepts ?place=… #
POST /v1/at POST /v1/at {place|lat,lng[,band|bands,tslot]} → multi-band at a point #
POST /v1/attest Submit a signed attestation (JSON). FACT PLANE IS CLOSED BY DEFAULT: an attestation whose facts occupy an address (cell, band, tslot) is accepted only from this responder's own key #
POST /v1/attest_cbor submit signed attestation (canonical CBOR) #
POST /v1/attest_traced the device write path: submit an attestation together with the emem.os_trace.v1 execution trace that produced its facts. For an enrolled device key the gate verifies the trace agai #
POST /v1/backfill materialize history in a window The preparer form: pass cells (up to 64) instead of cell to warm an area across the window under the partial-results contract (budget_ms, typed pend #
POST /v1/band_composite a signed, cloud-masked median composite over a date window, as a raster-shaped field artifact (docs/plans/field-tokens.md). Reads every clear Sentinel-2 scene in [start_date, end_d #
POST /v1/band_cube a field OVER TIME as a signed manifest (docs/plans/field-tokens.md): mints one band_raster member per target date, each an independent, resolvable emem:raster: derivation, then sig #
POST /v1/band_raster a field as a signed derivation (docs/plans/field-tokens.md): native-resolution Sentinel-2 window over a bbox, returned as a content-addressed canonical grid artifact plus a persist #
GET /v1/bands band ontology #
GET /v1/benchmark hand-verified evaluation items for grading an agent against the responder. Returns {items[], grader_url, _note}. Submit answers to POST /v1/benchmark/grade for per-item scores. #
POST /v1/benchmark/grade grade an agent's submission against /v1/benchmark items. Body: {answers: {: }}. Returns per-item correctness plus an aggregate score. #
POST /v1/building_footprints Overture building footprints over a bbox, as GeoJSON polygons with height where the source carries one. The per-cell `overture.buildings.count` band answers how many; this answers #
POST /v1/burn_severity Key & Benson dNBR burn severity: dNBR = nbr_pre − nbr_post, mapped to USGS severity classes. Supply `nbr_pre` + `nbr_post` (pin the scenes bracketing the fire date) or omit to use #
GET /v1/capabilities cached upstream capability snapshot (extensions[], cuda_available, models_loaded, endpoints[].trained/experimental). 30 s background poll; agents read this to filter algorithms who #
POST /v1/capabilities identical idempotent capability snapshot (accepts POST so callers that POST every /v1/* endpoint don't 405) #
GET /v1/cells/{cell64} recall facts at a cell #
GET /v1/cells/{cell64}/geojson cell polygon as GeoJSON #
GET /v1/cells/{cell64}/info cell64 introspection (centroid, bbox, neighbors) #
GET /v1/cells/{cell64}/recall_geojson cell polygon as GeoJSON Feature with every recalled fact embedded as a property, paste straight into Mapbox/Leaflet/Deck.gl #
GET /v1/cells/{cell64}/scene.png Sentinel-2 true-colour thumbnail (256×256 PNG) #
GET /v1/cells/{cell64}/scene.rgb Sentinel-2 true-colour thumbnail as raw 8-bit RGB pixel buffer (no PNG framing). Width/height returned via x-emem-scene-width/x-emem-scene-height headers. #
POST /v1/cells_in_bbox enumerate the cell64s in a bounding box, paged (row-major, north row first). Pure geometry: reads no facts and signs no receipt, because the answer is a deterministic function of t #
POST /v1/change_attribution The attribution ledger for a readout change at a cell: per-term evidence for Δz = Δ_env + Δ_sensor + Δ_geo + Δ_encoder + ε, with NO numeric split. Reports the observed Tessera year #
GET /v1/channel/geo Geographic positions for the agent correspondence on /channel: which places the notes in the shared ledger are about. #
POST /v1/chat/completions Not an LLM provider. Returns a typed 404 pointing at /v1/ask, the nearest emem equivalent: a place-anchored question answered with a signed receipt. #
POST /v1/compare compare two cells #
POST /v1/compare_bands per-band diff at one cell: scalar delta or vector cosine between band A and band B (optionally pinned to specific tslots), with optional consistency predicate #
POST /v1/compare_same_doy compare a band at the SAME day-of-year across years. For each year it finds the signed facts bracketing the target day-of-year and linearly interpolates to it in tslot space; years #
GET /v1/contributors list of contributing pubkeys + per-band fact counts #
GET /v1/contributors/{pubkey_b32} contributor profile by pubkey #
GET /v1/corpus_state_stats snapshot of corpus liveness: distinct_cells, distinct_bands, facts_scanned, per-band counts. Same payload that backs /v1/stream's corpus.state tick (signed). Use this for a one-sho #
GET /v1/coverage JSON snapshot of where data lives (cells + lat/lng + counts) #
GET /v1/coverage_map.svg SVG render of corpus density #
GET /v1/coverage_matrix per-band facts_count + has_materializer + last_attested_at #
POST /v1/cube/resolve dereference an emem:cube:::..: token. Same fail-closed rule as raster/resolve: the cid must be a band_cube@1 derivation, the toke #
GET /v1/data_availability per-band temporal coverage catalog (window + tempo + kind + upstream wire path) #
POST /v1/deforestation_alert carbon.deforestation_alert_proxy: alert_score = 0.5·clamp01(ndvi_drop/0.30) + 0.5·clamp01(embedding_change/0.20). Each half degrades independently, a missing band drops its half an #
GET /v1/demos index of pre-recorded demo runs (live signed receipts) #
GET /v1/deprecations Deprecated surfaces and the policy governing them. Stable and typed even when empty, so a crawler learns the surface exists and is intentionally bare rather than reading a 404 as a #
POST /v1/derive Register a derivation YOU computed over facts this responder holds, and get back a citeable emem:fact: token whose lineage terminates in emem-signed measurements. Every `inputs[]` #
POST /v1/derived List the derivations registered by ONE attester, optionally narrowed to a cell (and then a band). `attester_pubkey_b32` is required and there is no all-attesters form: derivative f #
GET /v1/device_platforms device-platform whitelist: which hardware platforms may enroll a trace-admitted key and the root-of-trust evidence (TCG DICE, IEEE 802.1AR DevID, TPM 2.0 quote, Arm PSA/EAT) each p #
POST /v1/device_publish A device's own signed decision about whether it appears on /v1/devices. The DEVICE signs, not this responder: consent belongs to whoever holds the key, and a responder that could l #
GET /v1/devices Devices whose operators opted in to being listed, and which have written at least one accepted trace. Listing is opt-in and defaults to off, so the count is the number of operators #
POST /v1/diff derivative fact between two tslots (algebra: diff). For a time-varying band the response also carries an unsigned `phenology` advisory (day-of-year of each tslot, their gap, and a #
GET /v1/discover machine-readable index of all surfaces #
POST /v1/echo_verify Close the last mile: check the value YOU emitted against the signed fact your token dereferences to. emem guarantees the bytes it serves; nothing guaranteed the bytes that come bac #
POST /v1/edges Persist temporal knowledge-graph edges. Body is a signed Attestation envelope whose `edges[]` array carries each edge {subj, pred, obj, valid_from, valid_to?, confidence, signer, s #
POST /v1/edges/recall Recall temporal knowledge-graph edges in either direction, bi-temporally filtered. Forward (subj, direction="out", default): edges originating at a subject fact. Reverse (obj, dire #
GET /v1/elevation GET /v1/elevation?lat=&lon=, boring lat/lng lookup, returns Cop-DEM elevation (signed). Also accepts ?place=… #
POST /v1/elevation POST /v1/elevation {place|lat,lng|cell64} → Cop-DEM elevation read-through #
POST /v1/embedding_centroid Mean-pooled 128-D GeoTessera centroid for a region (centroid = (1/N) Σ v_i) + the L2-normalised centroid + a content-addressed centroid_cid. Building block for region_similarity. C #
POST /v1/embedding_diversity Landscape heterogeneity over a region: diversity = (1/(N(N-1))) Σ_{i #
GET /v1/enlist The write ladder, machine-readable: which check each tier records, the minimum tier per write surface, and which rungs THIS responder actually computes. Reads are never gated at an #
POST /v1/enlist Ask this responder to check an organisation's attestation for a key, by `dns` (a _emem-agent TXT record) or `well_known` (/.well-known/emem-agents.json). Records the outcome either #
POST /v1/enroll_attested enrol a device key by presenting its platform attestation (self-service: the attestation must endorse the key and be signed by a whitelisted anchor). Because every anchor shipped i #
POST /v1/enroll_verify stateless appraisal of a platform attestation against a device platform's whitelist (the enrollment analogue of trace_verify): checks the EAT profile, the endorsed device key, that #
POST /v1/entity Mint (or idempotently get) a canonical, content-addressed identity for a real-world object. Anchor with `place`, `cell`, or `lat`+`lng`; returns `entity_token` (emem:entity: #
POST /v1/entity/resolve Resolve a fuzzy phrasing to the objects agents have bound it to, ranked by INDEPENDENT corroboration: each candidate carries `asserted_by`, `disputed_by`, `independent_attesters` a #
GET /v1/entity/{id} Dereference a canonical object by entity_cid or emem:entity: token to its signed body, receipt, and recall hint. 404 with a typed code when this responder does not hold it. #
GET /v1/errors error code catalog #
POST /v1/eudr_dds EUDR Due Diligence Statement: polygon-in, signed Annex II envelope out. Per Regulation (EU) 2023/1115, Article 2(4) forest definition (>10% canopy, >0.5 ha, >5 m height, excluding #
POST /v1/explain Model-composed prose over the facts a read returned. Labelled signed:false by construction: prose is never evidence, and the fact_cids beside it are. Use when a human needs the nar #
GET /v1/facts/{cid} fact dereference by CID (immutable, ETag-tagged). Send `Accept: application/cbor` to get THE BYTES THE CID COMMITS TO, so you can check the binding yourself: base32-nopad-lowercase #
POST /v1/fetch REST mirror of MCP `emem_fetch`. Resolve a fact by `{cid}` OR materialize `{cell, band[, tslot]}` (cell may be place name). #
POST /v1/field_boundaries per-field agricultural-boundary polygons (Fields of The World, CC-BY-4.0) #
POST /v1/find_similar k-NN over band vectors #
GET /v1/fleet satellite/sensor lineage feeding each band #
GET /v1/forest GET /v1/forest?lat=&lon=, Hansen tree_cover_2000 + loss_year + ESA WorldCover class (signed). Also accepts ?place=… #
POST /v1/forest POST /v1/forest {place|lat,lng} #
GET /v1/functions function registry #
GET /v1/grid_info declare the active spatial grid (cell64 / Hilbert / future H3) #
GET /v1/guard/capabilities The emem-guard contract, machine-readable: every deny code and what it means, every remedy and what to do about it, the reason grammar, what the hosted route will and will not do, #
GET /v1/guard/selfhost The full self-host procedure for emem-guard as markdown, plus the exact build, test and run commands. Every step is a command and a check, written to be run unattended by an agent. #
POST /v1/guard/verdict Run emem-guard's policy pipeline over a transcript against this responder's corpus. Finds every emem: citation, resolves each against local storage, and answers allow or deny with #
GET /v1/harness/protocol The benchmark-harness contract, versioned. How an agent records a run in an EXTERNAL environment (ARC-AGI-3 and the like) as signed, chained memory notes, so a score is checkable b #
GET /v1/health liveness + corpus stats, the same handler as /health under the prefix every other endpoint uses. Aliased because a health check probing a /v1/* API guesses this path first, and a 4 #
POST /v1/heat_solve 2-D explicit-FD heat-equation solver (forecast LST N hours ahead from a 3×3 cell stencil) #
POST /v1/hunt hunter-mode event discovery: pick an event keyword (algal_bloom, deforestation, flood_extent, wildfire, urban_heat_island, methane_plume, landslide, drought, soil_salinity, crop_st #
GET /v1/inbox the same mailbox over a query string, for a client that would rather not POST to read. `to` is required and the 400 says so. #
POST /v1/inbox read-side mailbox: the notes addressed to an attester, newest first. Read-only; it does not accept mail, it reports what was written to the shared memory naming you. #
POST /v1/intent typed agent intent → execution plan. Body is a tagged Intent enum: pass `{type:"where_is",description:...}`, `{type:"what_is_here",cell:...|place:...}`, `{type:"is_like",a:...,b:.. #
GET /v1/intents The capability-to-intent registry: what agents need, phrased the way agents phrase it, mapped to capability, endpoint, tool and the way to check the call worked. Read before /opena #
POST /v1/jepa_predict constrained JEPA-pattern AR(2) seasonal NDVI predictor (closed-form coefficients, NOT a learned MLP) #
POST /v1/jepa_predict_v2 learned multi-band-scalar dynamics head: predicts the next-step value of 4 scalars (indices.ndvi, modis.lst_day_8day, modis.lst_night_8day, cams.pm25) from up to K=6 most-recent at #
GET /v1/limits The operational ceilings an agent would otherwise find by bisection: batch sizes, body caps, rate limits, timeouts. Split into enforced limits and advisory guidance, because confla #
GET /v1/locate resolve a place (or lat/lng) to a cell64 via query string, convenience wrapper around POST /v1/locate #
POST /v1/locate resolve a place name (or lat/lng) to a cell64 #
GET /v1/log/consistency transparency log: RFC 6962 consistency proof that the tree of size `first` is an append-only prefix of size `second` (defaults to the current tree size). Verify offline with transl #
GET /v1/log/entries transparency log: RFC 6962 §4.6 get-entries. Returns the raw attestations at global indices [start, end), as {leaf_index, attestation_cbor_b32, entry_hash_b32}. This is what makes #
GET /v1/log/inclusion transparency log: RFC 6962 inclusion (audit) proof that a log entry is committed under a tree head. Pass leaf_index= or entry_hash=; add tree_size=< #
GET /v1/log/sth transparency log: signed tree head (RFC 6962) over the append-only attestation log. {tree_size, root_b32, signed_at, responder_pubkey_b32, signature_b32}; ed25519 over PreimageV1(" #
POST /v1/log/witness transparency log: submit a witness ed25519 co-signature over a (tree_size, root) tree-head claim. The responder verifies the signature AND that the root matches its own history at #
GET /v1/log/witnesses transparency log: witness co-signatures recorded for the current signed tree head, independent parties that counter-signed (tree_size, root), so a client can detect split-view equi #
GET /v1/lst GET /v1/lst?lat=&lon=, MODIS LST day + night 8-day composite (signed). Also accepts ?place=… #
POST /v1/lst POST /v1/lst {place|lat,lng} #
GET /v1/manifests active manifest CIDs #
GET /v1/materializers per-band auto-fetch registry (which bands the responder will materialize on a recall miss) #
GET /v1/memory/sse Server-sent events: every memory write as it lands, so an agent can follow the shared ledger without polling. Long-lived stream; the response is text/event-stream, not JSON. #
POST /v1/memory_bundle Compose N (cell, band, tslot?) triples into ONE signed envelope. Each triple runs through the standard auto-materialize recall path; the resulting fact_cids are collapsed into a co #
GET /v1/memory_bundle/{token} Dereference a bundle token back to its signed envelope: the citations, the fact_cids, the cells, and the receipt. Accepts emem:bundle: (legacy memb: also accepted) or a #
GET /v1/memory_contradictions Same primitive as POST, exposed in query-string form for casual exploration. window_unix_s is split into window_lo + window_hi. #
POST /v1/memory_contradictions (algebra: competing evidence) Scan for (cell, band, tslot) triples where signed observations disagree. By default that means two or more DISTINCT attesters; pass include_same_attes #
GET /v1/memory_search/stats Snapshot of the memory-text index: indexed file count, dataset path, and freshness. Tells a caller whether a thin memory_search result means no match or an index that has not caugh #
POST /v1/memory_token compose an emem:fact:: citation handle. Pure composer; validates shape (non-empty inputs, no ':' contamination) and returns the token, the bare-place emem:cell: #
POST /v1/memory_token/resolve single round-trip dereference of a fact token. Accepts two anchors for the same fact: emem:fact:: (legacy memt: also accepted), and the self-describing emem:fact: #
POST /v1/memory_token/resolve_many batch dereference: up to 256 fact tokens in one call, resolved independently through the same pipeline as the single resolve. Partial by design: a bad or unheld token yields a type #
GET /v1/models Not an LLM provider. Returns a typed 404 pointing at /v1/algorithms, which is what a model catalog corresponds to on this surface. #
GET /v1/ndvi GET /v1/ndvi?lat=&lon=, Sentinel-2 NDVI at a point (signed). Also accepts ?place=… #
POST /v1/ndvi POST /v1/ndvi {place|lat,lng} #
POST /v1/neighborhood_consistency Spatial consistency/outlier of a cell vs its 8 immediate cell64 neighbours: consistency = (1/k) Σ cosine(centre, neighbour_i) over the 128-D GeoTessera embeddings, plus outlier_sco #
GET /v1/perception/{path} Ground-camera perception, fronted for peers that discover it. A GPU inference service with no auth of its own must not listen publicly, so reachability comes from this door, which #
POST /v1/perception/{path} POST half of the fronted perception surface: `at` with a body of {cell} runs detection and returns counts per object class, taken from a retained clip whose sha256 is committed in #
GET /v1/plane/conformance The fact plane's safety claim, MEASURED rather than asserted. Samples up to 400 real facts from this responder's own index on every call and reports three checks: no `value` contai #
POST /v1/query_region query region #
GET /v1/quickstart 6-step playbook #
POST /v1/raster/resolve dereference an emem:raster:::: token. Every claim in the token binds to the signed derivation record before anything dereferences (the fact-to #
POST /v1/raster_bundle bind 2..64 already-minted emem:raster: field tokens (band_raster / s2_median_composite / dem_raster / embedding_raster) into ONE signed manifest, named by an emem:rasterset: token #
POST /v1/raster_bundle/resolve dereference an emem:rasterset:: token. Fail-closed: the cid must be a raster_bundle@1 derivation, bundle_cid is recomputed from the record's ordered mem #
POST /v1/recall recall facts (algebra: ensure; reuses what exists, materializes what is missing) #
POST /v1/recall_many bulk recall over up to 256 cells per call Accepts budget_ms: the partial-results contract (docs/plans/partial-results.md), converged/pending[]/retry, monotone identical-request ret #
POST /v1/recall_polygon recall facts inside a GeoJSON polygon. Accepts budget_ms (docs/plans/partial-results.md): a soft materialization budget; on expiry the response is a first-class partial 200 with co #
POST /v1/region_archetype_map Cluster an area into archetypes in embedding space and return the map: which cells belong to which archetype, and how distinct each is. #
POST /v1/region_similarity How alike are two places? Mean-pool the 128-D GeoTessera embedding across each region's cells, then return cosine(centroid_a, centroid_b) in [-1,1]. CPU-fetched (no GPU). Each regi #
GET /v1/reviews list recent task-outcome reviews across all subjects, newest first. For one subject use /v1/reviews/{subject_id}. #
POST /v1/reviews submit task-outcome review keyed by subject. `subject_kind` must be one of: fact, cell, request_id, session, band, endpoint, other. `outcome` must be one of: success, partial, fail #
GET /v1/reviews/{subject_id} list reviews for a subject #
POST /v1/rice_ch4 IPCC-2019 Tier-2 rice-cultivation CH4 (Eq 5.1): integrates the daily emission factor over the cultivation period with water-regime (SFp/SFo) and optional Yan-2005 Q10 temperature s #
POST /v1/sar_forest_disturbance Sentinel-1 VV backscatter-drop forest-disturbance scout (cloud- and night-independent). Samples VV at a baseline-year July-1 anchor and the latest scene; vv_drop_db = baseline − re #
GET /v1/schema active CDDL/JSON schema bundle (REST mirror of emem_schema) #
GET /v1/schemas Every request and response body this responder publishes, by name, each with the URL that serves it as a standalone JSON Schema. Exists because a peer that PROXIES one of these rou #
GET /v1/schemas/eudr_dds.json JSON Schema for the EUDR Due Diligence Statement (Annex II + Article 2(28)), hand-translated from Regulation (EU) 2023/1115 with $comment fields citing the EUR-Lex paragraph each f #
GET /v1/schemas/{name} One body as a self-contained draft-2020-12 JSON Schema, every $ref resolved into $defs, carrying its own $id. The OpenAPI document already described these shapes, but an internal ` #
GET /v1/scoreboard The live benchmark: two heats run as a fairness control, reporting material correctness and byte-exactness separately. An arm can be materially perfect and never byte-exact, which #
GET /v1/soil GET /v1/soil?lat=&lon=, SoilGrids 2.0 0–30 cm topsoil pack (SOC, pH, clay, sand, BDOD, N) (signed). Also accepts ?place=… #
POST /v1/soil POST /v1/soil {place|lat,lng} #
GET /v1/sources source registry #
POST /v1/spi McKee-1993 Standardized Precipitation Index drought metric: fits a gamma to the same-window precipitation-accumulation history and standardizes the current accumulation to a z-scor #
POST /v1/state dense state vector for a cell or place. view=encoder (default, 128-D single foundation embedding) or view=cube (1792-D concatenated cube). Returns {cell, view, encoder, dim, vector #
GET /v1/state/{cid} The record an emem:state: address commits to, as stored, with its canonical CBOR and the address recomputed from those bytes beside the one asked for. Third step of the order a pee #
POST /v1/state_diff vintage delta of one cell between two tslots. Returns the per-element residual, its L2 norm (scalar change magnitude), the cosine between the two source vectors (orientation drift) #
POST /v1/state_multi fan-out across every wired foundation-embedding encoder (geotessera, clay_v1, prithvi_eo2, galileo). Returns per-encoder dense vectors plus a typed `missing[]` list for encoders un #
GET /v1/stream Server-Sent Events corpus stream. Emits a signed corpus.state event every `interval` seconds (default 15, clamped to [5,300]). Each tick carries a deterministic preimage and ed2551 #
GET /v1/substrates substrate profile registry: per contributor class, the admission rule (archive recomputability or complete OS execution trace) and the required trace layers; content-addressed by m #
GET /v1/temporal_route PDE-based band routing for a query time + intent (also accepts POST) #
POST /v1/temporal_route PDE-based band routing for a query time + intent (algebra: valid; cite_now vs fetch_for_intent) #
POST /v1/terrain DEM terrain triad over a 3×3 copdem30m.elevation_mean neighbourhood: Horn-1981 slope (deg), Riley-1999 ruggedness (TRI), Weiss-2001 topographic position (TPI). The 8 neighbour cell #
POST /v1/tessera_field Tessera foundation embedding as a field over an area rather than a point: the 128-D position-stable vector per cell, for similarity and change work that needs the neighbourhood. #
GET /v1/tools MCP tool descriptors with schemas #
GET /v1/topics topic-grouped band + algorithm registry (single source of truth shared with `/v1/locate`'s `data_at_this_cell` block) #
GET /v1/trace_encodings trace-encodings registry: recognized capture encodings a trace segment may name (linux.ftrace.v1, ros2.bag.v2, zephyr.ctf.v1, ...), the toolchain producing each, the layers it can #
POST /v1/trace_resolve resolve an OS-tracing token to its byte-identical signed record: emem:trace: returns the stored OsTrace, emem:attestation: returns the stored PlatformAttestation. Resolve #
POST /v1/trace_verify stateless verification of an emem.os_trace.v1 record against a substrate profile: schema, device identity, window, layer coverage, segment digest chain, merkle trace_root, emitted- #
POST /v1/trajectory time series #
POST /v1/triple_consensus clay_prithvi_tessera change-ensemble: cosine change across the two most-recent distinct vintages for Clay, Prithvi, and Tessera embeddings, voted against `consensus_threshold`. The #
GET /v1/vector_index/stats Snapshot of the vector index: row count, index type, last incremental append, and whether the index is disabled. Distinguishes an empty answer from an unopened index. #
GET /v1/verifier_spec Machine-readable specification of how this responder signs, emitted from the same compiled emem-attest tag constants the signer uses, so it cannot drift from the wire. Returns the #
POST /v1/verify verify a structured claim #
POST /v1/verify_receipt offline-verify any responder's receipt (algebra: verify): rebuild the canonical preimage under the rule the receipt's own `preimage_version` names and check ed25519 against the emb #
GET /v1/water GET /v1/water?lat=&lon=, JRC Global Surface Water recurrence + Sentinel-1 VV (signed). Also accepts ?place=… #
POST /v1/water POST /v1/water {place|lat,lng} #
POST /v1/wave_solve 1-D explicit-FD shallow-water wave-equation solver (propagate offshore swell to the coast along a bathymetric profile) #
GET /v1/weather GET /v1/weather?lat=&lon=, met.no nowcast (t2m + precip + wind + RH) (signed). Also accepts ?place=… #
POST /v1/weather POST /v1/weather {place|lat,lng} #
GET /v1/worlds baked 3-D gaussian splat worlds: per-preset counts, artifact sizes + sha256; artifacts at /v1/worlds/{preset}/{file} (world.ply, world.splat, world.scene.json, world.provenance.jso #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/emem-rest-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

emem-dev-openapi.json Raw ↑
{"components":{"schemas":{"AskReq":{"properties":{"cell":{"type":"string"},"include_image":{"default":false,"type":"boolean"},"lat":{"type":"number"},"lng":{"type":"number"},"model":{"description":"Optional. Compose an extra prose answer with a named model, returned as `model_answer` BESIDE the deterministic `answer` rather than instead of it. `answer` never calls a model, so every number in it traces to a fact_cid; `model_answer` carries provenance.class = model_output. Name by base_model (nvidia/Cosmos3-Edge), by family (cosmos3_edge, gemma), or by any fragment that picks out exactly one of them (cosmos). A fragment matching several is refused and names them; an unroutable name is refused with the routable list; a routable model whose service is not answering is refused as busy or down, never substituted.","type":"string"},"place":{"type":"string"},"q":{"type":"string"},"verbose":{"default":false,"description":"When false (default), trim per-algorithm formulas + per-fact band_metadata + long _explanation prose so the response fits MCP's 25 KB cap. The signed receipt stays intact in either mode.","type":"boolean"}},"required":["q"],"type":"object"},"AskResp":{"description":"Response of /v1/ask. Single envelope combining (a) place resolution, (b) topic-router classification, (c) recalled facts under those topics, (d) applicable algorithm recipes that compose those bands into named scores, (e) optional Sentinel-2 RGB thumbnail URL, and (f) caveats. All facts are signed and content-addressed.","properties":{"algorithms_for_question":{"items":{"properties":{"formula":{"type":"string"},"key":{"type":"string"},"topic":{"type":"string"}},"type":"object"},"type":"array"},"answer":{"description":"Short natural-language summary of what the responder found, synthesised deterministically from the structured fields (every cited value traces to a fact_cid in the receipt). On a cold cell whose bands are not yet materialized it states that plainly and points at `next_steps`; never an LLM call.","type":"string"},"answer_md":{"description":"Markdown variant of `answer`.","type":"string"},"caveats":{"items":{"type":"string"},"type":"array"},"facts":{"properties":{"bands_already_attested_at_cell":{"items":{"type":"string"},"type":"array"},"facts":{"items":{"$ref":"#/components/schemas/Fact"},"type":"array"}},"type":"object"},"foundation_embeddings":{"description":"Per-encoder neighbour lists and consensus voting. Populated when the intent matches `find places like` / `what changed`.","type":"object"},"materialize_notes":{"items":{"$ref":"#/components/schemas/MaterializeNote"},"type":"array"},"next_steps":{"description":"Present when the routed algorithms could not evaluate because their input bands are not materialized at this cell. Each item is a literal follow-up call (e.g. POST /v1/recall with the exact missing bands) the agent can issue, then re-ask.","items":{"properties":{"action":{"type":"string"},"body":{"type":"object"},"method":{"type":"string"},"path":{"type":"string"},"url":{"type":"string"},"why":{"type":"string"}},"type":"object"},"type":"array"},"place_resolved":{"$ref":"#/components/schemas/LocateResp"},"receipt":{"$ref":"#/components/schemas/Receipt"},"topic_routing":{"properties":{"matched_keywords":{"items":{"type":"object"},"type":"array"},"matched_topics":{"items":{"type":"string"},"type":"array"},"out_of_scope":{"type":"boolean"},"routing":{"type":"object"}},"type":"object"}},"required":["topic_routing","facts","receipt"],"type":"object"},"BackfillReq":{"properties":{"band":{"description":"band key to backfill, e.g. 'open_meteo.t2m'","type":"string"},"cell":{"description":"cell64 string (or place name; resolved through the same geocoder as /v1/locate)","type":"string"},"end_unix":{"description":"Unix epoch seconds (UTC) for window end. Default: now.","type":"integer"},"max_facts":{"default":16,"description":"Cap on facts materialized in one call. Default 16, fits inside a 60s tool-call window for any LLM host. Raise for explicit wide backfills (cap 1024).","maximum":1024,"minimum":1,"type":"integer"},"refresh":{"default":false,"description":"Force re-materialization even where a fact already exists, superseding it (the old fact stays resolvable by cid and as_of_signed_at). Use to pick up a materializer change on already-warmed cells, e.g. re-running foundation-model embedding enrichment after the per-pixel-SCL chip selection landed.","type":"boolean"},"start_unix":{"description":"Unix epoch seconds (UTC) for window start. Default: 30 days ago for fast bands, 365 days ago for slow.","type":"integer"}},"required":["cell","band"],"type":"object"},"BoringPostReq":{"description":"Body for POST /v1/{ndvi,air,lst,soil,water,forest,weather,at,elevation}. Supply `place` (free-text geocoded via /v1/locate) OR `lat`+`lng` (or `lon`); /v1/at and /v1/elevation also accept optional `band`/`bands`/`tslot` and `cell64` respectively. When `place` resolves to an OSM feature with extent (airport, park, lake, region) the response includes a `polygon` block + per-band `stats` (mean/median/min/max/std for numeric bands, mode + class distribution for categorical bands like esa_worldcover.lc_2021); pass `n_cells: 1` to force point behaviour at the centroid instead. Single-band endpoints default to 16 sample cells when polygon detected; /v1/at defaults to 1 (multi-band × multi-cell explodes upstream fetch count). Use POST /v1/recall_polygon for raw per-cell facts.","properties":{"band":{"description":"Single band key (used by /v1/at).","type":"string"},"bands":{"description":"CSV of band keys (used by /v1/at).","type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"lon":{"description":"Alias for `lng`.","type":"number"},"n_cells":{"description":"Polygon-aggregation knob. When `place` resolves to a feature with extent and `n_cells` is unset, single-band endpoints fan out to 16 sample cells; /v1/at defaults to 1. `n_cells: 1` forces point behaviour at the centroid; values in 2..=64 are honoured. Anything else returns 400, heavy queries belong on POST /v1/recall_polygon.","maximum":64,"minimum":1,"type":"integer"},"name":{"description":"Alias for `place`.","type":"string"},"place":{"description":"Free-text place name; resolved via embedded gazetteer → cache → Photon → Nominatim.","type":"string"},"q":{"description":"Alias for `place`.","type":"string"},"query":{"description":"Alias for `place`.","type":"string"},"tslot":{"type":"integer"}},"type":"object"},"Cell64":{"description":"cell64 wire form: four base-65,536 bigrams separated by dots, e.g. `defi.zb4d9.pefa.zf619`. Encoded resolution is ~9.55 m at the equator. Each bigram is either a CVCV quad, consonant `[bcdfghjklmnpqrstvwxyz]` followed by vowel `[aeiouAEIOU]` repeated twice, OR a synthetic 5-char `z[0-9a-f]{4}` slot used for the unused pad cells in the 65,536-entry alphabet. The regex pin matches `pattern` below byte-for-byte and is also surfaced under `Cell64Pattern` so agents can validate before sending.","example":"defi.zb4d9.pefa.zf619","maxLength":23,"minLength":19,"pattern":"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$","type":"string"},"Cell64Pattern":{"description":"Reference copy of the cell64 regex for tooling that wants the pattern without round-tripping through Cell64. Same string as Cell64.pattern.","example":"^(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})(?:\\.(?:(?:[bcdfghjklmnpqrstvwxyz][aeiouAEIOU]){2}|z[0-9a-f]{4})){3}$","type":"string"},"Claim":{"properties":{"agg":{"description":"Aggregation over `window`","enum":["any","all","mean","min","max"],"type":"string"},"band":{"description":"Band key (e.g. `indices.ndvi`, `copdem30m.elevation_mean`)","type":"string"},"op":{"description":"Comparison or membership operator","enum":["eq","ne","lt","le","gt","ge","in","ni","exists","absent"],"type":"string"},"tslot":{"description":"Specific tslot; one of `tslot` or `window` MUST be set","type":"integer"},"value":{"description":"Right-hand value, band-typed (number for scalar bands, array for vector bands, set for in/ni). Required even for exists/absent where it is ignored."},"window":{"description":"Inclusive [start, end] u64 Unix-epoch range","items":{"type":"integer"},"maxItems":2,"minItems":2,"type":"array"}},"required":["band","op","value"],"type":"object"},"CompareBandsReq":{"description":"Body for POST /v1/compare_bands. Compares two bands at the same cell. Returns scalar delta + percent change for scalar pairs, cosine + L2 for vector pairs. The vector arm requires `a == b` with different tslots (one band across two vintages), because no two bands share a vector space: `clay_v1` and `prithvi_eo2` are both 384-D but encode different chips at different receptive fields, so a cosine between them is meaningless and is refused with a 400 rather than served. Optional `predicate` folds a consistency check (e.g. \"DEM and GMRT agree within 200 m\") into a signed verdict.","properties":{"a":{"description":"Band A key, e.g. 'copdem30m.elevation_mean'. For a vector cosine this must equal `b` (same band, two tslots).","type":"string"},"b":{"description":"Band B key, e.g. 'gmrt.elevation_mean'. For a vector cosine this must equal `a`.","type":"string"},"cell":{"description":"cell64 string. `cell64` accepted as alias.","type":"string"},"predicate":{"description":"Optional consistency predicate. Tagged enum: {kind: 'abs_diff_le'|'abs_diff_lt'|'cosine_ge'|'cosine_gt'|'l2_distance_le', threshold: number}.","properties":{"kind":{"enum":["abs_diff_le","abs_diff_lt","cosine_ge","cosine_gt","l2_distance_le"],"type":"string"},"threshold":{"type":"number"}},"required":["kind","threshold"],"type":"object"},"tslot_a":{"description":"Optional tslot pin for band A. When omitted, the responder picks the latest tslot with an attested fact for band A at this cell.","type":"integer"},"tslot_b":{"description":"Optional tslot pin for band B. Same semantics as `tslot_a`.","type":"integer"}},"required":["cell","a","b"],"type":"object"},"CompareBandsResp":{"description":"Response of /v1/compare_bands. Numeric delta + percent change for scalar pairs; cosine + L2 for vector pairs. `predicate_verdict` is present when a consistency predicate was passed.","properties":{"cosine":{"type":"number"},"delta":{"type":"number"},"l2":{"type":"number"},"percent_change":{"type":"number"},"predicate_verdict":{"properties":{"holds":{"type":"boolean"},"kind":{"type":"string"},"threshold":{"type":"number"}},"type":"object"},"receipt":{"$ref":"#/components/schemas/Receipt"}},"required":["delta","receipt"],"type":"object"},"CompareReq":{"properties":{"a":{"type":"string"},"b":{"type":"string"},"family":{"type":"string"}},"required":["a","b"],"type":"object"},"CompareResp":{"description":"Response of /v1/compare. Single cosine similarity score (vector bands) or scalar delta (scalar bands) plus per-band breakdown.","properties":{"deltas":{"additionalProperties":{"type":"number"},"description":"Per-band scalar delta for scalar comparisons; absent for vector cosine.","type":"object"},"receipt":{"$ref":"#/components/schemas/Receipt"},"score":{"type":"number"}},"required":["score","receipt"],"type":"object"},"Cost":{"description":"Self-declared cost block on every receipt. Honest accounting: latencies are observed, freshness is the age of the stalest source cited (null when undatable, never 0 as a stand-in), `was_cached` is true when the hot cache served the read.","properties":{"credits":{"description":"Conceptual cost units; 0 for L0/L1 read endpoints on the hosted responder.","type":"number"},"latency_p50_ms":{"type":"number"},"latency_p99_ms":{"type":"number"},"source_freshness_s":{"description":"Age of the STALEST source this response cites: now minus the earliest captured_at across the returned facts' sources. null when nothing in the response carries a dated source, which is the honest answer for a primitive that reads no observation. Was a hardcoded 0 until 2026-08-05, so a 2021 DEM tile reported as 0 s old; a null here means unknown, never fresh.","type":["integer","null"]},"was_cached":{"type":"boolean"}},"type":"object"},"DiffReq":{"properties":{"band":{"type":"string"},"cell":{"type":"string"},"tslot_a":{"type":"integer"},"tslot_b":{"type":"integer"}},"required":["cell","band","tslot_a","tslot_b"],"type":"object"},"ElevationPostReq":{"description":"Body for POST /v1/elevation. Supply `place` OR `lat`+`lng` (`lon` accepted as an alias) OR `cell64`. Deliberately NOT BoringPostReq: this route reads a narrower type and hardcodes band / bands / tslot / n_cells to None, so those four knobs are not offered here.","properties":{"cell":{"description":"Alias for `cell64`.","type":"string"},"cell64":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"lon":{"description":"Alias for `lng`.","type":"number"},"name":{"description":"Alias for `place`.","type":"string"},"place":{"type":"string"},"q":{"description":"Alias for `place`.","type":"string"},"query":{"description":"Alias for `place`.","type":"string"}},"type":"object"},"Error":{"properties":{"code":{"example":"invalid_argument","type":"string"},"details":{"type":"object"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"ErrorEnvelope":{"description":"The `emem.error.v1` failure envelope returned by every endpoint on a 4xx/5xx. Branch on the stable `code` (not the human `message`). See GET /v1/errors for the full code catalog.","properties":{"code":{"description":"Stable machine-readable error code. One of the codes in GET /v1/errors.","example":"invalid_argument","type":"string"},"details":{"description":"Optional structured recovery hints; present on errors that ship machine-readable next-steps.","type":"object"},"message":{"description":"Human-readable detail. For invalid_argument this names the offending field (e.g. \"missing field `q`\").","type":"string"},"path":{"description":"Request path that produced the error.","example":"/v1/ask","type":"string"},"schema":{"const":"emem.error.v1","type":"string"}},"required":["code","message","schema"],"type":"object"},"EudrDdsReq":{"description":"POST /v1/eudr_dds body, produces a signed Annex II-shaped Due Diligence Statement per Regulation (EU) 2023/1115. Pair every plot with its operator-supplied geometry (GeoJSON Polygon for >4 ha, Point for ≤4 ha non-cattle per Article 2(28)), country of production (ISO3), Combined Nomenclature code (HS-6+), and quantity in kg. The endpoint runs eudr_compliance@1 per cell (JRC GFC2020 V3 legal baseline + Hansen GFC v1.12 post-cut-off loss-year consensus; JRC GFC2020 is read as 10° COG tiles for fast cold reads across all geographies). JRC TMF v2025, WRI-Sims driver attribution and RADD SAR are deferred off the hot path for latency (TMF) / pending fast public endpoints (WRI, RADD). Applies the Article 2(4) 0.5 ha MMU floor at plot aggregation, validates `commodity_hs` against Annex I, and emits the structured envelope. The response carries an explicit `legality_disclaimer` because Article 9(1)(b) legality verification (land tenure, FPIC, country-of-origin law compliance) is structurally out of Earth-observation scope. Response includes an ed25519-signed `receipt` over the union of every per-cell fact_cid; verifiable offline at `/verify` (or `/v1/verify_receipt`). Pass an optional `scope` block (`{user_id, agent_id, run_id, org_id}`) to bind the receipt to a tenant.","properties":{"cut_off_date":{"default":"2020-12-31","description":"EUDR cut-off date (ISO 8601). The regulation's value is 2020-12-31.","type":"string"},"forest_baseline_override":{"description":"Optional baseline override: 'jrc_gfc2020_v3' (default), 'hansen_only', or 'both' (consensus).","type":"string"},"legality_module":{"description":"Operator-chosen legality provider. Default 'none' surfaces the explicit Article 9(1)(b) out-of-scope disclaimer.","type":"string"},"max_cells_per_plot":{"description":"Sample budget per POLYGON plot. Omit and it is auto-derived from the polygon area (~110 cells/ha, clamped to 51,200); there is no fixed default to declare, which is why this carries none. POINT plots evaluate at 1 cell regardless of this value.","maximum":51200,"minimum":1,"type":"integer"},"operator":{"description":"Operator identification per Annex II §1.","properties":{"address":{"type":"string"},"eori":{"type":"string"},"name":{"type":"string"}},"type":"object"},"plots":{"description":"One or more plots to evaluate.","items":{"properties":{"commodity_hs":{"description":"Combined Nomenclature code (HS-6+). First 4 digits detect cattle (0102/0201/0202) for the Article 2(28) cattle exemption.","type":"string"},"commodity_name":{"description":"Optional plain-English commodity name.","type":"string"},"country_of_production":{"description":"ISO 3166-1 alpha-3 (e.g. BRA, IDN, CIV).","type":"string"},"geometry_geojson":{"description":"GeoJSON Polygon (preferred) OR Point (for ≤4 ha non-cattle) OR a bare {bbox:[minlng,minlat,maxlng,maxlat]}.","oneOf":[{"properties":{"coordinates":{},"type":{"enum":["Polygon","Point"],"type":"string"}},"required":["type","coordinates"],"type":"object"},{"properties":{"bbox":{"items":{"type":"number"},"maxItems":4,"minItems":4,"type":"array"}},"required":["bbox"],"type":"object"}]},"plot_id":{"description":"Operator-supplied identifier; preserved verbatim in the response.","type":"string"},"quantity_kg":{"description":"Net mass in kilograms (Annex II §3).","type":"number"},"request_visual_evidence":{"default":false,"description":"Opt-in: build a per-year visual deforestation-evidence block for this plot. Adds a `visual_evidence` field to the per-plot result containing a Sentinel-2 NDVI annual timeline from 2020..current_year + Sentinel-1 RTC VV-backscatter cloud-independent confirmation + per-cell scene.png URLs the agent can render as a 6-up year-by-year grid. Adds upstream Sentinel fan-out per plot; the EUDR budget auto-bumps to 60s + 110s × n_visual_plots (capped at 480s, deliberately under the ~300s client/edge cut for 1–2 plots) when this flag is set on any plot. Visual-evidence concurrency is bounded (EMEM_EUDR_VISUAL_CONCURRENCY) and the route is capped (EMEM_EUDR_MAX_INFLIGHT) so a visual-evidence burst can't starve the server. The block carries its own `verdict` (`no_visual_deforestation` / `visual_deforestation_suspected` / `indeterminate_no_baseline`) computed from NDVI drop ≥ EMEM_VISUAL_NDVI_DROP_THRESHOLD (default 0.15 vs 2020, Pelletier 2024) and S1 VV drop ≥ EMEM_VISUAL_S1_DROP_DB_THRESHOLD (default 3 dB, Reiche 2018). All underlying facts are signed Primary records under the responder's identity; auditors cite ndvi_fact_cids + s1_fact_cids.","type":"boolean"},"supplier":{"description":"Optional supplier identifier.","type":"string"}},"required":["plot_id","geometry_geojson","country_of_production","commodity_hs","quantity_kg"],"type":"object"},"minItems":1,"type":"array"}},"required":["plots"],"type":"object"},"Fact":{"description":"A primary attestation at (cell, band, tslot). `value` is the band's typed reading (number, array of numbers for vector bands, or a categorical class id). `unit` is the band's declared unit (e.g. `m_msl`, `degC`, `mm`).","properties":{"absence_reason":{"description":"Present only when kind=`absence`.","enum":["unavailable_capability","outside_coverage","archetype_seed_unavailable","gpu_unavailable","upstream_error","upstream_timeout"],"type":"string"},"band":{"type":"string"},"cell":{"$ref":"#/components/schemas/Cell64"},"fact_cid":{"$ref":"#/components/schemas/FactCid"},"kind":{"description":"`primary` = signed measurement; `absence` = signed \"we don't have this here\" with a typed reason.","enum":["primary","absence"],"type":"string"},"provenance":{"description":"Upstream source key (e.g. `copdem30m`, `s2_l2a`, `cams_eu`).","type":"string"},"receipt":{"$ref":"#/components/schemas/Receipt"},"tslot":{"$ref":"#/components/schemas/Tslot"},"unit":{"type":"string"},"value":{"description":"Number, array of numbers, or class id depending on band type."}},"required":["kind","cell","band","tslot","value","fact_cid","receipt"],"type":"object"},"FactCid":{"description":"Content id of a fact: base32-nopad-lowercase encoding of `blake3(canonical_cbor(fact))`, the FULL 32-byte digest with no truncation. Always 52 characters, alphabet `[a-z2-7]`. A cid of any other length is a damaged citation, not a shorter address: /v1/memory_token/resolve rejects it as `fact_cid_malformed_length` rather than guessing. Note that `entity_cid` and `bundle_cid` are NOT this shape; both truncate to 16 bytes (26 characters) and hash an identity anchor or a citation list rather than a complete body.","example":"qtv2bco56qw4pmlohk56dotoxyl3atmnjpmzrijj2kazw2mj57oq","maxLength":52,"minLength":52,"pattern":"^[a-z2-7]{52}$","type":"string"},"FetchReq":{"description":"Body for POST /v1/fetch. Either `cid` (resolve a fact by content-address) OR `cell`+`band` (materialize / read-through that band at that cell, optionally pinned to `tslot`). `cell` may be a cell64 string or a free-text place name resolved through /v1/locate.","properties":{"band":{"description":"Band key (required when `cell` is given).","type":"string"},"cell":{"description":"cell64 or place name.","type":"string"},"cid":{"description":"emem fact CID (blake3 base32-nopad lowercase).","type":"string"},"tslot":{"description":"Optional tslot pin; defaults to canonical.","type":"integer"}},"type":"object"},"FieldBoundariesResp":{"description":"Response of /v1/field_boundaries. `fields` is an array of per-field GeoJSON-Polygon features from Fields of The World (CC-BY-4.0). `attribution` and `license` must be surfaced with any rendered map.","properties":{"attribution":{"example":"Fields of The World / Taylor Geospatial Institute","type":"string"},"fields":{"items":{"properties":{"area_ha":{"type":"number"},"confidence":{"type":"number"},"country":{"type":"string"},"geometry":{"description":"GeoJSON Polygon.","type":"object"}},"type":"object"},"type":"array"},"license":{"example":"CC-BY-4.0","type":"string"},"receipt":{"$ref":"#/components/schemas/Receipt"}},"required":["fields","license","attribution"],"type":"object"},"FindSimilarReq":{"properties":{"band":{"default":"geotessera","description":"Vector band to scan. Default geotessera (128-D, int8+scale upstream → decoded f32 over the wire). Pass `geotessera.bin128` (or any band's `.bin128` sibling, plus `mode:\"hamming\"`) for the binary fast path.","type":"string"},"k":{"default":10,"maximum":1000,"minimum":1,"type":"integer"},"key":{"description":"cell64 (look up that cell's vector) or 'inline:[x,y,...]' literal vector","type":"string"},"mode":{"default":"cosine","description":"Scoring mode. `cosine` (default) is fp32 over the full vector. `hamming` is sign-bit popcount over the binary sibling band, ~1000× faster scan, ~65% recall@10 alone. `hamming_then_rerank` triages with Hamming then re-ranks the top 4·k by cosine, matches cosine precision at ~16× less work.","enum":["cosine","hamming","hamming_then_rerank"],"type":"string"}},"required":["key"],"type":"object"},"FindSimilarResp":{"description":"Response of /v1/find_similar. `neighbors` is the top-k list ordered by similarity (descending). `mode` echoes the scoring choice (`cosine` / `hamming` / `hamming_then_rerank`).","properties":{"band":{"type":"string"},"mode":{"enum":["cosine","hamming","hamming_then_rerank"],"type":"string"},"neighbors":{"items":{"description":"Stable neighbor schema: cell/score/lat/lng/place_label_cached are always present. lat/lng are explicit null for inline-vector queries or undecodable cells (no honest centroid), never absent, never fabricated.","properties":{"cell":{"$ref":"#/components/schemas/Cell64"},"fact_cid":{"$ref":"#/components/schemas/FactCid"},"label":{"description":"Reader-friendly place label, if the cell is named in the gazetteer.","type":"string"},"lat":{"description":"Centroid latitude decoded from `cell`; null when the cell has no honest centroid (inline vector / undecodable).","type":["number","null"]},"lng":{"description":"Centroid longitude decoded from `cell`; null when unknown (see `lat`).","type":["number","null"]},"place_label_cached":{"description":"Best-effort gazetteer label (~25 km gate); null when the cell isn't near a known anchor.","type":["string","null"]},"score":{"description":"Cosine similarity in [-1, 1] for `cosine` / `hamming_then_rerank`; normalised Hamming agreement in [0, 1] for `hamming`.","type":"number"}},"required":["cell","score","lat","lng"],"type":"object"},"type":"array"},"receipt":{"$ref":"#/components/schemas/Receipt"}},"required":["neighbors","receipt"],"type":"object"},"HeatSolveReq":{"properties":{"cell":{"description":"cell64 string. The solver evaluates LST evolution at this cell's centre.","type":"string"},"diffusivity_m2_per_s":{"default":1e-6,"description":"Thermal diffusivity α (m²/s). Default 1e-6 matches urban surfaces (Oke 2017 §2.3 Table 2.4); use ~5e-7 for vegetation, ~1.4e-7 for water.","type":"number"},"hours_ahead":{"default":6,"description":"Forecast horizon in hours. Capped at 168 (one week).","type":"number"}},"required":["cell"],"type":"object"},"HuntReq":{"description":"Hunter-mode body. Either `region` (geocoded) or `polygon_bbox` (explicit). The responder samples up to 32 cells (8 for slow primary bands such as MODIS LST), recalls the algorithm's primary scalar input plus any configured gate band, optionally re-ranks the top-K via Tessera embedding coherence, and returns the top 8 hotspots.","properties":{"event":{"description":"Event keyword. Maps to one registered detection algorithm. Aliases accepted (case-insensitive): bloom/algae_bloom/chlorophyll_bloom → algal_bloom; forest_loss/tree_loss → deforestation; flood/inundation/flooded_fields → flood_extent; fire/bushfire/burn_severity → wildfire; uhi/heat_island/heat → urban_heat_island; methane/ghg_leak/super_emitter → methane_plume; mudslide/debris_flow/slope_failure → landslide; dry_spell/rainfall_deficit → drought; salinity → soil_salinity; crop_damage/stressed_crops → crop_stress; turbidity/sediment_plume → water_turbidity; oil_spill → oil_slick. The classifier in /v1/ask accepts the same set on free-text input.","enum":["algal_bloom","deforestation","flood_extent","wildfire","urban_heat_island","methane_plume","landslide","drought","soil_salinity","crop_stress","water_turbidity","oil_slick"],"type":"string"},"polygon_bbox":{"description":"Explicit polygon bbox; alternative to `region`.","properties":{"max_lat":{"type":"number"},"max_lng":{"type":"number"},"min_lat":{"type":"number"},"min_lng":{"type":"number"}},"type":"object"},"region":{"description":"Free-text region. Resolved through the same geocoder as /v1/locate. REQUIRED unless `polygon_bbox` is provided.","type":"string"}},"required":["event"],"type":"object"},"JepaPredictReq":{"properties":{"band":{"default":"indices.ndvi","description":"Band to forecast. v1 supports 'indices.ndvi' only.","type":"string"},"cell":{"description":"cell64 to forecast at.","type":"string"},"forecast_horizon_months":{"default":1,"description":"Horizon in months ahead. v1 supports 1; multi-step rollout lands in @2.","maximum":1,"minimum":1,"type":"integer"},"lookback_months":{"default":6,"description":"How many past months of history to read.","maximum":24,"minimum":1,"type":"integer"}},"required":["cell"],"type":"object"},"LocateReq":{"description":"Body for POST /v1/locate. Provide `place` (free-text, geocoded via embedded gazetteer → cache → Photon → Nominatim) OR `lat`+`lng`. Mutually exclusive: at least one of (`place`/`q`/`query`/`name`) or (`lat`+`lng`) must be present.","oneOf":[{"required":["place"]},{"required":["q"]},{"required":["query"]},{"required":["name"]},{"required":["lat","lng"]}],"properties":{"lat":{"description":"WGS-84 latitude. REQUIRED with `lng` unless `place` is provided.","type":"number"},"lng":{"description":"WGS-84 longitude. REQUIRED with `lat` unless `place` is provided.","type":"number"},"name":{"description":"Alias for `place`.","type":"string"},"place":{"description":"Free-text place name. Resolved via embedded gazetteer → cache → Photon → Nominatim.","type":"string"},"q":{"description":"Alias for `place`.","type":"string"},"query":{"description":"Alias for `place`.","type":"string"}},"type":"object"},"LocateResp":{"description":"Response of /v1/locate. `cell64` is the canonical handle for the resolved place; `polygon_bbox` is present when the geocoder found an extent (city / park / lake / country / region), absent for point features. `via` declares which layer of the seven-tier embedded cascade answered, falling back to network (Photon → Nominatim) only when no embedded layer matched.","properties":{"cell64":{"$ref":"#/components/schemas/Cell64"},"data_at_this_cell":{"description":"Topic-grouped inventory of recallable bands and applicable algorithms at this cell. Lets the caller chain into /v1/recall without a second introspection round-trip.","type":"object"},"label":{"description":"Reader-friendly place label.","type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"localized_names":{"additionalProperties":{"type":"string"},"description":"Map of ISO 639 language tag (`en`, `bn`, `zh-Hans`, `ar`, …) to localized name, when the resolved entity is in Overture and carries `names.common`. Lets an agent surface the user's-language label without a second geocoder call.","type":"object"},"neighborhood_cells":{"description":"Eight neighbouring cell64s of the resolved centre cell.","items":{"$ref":"#/components/schemas/Cell64"},"type":"array"},"overture_division":{"description":"Overture-divisions provenance, present when the cascade pulled an authoritative admin polygon. `division_id` is the GERS ID (globally stable, citable in receipts). `subtype` declares the admin level (country/region/county/locality/etc). `country` is the ISO 3166-1 alpha-2 owner.","properties":{"country":{"description":"ISO 3166-1 alpha-2 (e.g. `BD`, `US`).","type":"string"},"division_id":{"type":"string"},"schema_url":{"type":"string"},"subtype":{"enum":["country","region","county","localadmin","locality","borough","macrohood","neighborhood","microhood","dependency"],"type":"string"}},"type":"object"},"polygon_bbox":{"description":"Present when the place has spatial extent.","properties":{"max_lat":{"type":"number"},"max_lng":{"type":"number"},"min_lat":{"type":"number"},"min_lng":{"type":"number"},"source":{"description":"`overture_division_area` is authoritative (conflated OSM+Esri+Meta+TomTom polygon), preferred whenever Overture has a row for the entity. `country_table` / `admin1_table` / `admin2_table` / `admin3_table` are cities1000-aggregated approximations used when Overture is unreachable. `wide_bbox_table` is the curated wide-feature override for Sahara/Amazon/Himalayas etc.","enum":["wide_bbox_table","country_table","admin1_table","admin2_table","admin3_table","nominatim_boundingbox","overture_division_area","centre_cell_bbox"],"type":"string"}},"type":"object"},"polygon_geojson":{"description":"True OSM/Overture boundary as GeoJSON `Polygon` or `MultiPolygon` when an admin tier resolved. Pass back to /v1/recall_polygon to mask the cell grid against the boundary.","type":"object"},"polygon_sample_cells":{"description":"Up to 64 representative cells covering the polygon, pass to /v1/recall_many or /v1/recall_polygon.","items":{"$ref":"#/components/schemas/Cell64"},"type":"array"},"via":{"description":"Layer of the seven-tier locate cascade that answered. `country`/`admin1`/`admin2`/`admin3` = GeoNames hierarchical-admin tables (in-process); `embedded` = cities1000 populated places (in-process); `pois` = curated GeoNames well-known landmarks (peaks/lakes/parks/airports/monuments, in-process); `wide_bbox_table` = curated wide regions (in-process); `cache` = sled hot cache; `photon`/`nominatim` = network fallback.","enum":["direct_latlng","wide_bbox_table","country","admin1","admin2","admin3","embedded","pois","cache","photon","nominatim"],"type":"string"}},"required":["cell64","via"],"type":"object"},"MaterializeNote":{"description":"One entry in the response's `materialize_notes[]`, recording what the lazy materializer did during this call. status:\"materialized\" means a signed fact was minted and persisted (a Primary observation OR a confirmed, evidence-backed Absence - both are signed and citeable by fact_cid). status:\"skipped\" means nothing was signed: `reason_class` says why (transient `timeout`/`upstream_error`, retryable; or structural `unknown_band`/`no_materializer`/`capability_unavailable`, not retryable here) and `absence` is always false, because a skip is 'unknown', never a confirmed absence.","p

# --- truncated at 32 KB (350 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/emem-dev/refs/heads/main/openapi/emem-dev-openapi.json