Ranch.Bot
Skip to reference

Feedings API

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

GET /v1/farm/{farm_id}/feedings

Get Feedings

Current feedings HTTP operation. External credential scopes: read:records. Minimum farm role: READER. Pagination accepts integer skip and take; set both explicitly. An omitted value passes through to the data query. Collection property names differ by resource; use the response schema. 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"}
skipqueryNo{"type":"integer"}
takequeryNo{"type":"integer"}
statusqueryNo{"type":"string","enum":["ACTIVE","COMPLETED"]}
sincequeryNo{"type":"string","format":"date-time"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/feedings' \
  -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
totalnumberRequired
recordsarrayRequired
records[]objectRequired
records[].idstringRequired
records[].ration_idstringRequired
records[].ration_namestringRequired
records[].statusstringRequiredenum: ["ACTIVE","COMPLETED"]
records[].fed_atstringRequiredformat: "date-time"
records[].scale_factorstringRequired
records[].delivery_countnumberRequired
records[].total_delivered_lbsnumberRequired
json example
{
  "total": 1,
  "records": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "ration_name": "Hay ration",
      "status": "ACTIVE",
      "fed_at": "2026-09-01T12:00:00.000Z",
      "scale_factor": "1.25",
      "delivery_count": 1,
      "total_delivered_lbs": 12.5
    }
  ]
}

GET /v1/farm/{farm_id}/feedings/{feeding_id}

Get Feeding

Current feedings 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"}
feeding_idpathYes{"type":"string","format":"uuid"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/feedings/<feeding_id>' \
  -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
statusstringRequiredenum: ["ACTIVE","COMPLETED"]
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
is_activebooleanRequired
farm_idstringRequired
ingredientsJSONRequired
ration_idstringRequired
client_updated_atstringRequiredformat: "date-time"
fed_atstringRequiredformat: "date-time"
scale_factorstringRequired
rationobjectRequired
ration.idstringRequired
ration.namestringRequired
ration.unitstringRequired
deliveriesarrayRequired
deliveries[]objectRequired
deliveries[].idstringRequired
deliveries[].feeding_idstringRequired
deliveries[].group_idstringRequired
deliveries[].actual_lbsstringRequired
deliveries[].client_updated_atstringRequiredformat: "date-time"
deliveries[].head_countintegerRequired
deliveries[].is_activebooleanRequired
deliveries[].record_idstring or nullRequired
deliveries[].created_atstringRequiredformat: "date-time"
deliveries[].updated_atstringRequiredformat: "date-time"
deliveries[].groupobjectRequired
deliveries[].group.idstringRequired
deliveries[].group.namestringRequired
json example
{
  "status": "ACTIVE",
  "id": "11111111-1111-4111-8111-111111111111",
  "created_at": "2026-09-01T12:00:00.000Z",
  "updated_at": "2026-09-01T12:00:00.000Z",
  "is_active": true,
  "farm_id": "11111111-1111-4111-8111-111111111111",
  "ingredients": [
    {
      "name": "Hay",
      "per_head_lbs": 5.25,
      "position": 0,
      "target_lbs": 12.5,
      "actual_lbs": 12.5
    }
  ],
  "ration_id": "11111111-1111-4111-8111-111111111111",
  "client_updated_at": "2026-09-01T12:00:00.000Z",
  "fed_at": "2026-09-01T12:00:00.000Z",
  "scale_factor": "1.25",
  "ration": {
    "id": "11111111-1111-4111-8111-111111111111",
    "name": "Hay ration",
    "unit": "lb"
  },
  "deliveries": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "feeding_id": "11111111-1111-4111-8111-111111111111",
      "group_id": "11111111-1111-4111-8111-111111111111",
      "actual_lbs": "12.5",
      "client_updated_at": "2026-09-01T12:00:00.000Z",
      "head_count": 10,
      "is_active": true,
      "record_id": null,
      "created_at": "2026-09-01T12:00:00.000Z",
      "updated_at": "2026-09-01T12:00:00.000Z",
      "group": {
        "id": "11111111-1111-4111-8111-111111111111",
        "name": "Ewes"
      }
    }
  ]
}

POST /v1/farm/{farm_id}/feedings/{feeding_id}/sync

Sync Feeding

Current feedings HTTP operation. External credential scopes: write:records. Minimum farm role: EDITOR. Direct requests execute without an app confirmation screen. 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"}
feeding_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
feedingobjectRequired
feeding.ration_idstringRequiredformat: "uuid"
feeding.statusstringRequiredenum: ["ACTIVE","COMPLETED"]
feeding.fed_atstringRequiredformat: "date-time"
feeding.scale_factornumberRequired
feeding.ingredientsarrayRequiredminItems: 1
feeding.ingredients[]objectRequired
feeding.ingredients[].ingredient_idstringOptionalformat: "uuid"
feeding.ingredients[].namestringRequiredminLength: 1
feeding.ingredients[].per_head_lbsnumberRequiredminimum: 0
feeding.ingredients[].positionintegerRequiredminimum: 0
feeding.ingredients[].target_lbsnumberRequiredminimum: 0
feeding.ingredients[].actual_lbsnumberOptionalminimum: 0
feeding.ingredients[].skippedbooleanOptional
feeding.client_updated_atstringRequiredformat: "date-time"
deliveriesarrayRequired
deliveries[]objectRequired
deliveries[].idstringRequiredformat: "uuid"
deliveries[].group_idstringRequiredformat: "uuid"
deliveries[].head_countintegerRequiredminimum: 0
deliveries[].actual_lbsnumberRequiredminimum: 0
deliveries[].client_updated_atstringRequiredformat: "date-time"
deliveries[].deletedbooleanOptional
json example
{
  "feeding": {
    "ration_id": "11111111-1111-4111-8111-111111111111",
    "status": "ACTIVE",
    "fed_at": "2026-09-01T12:00:00.000Z",
    "scale_factor": 1,
    "ingredients": [
      {
        "name": "Example",
        "per_head_lbs": 1,
        "position": 1,
        "target_lbs": 1
      }
    ],
    "client_updated_at": "2026-09-01T12:00:00.000Z"
  },
  "deliveries": []
}

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/feedings/<feeding_id>/sync' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"feeding":{"ration_id":"11111111-1111-4111-8111-111111111111","status":"ACTIVE","fed_at":"2026-09-01T12:00:00.000Z","scale_factor":1,"ingredients":[{"name":"Example","per_head_lbs":1,"position":1,"target_lbs":1}],"client_updated_at":"2026-09-01T12:00:00.000Z"},"deliveries":[]}'

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
feedingobjectRequired
feeding.statusstringRequiredenum: ["ACTIVE","COMPLETED"]
feeding.idstringRequired
feeding.created_atstringRequiredformat: "date-time"
feeding.updated_atstringRequiredformat: "date-time"
feeding.is_activebooleanRequired
feeding.farm_idstringRequired
feeding.ingredientsJSONRequired
feeding.ration_idstringRequired
feeding.client_updated_atstringRequiredformat: "date-time"
feeding.fed_atstringRequiredformat: "date-time"
feeding.scale_factorstringRequired
resultsarrayRequired
results[]objectRequired
results[].delivery_idstringRequired
results[].statusstringRequiredenum: ["error","created","updated","unchanged","deleted"]
results[].record_idstringOptional
results[].errorstringOptional
json example
{
  "feeding": {
    "status": "ACTIVE",
    "id": "11111111-1111-4111-8111-111111111111",
    "created_at": "2026-09-01T12:00:00.000Z",
    "updated_at": "2026-09-01T12:00:00.000Z",
    "is_active": true,
    "farm_id": "11111111-1111-4111-8111-111111111111",
    "ingredients": null,
    "ration_id": "11111111-1111-4111-8111-111111111111",
    "client_updated_at": "2026-09-01T12:00:00.000Z",
    "fed_at": "2026-09-01T12:00:00.000Z",
    "scale_factor": "1.25"
  },
  "results": []
}

POST /v1/farm/{farm_id}/feedings/{feeding_id}/undo

Undo Feeding

Current feedings HTTP operation. External credential scopes: write:records. Minimum farm role: EDITOR. Direct requests execute without an app confirmation screen. 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"}
feeding_idpathYes{"type":"string","format":"uuid"}

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/feedings/<feeding_id>/undo' \
  -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
feeding_idstringRequired
undonebooleanRequired
json example
{
  "feeding_id": "11111111-1111-4111-8111-111111111111",
  "undone": true
}

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"
    }
  ]
}