{"name":"Every.Farm Developer API","version":"v1","documentation":"https://every.farm/docs/developer-api/","authentication":{"scheme":"Bearer","header":"Authorization: Bearer efv_...","howToGetAToken":"Sign in to Every.Farm, open the API Tokens panel from your account menu, and create a token. Tokens carry read and/or write scopes and can be restricted to specific farms.","note":"Every endpoint below except this discovery manifest requires a valid token."},"conventions":{"baseUrl":"https://api.every.farm/v1","timestamps":"Firestore timestamps serialize as { _seconds, _nanoseconds }.","signedUrls":"GeoJSON / raster / image URLs are short-lived signed URLs (15 min for data + images, 60 min for rasters). Re-request to refresh.","rateLimits":"Default 60 requests/minute and 10,000 requests/day per token."},"endpoints":[{"method":"GET","path":"/v1","scope":null,"summary":"This discovery manifest.","docs":"https://every.farm/docs/developer-api/#api-discovery"},{"method":"GET","path":"/v1/farms","scope":"read","summary":"List farms the token can access.","docs":"https://every.farm/docs/developer-api/#list-farms"},{"method":"GET","path":"/v1/farms/:farm_id","scope":"read","summary":"Farm details + signed blocks GeoJSON URL.","docs":"https://every.farm/docs/developer-api/#get-farm-details"},{"method":"GET","path":"/v1/farms/:farm_id/blocks","scope":"read","summary":"List blocks for a farm. ?include=headerValues (and ?period=YYYY) attaches block header values.","docs":"https://every.farm/docs/developer-api/#list-blocks"},{"method":"POST","path":"/v1/farms/:farm_id/blocks","scope":"write","summary":"Create one or more blocks (polygon geometry + optional field values).","docs":"https://every.farm/docs/developer-api/#create-blocks"},{"method":"GET","path":"/v1/blocks/:block_id","scope":"read","summary":"Get one block. ?include=headerValues (and ?period=YYYY) attaches block header values.","docs":"https://every.farm/docs/developer-api/#read-values-on-blocks"},{"method":"GET","path":"/v1/farms/:farm_id/block-headers","scope":"read","summary":"List block-header definitions (typed, optionally time-aware block attributes).","docs":"https://every.farm/docs/developer-api/#list-block-headers"},{"method":"POST","path":"/v1/farms/:farm_id/block-headers","scope":"write","summary":"Create a block-header definition.","docs":"https://every.farm/docs/developer-api/#create-block-header"},{"method":"PATCH","path":"/v1/block-headers/:header_id","scope":"write","summary":"Update a block-header definition.","docs":"https://every.farm/docs/developer-api/#update-block-header"},{"method":"DELETE","path":"/v1/block-headers/:header_id","scope":"write","summary":"Soft-trash a block-header definition (values retained but unsurfaced).","docs":"https://every.farm/docs/developer-api/#delete-block-header"},{"method":"GET","path":"/v1/blocks/:block_id/values","scope":"read","summary":"Get all header values for a block (label-keyed).","docs":"https://every.farm/docs/developer-api/#read-values-on-blocks"},{"method":"PUT","path":"/v1/blocks/:block_id/values","scope":"write","summary":"Upsert header values for one block.","docs":"https://every.farm/docs/developer-api/#upsert-values-one-block"},{"method":"POST","path":"/v1/farms/:farm_id/block-values:bulkUpsert","scope":"write","summary":"Bulk upsert header values across many blocks (per-row status); the spreadsheet ingestion path.","docs":"https://every.farm/docs/developer-api/#bulk-upsert-values-many-blocks-the-spreadsheet-path"},{"method":"GET","path":"/v1/farms/:farm_id/datasets","scope":"read","summary":"List datasets for a farm.","docs":"https://every.farm/docs/developer-api/#list-datasets"},{"method":"GET","path":"/v1/farms/:farm_id/folders","scope":"read","summary":"List folders for a farm. ?folder=<id> lists one level (default root); ?all=true lists every folder flat.","docs":"https://every.farm/docs/developer-api/#list-folders"},{"method":"POST","path":"/v1/farms/:farm_id/folders","scope":"write","summary":"Create a folder (optionally nested under {parentFolderId}).","docs":"https://every.farm/docs/developer-api/#create-folder"},{"method":"PATCH","path":"/v1/folders/:folder_id","scope":"write","summary":"Rename/describe a folder, or move it ({folderId}: a folder id / \"root\" / \"trash\").","docs":"https://every.farm/docs/developer-api/#update-move-folder"},{"method":"DELETE","path":"/v1/folders/:folder_id","scope":"write","summary":"Delete an empty folder. Non-empty folders must be emptied or trashed (PATCH {folderId:\"trash\"}) first.","docs":"https://every.farm/docs/developer-api/#delete-folder"},{"method":"GET","path":"/v1/datasets/:dataset_id","scope":"read","summary":"Dataset metadata; includes signed GeoJSON + raster URLs when present.","docs":"https://every.farm/docs/developer-api/#get-dataset-details"},{"method":"GET","path":"/v1/datasets/:dataset_id/geojson","scope":"read","summary":"Full GeoJSON. ?resolve_images=true (default for collector datasets) signs image fields.","docs":"https://every.farm/docs/developer-api/#get-dataset-geojson"},{"method":"GET","path":"/v1/datasets/:dataset_id/raster","scope":"read","summary":"302 redirect to a signed COG download URL.","docs":"https://every.farm/docs/developer-api/#download-raster-302-redirect"},{"method":"GET","path":"/v1/datasets/:dataset_id/raster/preview","scope":"read","summary":"302 redirect to a signed PNG preview.","docs":"https://every.farm/docs/developer-api/#download-raster-preview"},{"method":"POST","path":"/v1/farms/:farm_id/datasets","scope":"write","summary":"Create a static dataset from a GeoJSON body.","docs":"https://every.farm/docs/developer-api/#push-a-dataset-create"},{"method":"PUT","path":"/v1/datasets/:dataset_id/geojson","scope":"write","summary":"Replace a dataset's GeoJSON.","docs":"https://every.farm/docs/developer-api/#update-dataset-geojson"},{"method":"PATCH","path":"/v1/datasets/:dataset_id","scope":"write","summary":"Move a dataset between folders ({folderId}); \"root\" restores from trash.","docs":"https://every.farm/docs/developer-api/#move-a-dataset-between-folders"},{"method":"DELETE","path":"/v1/datasets/:dataset_id","scope":"write","summary":"Soft-trash a dataset (recoverable). No hard delete over the API.","docs":"https://every.farm/docs/developer-api/#trash-a-dataset"},{"method":"GET","path":"/v1/farms/:farm_id/collectors","scope":"read","summary":"List data collectors for a farm.","docs":"https://every.farm/docs/developer-api/#list-collectors"},{"method":"POST","path":"/v1/farms/:farm_id/collectors","scope":"write","summary":"Create a collector + linked dynamic dataset.","docs":"https://every.farm/docs/developer-api/#create-collector"},{"method":"GET","path":"/v1/collectors/:collector_id","scope":"read","summary":"Collector schema + datapoint count.","docs":"https://every.farm/docs/developer-api/#get-collector"},{"method":"PATCH","path":"/v1/collectors/:collector_id","scope":"write","summary":"Update a collector's fields/metadata.","docs":"https://every.farm/docs/developer-api/#update-collector"},{"method":"DELETE","path":"/v1/collectors/:collector_id","scope":"write","summary":"Trash a collector.","docs":"https://every.farm/docs/developer-api/#delete-trash-collector"},{"method":"GET","path":"/v1/collectors/:collector_id/datapoints","scope":"read","summary":"List datapoints; Image fields resolve to signed URLs.","docs":"https://every.farm/docs/developer-api/#list-datapoints"},{"method":"POST","path":"/v1/collectors/:collector_id/datapoints","scope":"write","summary":"Push one or many datapoints.","docs":"https://every.farm/docs/developer-api/#push-datapoints"},{"method":"GET","path":"/v1/collectors/:collector_id/datapoints/:datapoint_id","scope":"read","summary":"One datapoint with images resolved.","docs":"https://every.farm/docs/developer-api/#get-datapoint"},{"method":"PATCH","path":"/v1/collectors/:collector_id/datapoints/:datapoint_id","scope":"write","summary":"Edit a datapoint (partial: lat/lng/accuracy + field values).","docs":"https://every.farm/docs/developer-api/#edit-datapoint"},{"method":"DELETE","path":"/v1/collectors/:collector_id/datapoints/:datapoint_id","scope":"write","summary":"Delete a datapoint.","docs":"https://every.farm/docs/developer-api/#delete-datapoint"},{"method":"POST","path":"/v1/collectors/:collector_id/recompile","scope":"write","summary":"Compile datapoints into the dynamic dataset GeoJSON.","docs":"https://every.farm/docs/developer-api/#recompile-dataset"},{"method":"GET","path":"/v1/satellite/collections","scope":"read","summary":"Available satellite imagery sources.","docs":"https://every.farm/docs/developer-api/#list-imagery-collections"},{"method":"GET","path":"/v1/satellite/recipes","scope":"read","summary":"Named analysis recipes (temporal mean, etc.).","docs":"https://every.farm/docs/developer-api/#list-analysis-recipes"},{"method":"GET","path":"/v1/satellite/indices","scope":"read","summary":"Supported vegetation indices.","docs":"https://every.farm/docs/developer-api/#list-vector-supported-indices"},{"method":"GET","path":"/v1/satellite/scenes","scope":"read","summary":"Search satellite scenes for a block + date range.","docs":"https://every.farm/docs/developer-api/#search-scenes"},{"method":"POST","path":"/v1/satellite/analyses","scope":"write","summary":"Kick off a satellite analysis job.","docs":"https://every.farm/docs/developer-api/#submit-an-analysis"},{"method":"GET","path":"/v1/satellite/analyses/:job_id","scope":"read","summary":"Poll a satellite analysis job.","docs":"https://every.farm/docs/developer-api/#poll-an-analysis"},{"method":"GET","path":"/v1/farms/:farm_id/missions","scope":"read","summary":"List missions (?status=ready default; ?asset=<id> filters). The robot poll endpoint — see docs/mission-dispatch-v1.md.","docs":"https://every.farm/docs/developer-api/#list-missions-poll"},{"method":"POST","path":"/v1/missions/:mission_id/claim","scope":"write","summary":"Atomically claim a ready mission ({assetId}); losers get 409.","docs":"https://every.farm/docs/developer-api/#claim-a-mission"},{"method":"POST","path":"/v1/missions/:mission_id/status","scope":"write","summary":"Report running/heartbeat (+progress, position). Response echoes currentStatus — how a robot learns of an abort.","docs":"https://every.farm/docs/developer-api/#report-mission-status-heartbeat"},{"method":"POST","path":"/v1/missions/:mission_id/complete","scope":"write","summary":"Finish a mission ({outcome: complete|failed, results}).","docs":"https://every.farm/docs/developer-api/#complete-a-mission"},{"method":"POST","path":"/v1/farms/:farm_id/missions","scope":"write","summary":"Create a mission (draft by default; ready only when the farm opts into autoDispatchMissions).","docs":"https://every.farm/docs/developer-api/#create-a-mission"},{"method":"GET","path":"/v1/missions/:mission_id/waypoints.csv","scope":"read","summary":"The mission path as a waypoint CSV (header row, then latitude,longitude,seq,name) — the PPBv2 follower's native format.","docs":"https://every.farm/docs/developer-api/#get-mission-waypoints-csv"},{"method":"POST","path":"/v1/farms/:farm_id/events","scope":"write","summary":"Report a robot event ({assetId, severity: info|warning|critical, code, message, missionId?, positionLngLat?, data?}). Critical/warning notify the farm (in-app, push; email for critical). Rate-limited and de-duplicated per asset+code.","docs":"https://every.farm/docs/developer-api/#report-a-robot-event"},{"method":"GET","path":"/v1/farms/:farm_id/events","scope":"read","summary":"List robot events (?since=<ISO>, ?severity=, ?asset=, ?unacknowledged=true).","docs":"https://every.farm/docs/developer-api/#list-robot-events"},{"method":"POST","path":"/v1/events/:event_id/ack","scope":"write","summary":"Acknowledge a robot event.","docs":"https://every.farm/docs/developer-api/#acknowledge-a-robot-event"},{"method":"POST","path":"/v1/farms/:farm_id/tracks","scope":"write","summary":"Open a live telemetry track (renders on the farm map LIVE view).","docs":"https://every.farm/docs/developer-api/#open-a-live-track"},{"method":"POST","path":"/v1/tracks/:track_id/lines","scope":"write","summary":"Append a telemetry chunk (parallel lngs/lats/times arrays; idempotent by segment+chunk index).","docs":"https://every.farm/docs/developer-api/#append-track-points"},{"method":"POST","path":"/v1/tracks/:track_id/finalize","scope":"write","summary":"Finalize a track into a coverage-polygon dataset (async).","docs":"https://every.farm/docs/developer-api/#finalize-a-track"},{"method":"GET","path":"/v1/usage","scope":null,"summary":"Token usage + rate-limit status.","docs":"https://every.farm/docs/developer-api/#check-usage"},{"method":"POST","path":"/v1/tokens","scope":"firebase-auth","summary":"Create a token (uses a Firebase ID token, not an API token).","docs":"https://every.farm/docs/developer-api/#token-management-endpoints"},{"method":"GET","path":"/v1/openapi.json","scope":"none","summary":"OpenAPI 3.1 description of this API (no auth). Generated from this manifest and the docs.","docs":"https://every.farm/docs/developer-api/#openapi"},{"method":"GET","path":"/v1/crop-picker/openapi.json","scope":"none","summary":"OpenAPI 3.1 for the public Crop Picker API at crops.every.farm (no auth)."},{"method":"GET","path":"/v1/docs","scope":"none","summary":"Docs for one endpoint as markdown + request/response examples (?endpoint=METHOD /v1/path, or ?q=search); the full index with no query (no auth).","docs":"https://every.farm/docs/developer-api/#docs-by-endpoint"},{"method":"GET","path":"/v1/tokens","scope":"firebase-auth","summary":"List the signed-in user's tokens.","docs":"https://every.farm/docs/developer-api/#token-management-endpoints"},{"method":"DELETE","path":"/v1/tokens/:token_id","scope":"firebase-auth","summary":"Revoke a token.","docs":"https://every.farm/docs/developer-api/#token-management-endpoints"}],"docsIndex":"https://api.every.farm/v1/docs","howToUse":"Start here. Each endpoint carries a docs link to its exact section. GET /v1/docs?endpoint=POST%20/v1/farms/:farm_id/missions returns that section as markdown with request/response examples; /v1/openapi.json is the same API as OpenAPI 3.1. Errors include a documentation link for the endpoint that failed.","openapi":"https://api.every.farm/v1/openapi.json","llms":"https://every.farm/llms.txt","mcp":{"package":"everyfarm-mcp","documentation":"https://every.farm/docs/developer-api/mcp-server/","transport":"stdio"},"relatedApis":{"cropPicker":{"name":"Crop Picker API","baseUrl":"https://crops.every.farm/api/v1","auth":"none (public, read-only)","documentation":"https://every.farm/docs/crop-picker-platform/crops-api/","openapi":"https://api.every.farm/v1/crop-picker/openapi.json","docsIndex":"https://api.every.farm/v1/docs?api=crops","summary":"A cited catalog of alternative crops with a farm-conditions matcher (POST /api/v1/recommend), crop detail, comparison, interactions, cultivars, buyers and sources.","endpoints":[{"method":"GET","path":"/api/v1/audit-log","summary":"GET /api/v1/audit-log","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-audit-log"},{"method":"GET","path":"/api/v1/buyers","summary":"GET /api/v1/buyers","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-buyers"},{"method":"GET","path":"/api/v1/crops","summary":"GET /api/v1/crops","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops"},{"method":"GET","path":"/api/v1/crops/:slug","summary":"GET /api/v1/crops/:slug","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-slug"},{"method":"GET","path":"/api/v1/crops/:slug/cultivars","summary":"GET /api/v1/crops/:slug/cultivars","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-slug-cultivars"},{"method":"GET","path":"/api/v1/crops/:slug/fit","summary":"GET /api/v1/crops/:slug/fit","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-slug-fit"},{"method":"GET","path":"/api/v1/crops/:slug/snowflake","summary":"GET /api/v1/crops/:slug/snowflake","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-slug-snowflake"},{"method":"GET","path":"/api/v1/crops/:slug/sources","summary":"GET /api/v1/crops/:slug/sources","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-slug-sources"},{"method":"GET","path":"/api/v1/crops/compare","summary":"GET /api/v1/crops/compare","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-crops-compare"},{"method":"GET","path":"/api/v1/data-sources","summary":"GET /api/v1/data-sources","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-data-sources"},{"method":"GET","path":"/api/v1/interactions","summary":"GET /api/v1/interactions","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-interactions"},{"method":"GET","path":"/api/v1/interactions/guilds","summary":"GET /api/v1/interactions/guilds","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-interactions-guilds"},{"method":"GET","path":"/api/v1/meta","summary":"GET /api/v1/meta","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-meta"},{"method":"GET","path":"/api/v1/recommend","summary":"GET|POST /api/v1/recommend","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-post-api-v1-recommend"},{"method":"POST","path":"/api/v1/recommend","summary":"GET|POST /api/v1/recommend","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-post-api-v1-recommend"},{"method":"GET","path":"/api/v1/regions","summary":"GET /api/v1/regions","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-api-v1-regions"},{"method":"GET","path":"/api/v1/regions/presets","summary":"2026-10","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#2026-10"},{"method":"GET","path":"/api/v1/systems/evaluate","summary":"GET|POST /api/v1/systems/evaluate","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-post-api-v1-systems-evaluate"},{"method":"POST","path":"/api/v1/systems/evaluate","summary":"GET|POST /api/v1/systems/evaluate","docs":"https://every.farm/docs/crop-picker-platform/crops-api/#get-post-api-v1-systems-evaluate"}]}}}