Ranch.Bot
Skip to reference

Farm reports API

HTTP reference for farm reports. Read authentication and access before using these operations. All examples use made-up data and placeholder credentials.

GET /v1/farm/{farm_id}/reports/agristability

Get Agri Stability Schedule

Current farm reports HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
yearqueryNo{"type":"integer","minimum":1900,"maximum":9999}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/reports/agristability' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
429Rate limit exceeded. Retry after the indicated delay.application/json
500Unexpected server failure.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
farmobjectRequired
farm.idstringRequired
farm.namestringRequired
farm.speciesstringRequired
yearnumberRequired
generatedAtstringRequired
scheduleobjectRequired
schedule.yearnumberRequired
schedule.periodobjectRequired
schedule.period.startstringRequired
schedule.period.endstringRequired
schedule.openingnumberRequired
schedule.birthsnumberRequired
schedule.purchasesnumberRequired
schedule.deathsnumberRequired
schedule.salesnumberRequired
schedule.closingnumberRequired
schedule.headDaysnumberRequired
schedule.averageHeadnumberRequired
schedule.birthEventsnumberRequired
schedule.saleEventsnumberRequired
priorYearClosingnumberRequired
continuityobjectRequired
continuity.openingMatchesPriorClosingbooleanRequired
continuity.breakHeadnumberRequired
continuity.notesarrayRequired
continuity.notes[]stringRequired
gapsarrayRequired
gaps[]stringRequired
byGrouparrayRequired
byGroup[]objectRequired
byGroup[].groupobjectRequired
byGroup[].group.id (variant 1)nullRequired
byGroup[].group.id (variant 2)stringRequired
byGroup[].group.namestringRequired
byGroup[].closingnumberRequired
json example
{
  "farm": {
    "id": "11111111-1111-4111-8111-111111111111",
    "name": "Example",
    "species": "example"
  },
  "year": 1,
  "generatedAt": "example",
  "schedule": {
    "year": 1,
    "period": {
      "start": "example",
      "end": "example"
    },
    "opening": 1,
    "births": 1,
    "purchases": 1,
    "deaths": 1,
    "sales": 1,
    "closing": 1,
    "headDays": 1,
    "averageHead": 1,
    "birthEvents": 1,
    "saleEvents": 1
  },
  "priorYearClosing": 1,
  "continuity": {
    "openingMatchesPriorClosing": true,
    "breakHead": 1,
    "notes": []
  },
  "gaps": [],
  "byGroup": []
}

GET /v1/farm/{farm_id}/reports/inventory

Get Inventory Report

Current farm reports HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Production rate limit: 100 requests per 15-minute window, per legacy key, otherwise per client IP. RateLimit headers report the current window; respect Retry-After on 429.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
presetqueryNo{"type":"string","enum":["month","quarter","year","custom"],"default":"month"}
fromqueryNo{"type":"string"}
toqueryNo{"type":"string"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/reports/inventory' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
429Rate limit exceeded. Retry after the indicated delay.application/json
500Unexpected server failure.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
farmobjectRequired
farm.idstringRequired
farm.namestringRequired
farm.speciesstringRequired
periodobjectRequired
period.startstringRequired
period.endstringRequired
generatedAtstringRequired
totalsobjectRequired
totals.openingnumberRequired
totals.birthsnumberRequired
totals.purchasesnumberRequired
totals.deathsnumberRequired
totals.salesnumberRequired
totals.transfersnumberRequired
totals.closingnumberRequired
byGrouparrayRequired
byGroup[]objectRequired
byGroup[].groupobjectRequired
byGroup[].group.id (variant 1)nullRequired
byGroup[].group.id (variant 2)stringRequired
byGroup[].group.namestringRequired
byGroup[].openingnumberRequired
byGroup[].birthsnumberRequired
byGroup[].purchasesnumberRequired
byGroup[].deathsnumberRequired
byGroup[].salesnumberRequired
byGroup[].transfersnumberRequired
byGroup[].closingnumberRequired
byCategoryobjectRequired
reconciliationobjectRequired
reconciliation.closingCountnumberRequired
reconciliation.ledgerAdditionsnumberRequired
reconciliation.ledgerRemovalsnumberRequired
reconciliation.animalAdditionsnumberRequired
reconciliation.additionsDriftnumberRequired
reconciliation.driftbooleanRequired
reconciliation.notesarrayRequired
reconciliation.notes[]stringRequired
unclassifiedRecordsarrayRequired
unclassifiedRecords[]objectRequired
unclassifiedRecords[].idstringRequired
unclassifiedRecords[].namestringRequired
unclassifiedRecords[].typestringRequired
unclassifiedRecords[].applied_atstringRequired
unclassifiedRecords[].headCountnumberRequired
recordsarrayRequired
records[]objectRequired
records[].idstringRequired
records[].namestringRequired
records[].description (variant 1)nullRequired
records[].description (variant 2)stringRequired
records[].typestringRequired
records[].applied_atstringRequired
records[].categorystringRequiredenum: ["BIRTH","PURCHASE","DEATH","SALE","TRANSFER","OTHER"]
records[].groupIdsarrayRequired
records[].groupIds[]stringRequired
records[].headCountnumberRequired
records[].headCountKnownbooleanRequired
presetstringRequiredenum: ["custom","month","quarter","year"]
json example
{
  "farm": {
    "id": "11111111-1111-4111-8111-111111111111",
    "name": "Example",
    "species": "example"
  },
  "period": {
    "start": "example",
    "end": "example"
  },
  "generatedAt": "example",
  "totals": {
    "opening": 1,
    "births": 1,
    "purchases": 1,
    "deaths": 1,
    "sales": 1,
    "transfers": 1,
    "closing": 1
  },
  "byGroup": [],
  "byCategory": {},
  "reconciliation": {
    "closingCount": 1,
    "ledgerAdditions": 1,
    "ledgerRemovals": 1,
    "animalAdditions": 1,
    "additionsDrift": 1,
    "drift": true,
    "notes": []
  },
  "unclassifiedRecords": [],
  "records": [],
  "preset": "custom"
}

Error body

Validation and authentication errors generally use this envelope. Rate-limit errors omit data; OAuth polling also has protocol-specific errors shown in its reference.

json example
{
  "success": false,
  "errors": [
    {
      "code": 400,
      "name": "ValidationError",
      "message": "Example validation failure"
    }
  ]
}