{"openapi":"3.1.0","info":{"title":"AGRICULTURE.md API","version":"1.0","description":"One skill file any agent can read, with your own field rules written in: spray weather limits, water buffers, irrigation and nitrogen thresholds, approvals and records. Plus read-only field calculators over HTTP and MCP. Every number comes from your request or a stated formula, and chemical rates always come from the product label. Read-only, no key, nothing stored. Use at your own risk. agriculture.md is provided as is, without warranty. Information here may be inaccurate, incomplete or not current, and is not verified; figures are estimates from the numbers you send and the formulas stated. Nothing here is agronomic, legal, regulatory or safety advice. Follow the product label and the law where you work, and check with a qualified agronomist. agriculture.md never recommends a product or rate, applies anything or controls equipment. Check everything yourself before you act on it.","termsOfService":"https://agriculture.md/terms","license":{"name":"MIT","identifier":"MIT"}},"servers":[{"url":"https://agriculture.md"}],"paths":{"/agriculture.md":{"get":{"operationId":"getSkill","summary":"The AGRICULTURE.md skill as Markdown. Add a preset or any setting to write your settings in; notes on clamped or ignored values come back in the X-Settings-Notes header.","parameters":[{"name":"preset","in":"query","required":false,"schema":{"type":"string","enum":["core","recommended","strict"]}},{"name":"max_wind_kmh","in":"query","required":false,"description":"Max wind speed for spraying (km/h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":50}},{"name":"rain_free_h","in":"query","required":false,"description":"Rain-free hours needed after spraying (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":72}},{"name":"buffer_m","in":"query","required":false,"description":"Buffer distance from water (m). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":1000}},{"name":"max_irrigation_mm","in":"query","required":false,"description":"Max irrigation depth per event (mm). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":1,"maximum":200}},{"name":"max_n_kg_ha","in":"query","required":false,"description":"Max nitrogen per application (kg N/ha). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":1,"maximum":500}},{"name":"chem_approval","in":"query","required":false,"description":"Human approval for chemical applications: every_application (Always, before every application), every_load (Always, before every application and every tank load). Default every_application.","schema":{"type":"string","enum":["every_application","every_load"]}},{"name":"records","in":"query","required":false,"description":"Record every application: required (Required: what, where, when, how much), with_conditions (Required, plus weather and equipment at the time). Default required.","schema":{"type":"string","enum":["required","with_conditions"]}},{"name":"units","in":"query","required":false,"description":"Unit system: metric (Metric), imperial (Imperial). Default metric.","schema":{"type":"string","enum":["metric","imperial"]}}],"responses":{"200":{"description":"The skill","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/v1/settings":{"get":{"operationId":"listSettings","summary":"Every setting (group, kind, unit, range, options, default) and the presets.","responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}}}}},"/api/v1/spray_mix":{"get":{"operationId":"sprayMixGet","summary":"Spray tank mix from label rates","description":"Tank math for a spray job: total spray volume, number of tank loads, area per tank, and how much of each product goes in each full tank and the last partial tank, from your area, carrier volume, tank size and the product rates you take from each label. Flags any rate above the label maximum you enter. It never suggests a rate, a product or a mixing order, and it checks no label, weather or compatibility.","parameters":[{"name":"units","in":"query","required":false,"description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"area","in":"query","required":true,"description":"Area to spray: ha (metric) or ac (imperial).","schema":{"type":"number","minimum":0.0001,"maximum":1000000}},{"name":"carrier_rate","in":"query","required":true,"description":"Total spray volume per area from the label or your calibration: L/ha (metric) or US gal/ac (imperial).","schema":{"type":"number","minimum":0.1,"maximum":10000}},{"name":"tank_size","in":"query","required":true,"description":"Usable tank volume: L (metric) or US gal (imperial).","schema":{"type":"number","minimum":1,"maximum":1000000}},{"name":"products","in":"query","required":true,"description":"Products in the tank: [{ label?, rate, unit, label_max? }]. rate is the label rate you chose, per area. unit is one of l_per_ha, ml_per_ha, kg_per_ha, g_per_ha, gal_per_ac, qt_per_ac, pt_per_ac, fl_oz_per_ac, lb_per_ac, oz_per_ac. label_max is the label's maximum rate in the same unit, if you want it checked. URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"sprayMix","summary":"Spray tank mix from label rates","description":"Tank math for a spray job: total spray volume, number of tank loads, area per tank, and how much of each product goes in each full tank and the last partial tank, from your area, carrier volume, tank size and the product rates you take from each label. Flags any rate above the label maximum you enter. It never suggests a rate, a product or a mixing order, and it checks no label, weather or compatibility.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"units":{"type":"string","enum":["metric","imperial"],"default":"metric","description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both."},"area":{"type":"number","minimum":0.0001,"maximum":1000000,"description":"Area to spray: ha (metric) or ac (imperial)."},"carrier_rate":{"type":"number","minimum":0.1,"maximum":10000,"description":"Total spray volume per area from the label or your calibration: L/ha (metric) or US gal/ac (imperial)."},"tank_size":{"type":"number","minimum":1,"maximum":1000000,"description":"Usable tank volume: L (metric) or US gal (imperial)."},"products":{"type":"array","description":"Products in the tank: [{ label?, rate, unit, label_max? }]. rate is the label rate you chose, per area. unit is one of l_per_ha, ml_per_ha, kg_per_ha, g_per_ha, gal_per_ac, qt_per_ac, pt_per_ac, fl_oz_per_ac, lb_per_ac, oz_per_ac. label_max is the label's maximum rate in the same unit, if you want it checked.","items":{"type":"object","properties":{"label":{"type":"string","maxLength":40},"rate":{"type":"number","minimum":0},"unit":{"type":"string","enum":["l_per_ha","ml_per_ha","kg_per_ha","g_per_ha","gal_per_ac","qt_per_ac","pt_per_ac","fl_oz_per_ac","lb_per_ac","oz_per_ac"]},"label_max":{"type":"number","minimum":0}},"required":["rate","unit"]},"minItems":1,"maxItems":10}},"required":["area","carrier_rate","tank_size","products"]},"example":{"units":"metric","area":32,"carrier_rate":100,"tank_size":2000,"products":[{"label":"Product A","rate":1.5,"unit":"l_per_ha","label_max":2},{"label":"Product B","rate":40,"unit":"g_per_ha"}]}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/irrigation":{"get":{"operationId":"irrigationGet","summary":"Irrigation depth, volume and run time","description":"Crop water use from a reference evapotranspiration and crop coefficient you enter, less effective rain, divided by your application efficiency: the gross depth, the water volume for the area, and the run time at your flow rate. Flags a depth above your per-event limit and how many events would keep under it. It reads no weather or soil data and changes no schedule.","parameters":[{"name":"units","in":"query","required":false,"description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"et0","in":"query","required":true,"description":"Reference evapotranspiration per day: mm/day (metric) or in/day (imperial). Your own figure.","schema":{"type":"number","minimum":0,"maximum":30}},{"name":"kc","in":"query","required":true,"description":"Crop coefficient for the stage, from your agronomist or your own source.","schema":{"type":"number","minimum":0,"maximum":2}},{"name":"days","in":"query","required":false,"description":"Days of water use to replace. Default 1.","schema":{"type":"number","minimum":0.1,"maximum":60}},{"name":"effective_rain","in":"query","required":false,"description":"Rain that reached the root zone over those days: mm or in. Default 0.","schema":{"type":"number","minimum":0,"maximum":1000}},{"name":"efficiency_pct","in":"query","required":true,"description":"Application efficiency of your system, %. Your own figure.","schema":{"type":"number","minimum":1,"maximum":100}},{"name":"area","in":"query","required":true,"description":"Area irrigated: ha (metric) or ac (imperial).","schema":{"type":"number","minimum":0.0001,"maximum":1000000}},{"name":"flow","in":"query","required":false,"description":"Optional system flow: m3/h (metric) or US gal/min (imperial). Gives run time.","schema":{"type":"number","minimum":0.0001,"maximum":1000000}},{"name":"max_depth","in":"query","required":false,"description":"Optional limit per event: mm or in (your max irrigation depth setting).","schema":{"type":"number","minimum":0.01,"maximum":1000}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"irrigation","summary":"Irrigation depth, volume and run time","description":"Crop water use from a reference evapotranspiration and crop coefficient you enter, less effective rain, divided by your application efficiency: the gross depth, the water volume for the area, and the run time at your flow rate. Flags a depth above your per-event limit and how many events would keep under it. It reads no weather or soil data and changes no schedule.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"units":{"type":"string","enum":["metric","imperial"],"default":"metric","description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both."},"et0":{"type":"number","minimum":0,"maximum":30,"description":"Reference evapotranspiration per day: mm/day (metric) or in/day (imperial). Your own figure."},"kc":{"type":"number","minimum":0,"maximum":2,"description":"Crop coefficient for the stage, from your agronomist or your own source."},"days":{"type":"number","minimum":0.1,"maximum":60,"default":1,"description":"Days of water use to replace. Default 1."},"effective_rain":{"type":"number","minimum":0,"maximum":1000,"default":0,"description":"Rain that reached the root zone over those days: mm or in. Default 0."},"efficiency_pct":{"type":"number","minimum":1,"maximum":100,"description":"Application efficiency of your system, %. Your own figure."},"area":{"type":"number","minimum":0.0001,"maximum":1000000,"description":"Area irrigated: ha (metric) or ac (imperial)."},"flow":{"type":"number","minimum":0.0001,"maximum":1000000,"description":"Optional system flow: m3/h (metric) or US gal/min (imperial). Gives run time."},"max_depth":{"type":"number","minimum":0.01,"maximum":1000,"description":"Optional limit per event: mm or in (your max irrigation depth setting)."}},"required":["et0","kc","efficiency_pct","area"]},"example":{"units":"metric","et0":6,"kc":1.1,"days":3,"effective_rain":5,"efficiency_pct":85,"area":20,"flow":120,"max_depth":15}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/gdd":{"get":{"operationId":"gddGet","summary":"Growing degree days","description":"Daily and cumulative growing degree days from daily maximum and minimum temperatures you send, a base temperature and an optional upper cap. Two stated methods: average (mean of max and min, temperatures capped at the upper cap, negative days count as zero) and modified (max and min each held between the base and the cap before averaging). Uses no weather data of its own; base and cap for a crop come from you or your agronomist.","parameters":[{"name":"temps","in":"query","required":true,"description":"Daily temperatures, oldest first: [{ tmax, tmin, label? }]. Your own readings or records. URL-encoded JSON.","schema":{"type":"string"}},{"name":"scale","in":"query","required":false,"description":"Temperature scale for temps, base and cap: c or f. Default c.","schema":{"type":"string","enum":["c","f"]}},{"name":"base","in":"query","required":true,"description":"Base temperature, in the same scale. Below it, a crop is taken to make no progress.","schema":{"type":"number","minimum":-40,"maximum":120}},{"name":"upper_cap","in":"query","required":false,"description":"Optional upper cap, in the same scale. Temperatures above it count as the cap.","schema":{"type":"number","minimum":-40,"maximum":140}},{"name":"method","in":"query","required":false,"description":"average or modified (see the description). Default average.","schema":{"type":"string","enum":["average","modified"]}},{"name":"start_cumulative","in":"query","required":false,"description":"Degree days already counted before the first day. Default 0.","schema":{"type":"number","minimum":0,"maximum":100000}},{"name":"target_gdd","in":"query","required":false,"description":"Optional target total (for a stage you track). The result says which day reaches it.","schema":{"type":"number","minimum":0,"maximum":100000}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"gdd","summary":"Growing degree days","description":"Daily and cumulative growing degree days from daily maximum and minimum temperatures you send, a base temperature and an optional upper cap. Two stated methods: average (mean of max and min, temperatures capped at the upper cap, negative days count as zero) and modified (max and min each held between the base and the cap before averaging). Uses no weather data of its own; base and cap for a crop come from you or your agronomist.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"temps":{"type":"array","description":"Daily temperatures, oldest first: [{ tmax, tmin, label? }]. Your own readings or records.","items":{"type":"object","properties":{"tmax":{"type":"number"},"tmin":{"type":"number"},"label":{"type":"string","maxLength":40}},"required":["tmax","tmin"]},"minItems":1,"maxItems":200},"scale":{"type":"string","enum":["c","f"],"default":"c","description":"Temperature scale for temps, base and cap: c or f. Default c."},"base":{"type":"number","minimum":-40,"maximum":120,"description":"Base temperature, in the same scale. Below it, a crop is taken to make no progress."},"upper_cap":{"type":"number","minimum":-40,"maximum":140,"description":"Optional upper cap, in the same scale. Temperatures above it count as the cap."},"method":{"type":"string","enum":["average","modified"],"default":"average","description":"average or modified (see the description). Default average."},"start_cumulative":{"type":"number","minimum":0,"maximum":100000,"default":0,"description":"Degree days already counted before the first day. Default 0."},"target_gdd":{"type":"number","minimum":0,"maximum":100000,"description":"Optional target total (for a stage you track). The result says which day reaches it."}},"required":["temps","base"]},"example":{"scale":"c","base":10,"upper_cap":30,"method":"modified","temps":[{"label":"Day 1","tmax":24,"tmin":12},{"label":"Day 2","tmax":31,"tmin":15},{"label":"Day 3","tmax":19,"tmin":6},{"label":"Day 4","tmax":27,"tmin":14}],"target_gdd":30}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/fertilizer_rate":{"get":{"operationId":"fertilizerRateGet","summary":"Fertilizer product rate from a nutrient target","description":"Product rate per area to deliver your target of one nutrient, from the product's N-P-K analysis you enter (P as P2O5, K as K2O, as labels state them), plus the other nutrients that rate also delivers, totals for your area and an optional liquid volume. Flags nitrogen above your per-application limit. The nutrient target is yours or your agronomist's; this tool suggests none.","parameters":[{"name":"units","in":"query","required":false,"description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"nutrient","in":"query","required":true,"description":"The nutrient your target is for: n, p2o5 or k2o.","schema":{"type":"string","enum":["n","p2o5","k2o"]}},{"name":"target","in":"query","required":true,"description":"Target of that nutrient: kg/ha (metric) or lb/ac (imperial).","schema":{"type":"number","minimum":0.01,"maximum":2000}},{"name":"grade","in":"query","required":false,"description":"Product analysis as N-P2O5-K2O percent, like 18-46-0. Or send n_pct, p2o5_pct and k2o_pct.","schema":{"type":"string"}},{"name":"n_pct","in":"query","required":false,"description":"N %, if no grade.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"p2o5_pct","in":"query","required":false,"description":"P2O5 %, if no grade.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"k2o_pct","in":"query","required":false,"description":"K2O %, if no grade.","schema":{"type":"number","minimum":0,"maximum":100}},{"name":"area","in":"query","required":false,"description":"Optional area: ha or ac. Gives totals.","schema":{"type":"number","minimum":0.0001,"maximum":1000000}},{"name":"density","in":"query","required":false,"description":"Optional, for a liquid product: kg/L (metric) or lb/US gal (imperial). Gives volume.","schema":{"type":"number","minimum":0.1,"maximum":30}},{"name":"max_n","in":"query","required":false,"description":"Optional limit on N per application: kg/ha or lb/ac (your max nitrogen setting).","schema":{"type":"number","minimum":0.01,"maximum":2000}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"fertilizerRate","summary":"Fertilizer product rate from a nutrient target","description":"Product rate per area to deliver your target of one nutrient, from the product's N-P-K analysis you enter (P as P2O5, K as K2O, as labels state them), plus the other nutrients that rate also delivers, totals for your area and an optional liquid volume. Flags nitrogen above your per-application limit. The nutrient target is yours or your agronomist's; this tool suggests none.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"units":{"type":"string","enum":["metric","imperial"],"default":"metric","description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both."},"nutrient":{"type":"string","enum":["n","p2o5","k2o"],"description":"The nutrient your target is for: n, p2o5 or k2o."},"target":{"type":"number","minimum":0.01,"maximum":2000,"description":"Target of that nutrient: kg/ha (metric) or lb/ac (imperial)."},"grade":{"type":"string","maxLength":20,"pattern":"^\\s*\\d{1,2}(\\.\\d+)?\\s*-\\s*\\d{1,2}(\\.\\d+)?\\s*-\\s*\\d{1,2}(\\.\\d+)?\\s*$","description":"Product analysis as N-P2O5-K2O percent, like 18-46-0. Or send n_pct, p2o5_pct and k2o_pct."},"n_pct":{"type":"number","minimum":0,"maximum":100,"description":"N %, if no grade."},"p2o5_pct":{"type":"number","minimum":0,"maximum":100,"description":"P2O5 %, if no grade."},"k2o_pct":{"type":"number","minimum":0,"maximum":100,"description":"K2O %, if no grade."},"area":{"type":"number","minimum":0.0001,"maximum":1000000,"description":"Optional area: ha or ac. Gives totals."},"density":{"type":"number","minimum":0.1,"maximum":30,"description":"Optional, for a liquid product: kg/L (metric) or lb/US gal (imperial). Gives volume."},"max_n":{"type":"number","minimum":0.01,"maximum":2000,"description":"Optional limit on N per application: kg/ha or lb/ac (your max nitrogen setting)."}},"required":["nutrient","target"]},"example":{"units":"metric","nutrient":"p2o5","target":50,"grade":"18-46-0","area":20,"max_n":100}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/seeding_rate":{"get":{"operationId":"seedingRateGet","summary":"Seeding rate from a target stand","description":"Seeds and seed weight per area for a target stand, from germination and emergence percentages and a seed count per weight that you enter (from your seed tag). Optional purity, area totals and per-row spacing. Arithmetic only; it suggests no stand, variety or rate.","parameters":[{"name":"units","in":"query","required":false,"description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"target_stand","in":"query","required":true,"description":"Plants wanted per ha (metric) or per acre (imperial).","schema":{"type":"number","minimum":1,"maximum":100000000}},{"name":"germination_pct","in":"query","required":true,"description":"Germination %, from the seed tag or your test.","schema":{"type":"number","minimum":1,"maximum":100}},{"name":"emergence_pct","in":"query","required":true,"description":"Field emergence (survival) % you expect, your own figure.","schema":{"type":"number","minimum":1,"maximum":100}},{"name":"seeds_per_kg","in":"query","required":false,"description":"Seeds per kg. Send one of seeds_per_kg, seeds_per_lb or thousand_seed_weight_g.","schema":{"type":"number","minimum":1,"maximum":1000000000}},{"name":"seeds_per_lb","in":"query","required":false,"description":"Seeds per lb.","schema":{"type":"number","minimum":1,"maximum":500000000}},{"name":"thousand_seed_weight_g","in":"query","required":false,"description":"Weight of 1,000 seeds, g.","schema":{"type":"number","minimum":0.001,"maximum":10000}},{"name":"purity_pct","in":"query","required":false,"description":"Pure seed % by weight, from the seed tag. Default 100.","schema":{"type":"number","minimum":1,"maximum":100}},{"name":"area","in":"query","required":false,"description":"Optional area: ha or ac. Gives totals.","schema":{"type":"number","minimum":0.0001,"maximum":1000000}},{"name":"row_spacing","in":"query","required":false,"description":"Optional row spacing: cm (metric) or in (imperial). Gives seeds per length of row.","schema":{"type":"number","minimum":1,"maximum":500}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"seedingRate","summary":"Seeding rate from a target stand","description":"Seeds and seed weight per area for a target stand, from germination and emergence percentages and a seed count per weight that you enter (from your seed tag). Optional purity, area totals and per-row spacing. Arithmetic only; it suggests no stand, variety or rate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"units":{"type":"string","enum":["metric","imperial"],"default":"metric","description":"Unit system for the numbers you send: metric or imperial. Default metric. Results come back in both."},"target_stand":{"type":"number","minimum":1,"maximum":100000000,"description":"Plants wanted per ha (metric) or per acre (imperial)."},"germination_pct":{"type":"number","minimum":1,"maximum":100,"description":"Germination %, from the seed tag or your test."},"emergence_pct":{"type":"number","minimum":1,"maximum":100,"description":"Field emergence (survival) % you expect, your own figure."},"seeds_per_kg":{"type":"number","minimum":1,"maximum":1000000000,"description":"Seeds per kg. Send one of seeds_per_kg, seeds_per_lb or thousand_seed_weight_g."},"seeds_per_lb":{"type":"number","minimum":1,"maximum":500000000,"description":"Seeds per lb."},"thousand_seed_weight_g":{"type":"number","minimum":0.001,"maximum":10000,"description":"Weight of 1,000 seeds, g."},"purity_pct":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Pure seed % by weight, from the seed tag. Default 100."},"area":{"type":"number","minimum":0.0001,"maximum":1000000,"description":"Optional area: ha or ac. Gives totals."},"row_spacing":{"type":"number","minimum":1,"maximum":500,"description":"Optional row spacing: cm (metric) or in (imperial). Gives seeds per length of row."}},"required":["target_stand","germination_pct","emergence_pct"]},"example":{"units":"metric","target_stand":80000,"germination_pct":95,"emergence_pct":92,"thousand_seed_weight_g":300,"area":40,"row_spacing":76}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/field_area":{"get":{"operationId":"fieldAreaGet","summary":"Field area from boundary points","description":"Area and perimeter of a field boundary you send as latitude and longitude points (decimal degrees, in order around the edge). Area uses an equal-area projection on the standard GPS reference ellipsoid and the shoelace formula; perimeter uses the haversine formula. Returns hectares, acres and square metres. It checks for a crossing boundary; it can't check where the points came from or how accurate they are.","parameters":[{"name":"points","in":"query","required":true,"description":"Boundary points in order: [{ lat, lon }], decimal degrees. 3 to 200 points. Repeating the first point at the end is fine. URL-encoded JSON.","schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"fieldArea","summary":"Field area from boundary points","description":"Area and perimeter of a field boundary you send as latitude and longitude points (decimal degrees, in order around the edge). Area uses an equal-area projection on the standard GPS reference ellipsoid and the shoelace formula; perimeter uses the haversine formula. Returns hectares, acres and square metres. It checks for a crossing boundary; it can't check where the points came from or how accurate they are.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"points":{"type":"array","description":"Boundary points in order: [{ lat, lon }], decimal degrees. 3 to 200 points. Repeating the first point at the end is fine.","items":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180}},"required":["lat","lon"]},"minItems":3,"maxItems":200}},"required":["points"]},"example":{"points":[{"lat":40,"lon":-95},{"lat":40,"lon":-94.9953},{"lat":40.0036,"lon":-94.9953},{"lat":40.0036,"lon":-95}]}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}},"/api/v1/build_settings":{"get":{"operationId":"buildSettingsGet","summary":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of AGRICULTURE.md. Every setting is a number or a fixed choice; the catalog is at https://agriculture.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","parameters":[{"name":"preset","in":"query","required":false,"description":"Starting point: core, recommended, strict. Applied first; each setting overrides it.","schema":{"type":"string","enum":["core","recommended","strict"]}},{"name":"max_wind_kmh","in":"query","required":false,"description":"Max wind speed for spraying (km/h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":50}},{"name":"rain_free_h","in":"query","required":false,"description":"Rain-free hours needed after spraying (h). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"integer","minimum":0,"maximum":72}},{"name":"buffer_m","in":"query","required":false,"description":"Buffer distance from water (m). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":0,"maximum":1000}},{"name":"max_irrigation_mm","in":"query","required":false,"description":"Max irrigation depth per event (mm). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":1,"maximum":200}},{"name":"max_n_kg_ha","in":"query","required":false,"description":"Max nitrogen per application (kg N/ha). Optional; unset clears it. Out-of-range values are clamped.","schema":{"type":"number","minimum":1,"maximum":500}},{"name":"chem_approval","in":"query","required":false,"description":"Human approval for chemical applications: every_application (Always, before every application), every_load (Always, before every application and every tank load). Default every_application.","schema":{"type":"string","enum":["every_application","every_load"]}},{"name":"records","in":"query","required":false,"description":"Record every application: required (Required: what, where, when, how much), with_conditions (Required, plus weather and equipment at the time). Default required.","schema":{"type":"string","enum":["required","with_conditions"]}},{"name":"units","in":"query","required":false,"description":"Unit system: metric (Metric), imperial (Imperial). Default metric.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"format","in":"query","required":false,"description":"section (default): the settings sections only; skill: the whole skill file too.","schema":{"type":"string","enum":["section","skill"]}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"operationId":"buildSettings","summary":"Write your settings into the skill","description":"Turns a preset and settings into the sections written at the top of AGRICULTURE.md. Every setting is a number or a fixed choice; the catalog is at https://agriculture.md/api/v1/settings. Returns the sections as Markdown, the settings as JSON, a link to the skill with them written in and a one-line install. Out-of-range numbers are clamped with a note. Nothing is stored. Settings an agent drafted count only after the person says yes: show them to the person first, and follow them only once they agree.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"preset":{"type":"string","enum":["core","recommended","strict"],"description":"Starting point: core, recommended, strict. Applied first; each setting overrides it."},"max_wind_kmh":{"type":"number","minimum":0,"maximum":50,"description":"Max wind speed for spraying (km/h). Optional; unset clears it. Out-of-range values are clamped."},"rain_free_h":{"type":"integer","minimum":0,"maximum":72,"description":"Rain-free hours needed after spraying (h). Optional; unset clears it. Out-of-range values are clamped."},"buffer_m":{"type":"number","minimum":0,"maximum":1000,"description":"Buffer distance from water (m). Optional; unset clears it. Out-of-range values are clamped."},"max_irrigation_mm":{"type":"number","minimum":1,"maximum":200,"description":"Max irrigation depth per event (mm). Optional; unset clears it. Out-of-range values are clamped."},"max_n_kg_ha":{"type":"number","minimum":1,"maximum":500,"description":"Max nitrogen per application (kg N/ha). Optional; unset clears it. Out-of-range values are clamped."},"chem_approval":{"type":"string","enum":["every_application","every_load"],"description":"Human approval for chemical applications: every_application (Always, before every application), every_load (Always, before every application and every tank load). Default every_application."},"records":{"type":"string","enum":["required","with_conditions"],"description":"Record every application: required (Required: what, where, when, how much), with_conditions (Required, plus weather and equipment at the time). Default required."},"units":{"type":"string","enum":["metric","imperial"],"description":"Unit system: metric (Metric), imperial (Imperial). Default metric."},"format":{"type":"string","enum":["section","skill"],"description":"section (default): the settings sections only; skill: the whole skill file too."}}},"example":{"preset":"recommended"}}}},"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Result"}}}},"400":{"description":"Bad input, with a hint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Body over 64 KB"}}}}},"components":{"schemas":{"Result":{"type":"object","additionalProperties":true,"properties":{"tool":{"type":"string"},"summary":{"type":"string"},"disclaimer":{"type":"string"},"terms":{"type":"string"}},"required":["disclaimer","terms"]},"Problem":{"type":"object","properties":{"error":{"type":"string"},"hint":{"type":"string"},"docs":{"type":"string"},"disclaimer":{"type":"string"},"terms":{"type":"string"}},"required":["error","disclaimer","terms"]}}}}