Skip to main content
REST errors contain a stable machine-readable error string, with optional message and validation issues. Never parse human-readable message text to decide what to do. Coverage resolution returns 200 even when available is false. Its reason is one of coverage_unavailable, request_too_large, no_cell_centers, or unsupported_grid, and acquisitionEnabled says whether /api/v1/data/requests can acquire the miss. No result is silently truncated to make the query succeed. An acquisition that fails is reported by GET /api/v1/data/requests/{id} with status: "failed" and error.reason. Submitting the same request again within 15 minutes returns that failure; after that it starts a new acquisition. Reads and direct queries have no purchase side effects. Retry transient failures with exponential backoff and a bounded retry count. Future payment retries will require durable idempotency and reconciliation; they must not automatically re-charge an ambiguous settlement. The /api/v1 path defines the major version. Clients should accept additive response fields and inspect capabilities for new operations. Removing or changing the meaning of a documented field requires a new major contract. Stable published dataset IDs can be pinned across API calls. The specification’s info.version identifies the contract release. MCP tools return structured JSON and mark failures with isError. Tool descriptions and input schemas use the same contract as REST. They never expose infrastructure credentials or raw database error details.