DTN's Land Crop API bills a credit per crop year and tells you the cost in a header

DTN's Land Crop API bills a credit per crop year and tells you the cost in a header

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/.

← bitdrift Moved Auth Out of the Sandbox and Into MCP
Fifth Wall's portfolio page rates Procore 29.3 and Procore's own record says 67.6 →