SoilPoint · API reference soilpoint.dev
← SoilPoint

API reference

Base URL: https://soilpoint.dev · Free · US coverage only · No key required to start

View as Markdown Open in Claude

Endpoint

GET /v1/soil

ParameterTypeRequiredDescription
latnumberyesLatitude in WGS84 decimal degrees (−90 to 90)
lonnumberyesLongitude in WGS84 decimal degrees (−180 to 180)

Keyless example:

curl "https://soilpoint.dev/v1/soil?lat=37.368402&lon=-121.771"

Use with AI agents

SoilPoint also runs a remote MCP server at https://soilpoint.dev/v1/mcp. It has one tool, get_soil(lat, lon), which returns the same JSON as /v1/soil. No key, nothing to install, same rate limits.

Claude Code:

claude mcp add --transport http soilpoint https://soilpoint.dev/v1/mcp

Codex:

codex mcp add soilpoint --url https://soilpoint.dev/v1/mcp

Cursor, VS Code and other clients that take a JSON config:

{"mcpServers": {"soilpoint": {"url": "https://soilpoint.dev/v1/mcp"}}}

In the Claude app, add it as a custom connector with the same URL.

Every page of these docs is also plain Markdown: add .md to the URL, as in /docs.md. /llms.txt lists them, and /openapi.json describes the REST endpoint.

API keys & rate limits

Keys are optional. Without one you share an IP-based bucket; with one you get a dedicated, higher-limit bucket. Keys don't expire. A revoked or mistyped key gets 401 INVALID_API_KEY.

How to get a key: on the homepage, look up any coordinate, then click "Get my key" in the panel that appears.

Send your key in the x-api-key request header:

curl -H "x-api-key: sp_live_..." "https://soilpoint.dev/v1/soil?lat=42.024&lon=-93.648"
TierPer minutePer day
Keyless (per IP)60 req1,000 req
Keyed (per key)300 req20,000 req

Over the limit → 429 with {"error":{"code":"RATE_LIMITED",...}} and a Retry-After header with the seconds to wait.

Response fields

All fields are present in every 200 response. Fields marked nullable return null for Miscellaneous land areas (urban land, water bodies, pits) where soil properties are undefined by design.

FieldTypeNullableDescription
latnumberEchoed latitude from your request
lonnumberEchoed longitude from your request
mukeystringSSURGO map unit key for this point
mapUnitNamestringHuman-readable map unit name (e.g. "Diablo clay, 9 to 15 percent slopes")
soilSeriesstringyesSoil series name of the dominant component
componentKindstringComponent kind: "Series" for named soils, "Miscellaneous area" for urban land, water and the like
componentPctnumberPercentage of the map unit this dominant component occupies (0–100)
texturestringyesUSDA textural class of the dominant surface horizon, as SSURGO spells it (e.g. "Clay", "Sandy loam")
drainageClassstringyesUSDA drainage class, as SSURGO spells it (e.g. "Well drained", "Somewhat poorly drained")
hydrologicGroupstringyesNRCS hydrologic soil group: A, B, C, D, or dual (e.g. "B/D")
awcnumberyesAvailable water capacity (cm/cm fraction), depth-weighted over 0–30 cm
phnumberyespH (1:1 water method), depth-weighted over 0–30 cm
organicMatternumberyesOrganic matter (% by weight), depth-weighted over 0–30 cm
nccpinumberyesNational Commodity Crop Productivity Index (0–1). Often null for non-cropland.
nccpiClassstringyesNCCPI class as SSURGO rates it (e.g. "High inherent productivity", "Not rated")
depthWindowCmarrayDepth range used for weighted averages, as [min, max]. Default [0, 30].
dataVintagestringyesSSURGO survey version date for this area (ISO 8601 date string)
stalebooleanReserved for answers served from cache during a USDA outage. The current in-memory cache never sets it, so it is always false; use cachedAt for the answer's age.
cachedAtstringyesISO 8601 timestamp of when SoilPoint fetched this answer from USDA
dataSourcestringData source: "USDA-NRCS SSURGO via Soil Data Access"
surveyDisclaimerstringUsage disclaimer: as-is, US only, not for regulatory use

Errors

All errors return a JSON envelope: {"error":{"code":"...","message":"..."}}

CodeHTTPMeaning
INVALID400Missing or out-of-range lat or lon parameter
NO_SOIL_DATA404Point is in the ocean, outside US coverage, or in a gap in the survey
RATE_LIMITED429Rate limit exceeded. The Retry-After header says how long to wait
INVALID_API_KEY401The x-api-key header doesn't match an active key
SDA_UPSTREAM_ERROR502USDA Soil Data Access failed, timed out or returned something unexpected, and this point isn't cached

Limits

← Back to SoilPoint  ·  Blog