The DTN Land Crop API has exactly one operation, GET /api/v1/land/{landId}/crop, and it returns the planting history of a single land parcel. That is a small surface. What makes it worth reading is that the contract states the price of every call: 1 credit per crop-year record returned, with the bill reported back to you in response headers.
DTN scores 50.9 on the Kin Score (developing) and 32.0 on Agent Readiness (agent-ready). Its catalog page lists 99 API entries, and this one belongs to a family: the contract’s own title is “DTN Farm Intelligence Land Crop API”, and its description places it inside a Farm Intelligence product with Producer, Land, Linked Data and Shared Utilities surfaces.
What the operation does
| Parameter | In | Notes |
|---|---|---|
landId |
path | integer, required |
year |
query | optional crop-year filter |
limit |
query | default 10, min 1, max 100 |
offset |
query | default 0 |
Each LandCrop record carries landId, cropYear, acres, lciId and nullable planted and harvested timestamps. lciId is a Land Cover Index code, and the schema tells you to resolve it through /codes/crops, which is not in this contract. The documented example returns three years of a 29-record history with planted and harvested both null on every row, so do not assume dates exist.
The meter is in the contract
Three headers come back on a 200: X-Credit-Cost, X-Credits-Remaining and X-Credit-Pool-Reset, the last one a date-time for your contract reset. The description separates metered endpoints (producer and land data) from unmetered discovery endpoints (search, codes, geographic areas).
Running out of credits returns a 429, typed insufficient-credits, and the documented detail reads “This request requires 8 land credits, but only 5 remain.” That is a reuse of the rate-limit status code for a billing condition. An agent or client that treats every 429 as “back off and retry” will retry forever against an empty pool. Branch on the type field, not the status.
Errors follow RFC 7807 problem details, with an instance URN that carries the request ID, and 400s add a per-parameter errors array. Auth is OAuth 2.0 client credentials against api.auth.dtn.com.
Paging has a cost consequence too. Because the meter counts records, limit is your spend control: a parcel with 29 crop years costs 29 credits however you page it, but a year filter costs one.
What is ours to fix
Our record has three inconsistencies. The baseURL reads weather.api.dtn.com, while the contract’s servers are the api-farm-intelligence hosts. The entry_base is the development server, the first of three the contract lists, when production is api-farm-intelligence.prd.ag.zones.dtn.com. And the documentation link points to DTN’s Weather Conditions API docs, not Farm Intelligence. The same dev entry_base appears on all four Land entries (Crop, Details, Geospatial, Search).
Takeaway
Treat this as a priced data call. Read X-Credits-Remaining on every response, filter by year when you can, and handle insufficient-credits as a stop, not a retry. Call production, not the host our record lists. The contract is at apis.io/apis/dtn/dtn-land-crop-api/.