Ranch.Bot
Skip to reference

Rations API

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

GET /v1/farm/{farm_id}/rations

Get Rations

Current rations 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"}
include_inactivequeryNo{"type":"boolean"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations' \
  -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[].created_atstringRequiredformat: "date-time"
records[].updated_atstringRequiredformat: "date-time"
records[].namestringRequired
records[].is_activebooleanRequired
records[].farm_idstringRequired
records[].unitstringRequired
records[].ingredientsarrayRequired
records[].ingredients[]objectRequired
records[].ingredients[].idstringRequired
records[].ingredients[].namestringRequired
records[].ingredients[].per_head_lbsstringRequired
records[].ingredients[].positionintegerRequired
records[].ingredients[].ration_idstringRequired
records[].ingredients[].created_atstringRequiredformat: "date-time"
records[].ingredients[].updated_atstringRequiredformat: "date-time"
records[].assignmentsarrayRequired
records[].assignments[]objectRequired
records[].assignments[].idstringRequired
records[].assignments[].ration_idstringRequired
records[].assignments[].group_idstringRequired
records[].assignments[].feedings_per_dayintegerRequired
records[].assignments[].labelstring or nullRequired
records[].assignments[].is_activebooleanRequired
records[].assignments[].created_atstringRequiredformat: "date-time"
records[].assignments[].updated_atstringRequiredformat: "date-time"
records[].assignments[].groupobjectRequired
records[].assignments[].group.idstringRequired
records[].assignments[].group.namestringRequired
json example
{
  "records": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "farm_id": "11111111-1111-4111-8111-111111111111",
      "name": "Hay ration",
      "unit": "lb",
      "is_active": true,
      "created_at": "2026-09-01T12:00:00.000Z",
      "updated_at": "2026-09-01T12:00:00.000Z",
      "ingredients": [
        {
          "id": "11111111-1111-4111-8111-111111111111",
          "name": "Hay",
          "per_head_lbs": "5.25",
          "position": 0,
          "ration_id": "11111111-1111-4111-8111-111111111111",
          "created_at": "2026-09-01T12:00:00.000Z",
          "updated_at": "2026-09-01T12:00:00.000Z"
        }
      ],
      "assignments": [
        {
          "id": "11111111-1111-4111-8111-111111111111",
          "ration_id": "11111111-1111-4111-8111-111111111111",
          "group_id": "11111111-1111-4111-8111-111111111111",
          "feedings_per_day": 2,
          "label": null,
          "is_active": true,
          "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"
          }
        }
      ]
    }
  ],
  "total": 1
}

POST /v1/farm/{farm_id}/rations

Create Ration

Current rations 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"}

Request body (application/json)

FieldTypePresenceConstraints
namestringRequiredminLength: 1
unitstringOptionalminLength: 1
ingredientsarrayRequiredminItems: 1
ingredients[]objectRequired
ingredients[].idstringOptionalformat: "uuid"
ingredients[].namestringRequiredminLength: 1
ingredients[].per_head_lbsnumberRequiredminimum: 0
ingredients[].positionintegerOptionalminimum: 0
assignmentsarrayOptional
assignments[]objectRequired
assignments[].group_idstringRequiredformat: "uuid"
assignments[].feedings_per_dayintegerOptionalminimum: 1; maximum: 12
assignments[].labelstringOptional
assignments[].is_activebooleanOptional
json example
{
  "name": "Example",
  "ingredients": [
    {
      "name": "Example",
      "per_head_lbs": 1
    }
  ]
}

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"name":"Example","ingredients":[{"name":"Example","per_head_lbs":1}]}'

Responses

StatusMeaningContent type
201Successapplication/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

201 response schema (application/json)

FieldTypePresenceConstraints
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
namestringRequired
is_activebooleanRequired
farm_idstringRequired
unitstringRequired
ingredientsarrayRequired
ingredients[]objectRequired
ingredients[].idstringRequired
ingredients[].namestringRequired
ingredients[].per_head_lbsstringRequired
ingredients[].positionintegerRequired
ingredients[].ration_idstringRequired
ingredients[].created_atstringRequiredformat: "date-time"
ingredients[].updated_atstringRequiredformat: "date-time"
assignmentsarrayRequired
assignments[]objectRequired
assignments[].idstringRequired
assignments[].ration_idstringRequired
assignments[].group_idstringRequired
assignments[].feedings_per_dayintegerRequired
assignments[].labelstring or nullRequired
assignments[].is_activebooleanRequired
assignments[].created_atstringRequiredformat: "date-time"
assignments[].updated_atstringRequiredformat: "date-time"
assignments[].groupobjectRequired
assignments[].group.idstringRequired
assignments[].group.namestringRequired
json example
{
  "id": "11111111-1111-4111-8111-111111111111",
  "farm_id": "11111111-1111-4111-8111-111111111111",
  "name": "Hay ration",
  "unit": "lb",
  "is_active": true,
  "created_at": "2026-09-01T12:00:00.000Z",
  "updated_at": "2026-09-01T12:00:00.000Z",
  "ingredients": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "name": "Hay",
      "per_head_lbs": "5.25",
      "position": 0,
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "created_at": "2026-09-01T12:00:00.000Z",
      "updated_at": "2026-09-01T12:00:00.000Z"
    }
  ],
  "assignments": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "group_id": "11111111-1111-4111-8111-111111111111",
      "feedings_per_day": 2,
      "label": null,
      "is_active": true,
      "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"
      }
    }
  ]
}

DELETE /v1/farm/{farm_id}/rations/{ration_id}

Delete Ration

Current rations 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. Deletion behavior is described below; a successful status does not imply erasure from all retained history. Marks the stored entity inactive (soft deletion).

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
ration_idpathYes{"type":"string","format":"uuid"}

Request example

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

Responses

StatusMeaningContent type
204Completed; no response body.No body
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

GET /v1/farm/{farm_id}/rations/{ration_id}

Get Ration

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

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations/<ration_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
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
namestringRequired
is_activebooleanRequired
farm_idstringRequired
unitstringRequired
ingredientsarrayRequired
ingredients[]objectRequired
ingredients[].idstringRequired
ingredients[].namestringRequired
ingredients[].per_head_lbsstringRequired
ingredients[].positionintegerRequired
ingredients[].ration_idstringRequired
ingredients[].created_atstringRequiredformat: "date-time"
ingredients[].updated_atstringRequiredformat: "date-time"
assignmentsarrayRequired
assignments[]objectRequired
assignments[].idstringRequired
assignments[].ration_idstringRequired
assignments[].group_idstringRequired
assignments[].feedings_per_dayintegerRequired
assignments[].labelstring or nullRequired
assignments[].is_activebooleanRequired
assignments[].created_atstringRequiredformat: "date-time"
assignments[].updated_atstringRequiredformat: "date-time"
assignments[].groupobjectRequired
assignments[].group.idstringRequired
assignments[].group.namestringRequired
json example
{
  "id": "11111111-1111-4111-8111-111111111111",
  "farm_id": "11111111-1111-4111-8111-111111111111",
  "name": "Hay ration",
  "unit": "lb",
  "is_active": true,
  "created_at": "2026-09-01T12:00:00.000Z",
  "updated_at": "2026-09-01T12:00:00.000Z",
  "ingredients": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "name": "Hay",
      "per_head_lbs": "5.25",
      "position": 0,
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "created_at": "2026-09-01T12:00:00.000Z",
      "updated_at": "2026-09-01T12:00:00.000Z"
    }
  ],
  "assignments": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "group_id": "11111111-1111-4111-8111-111111111111",
      "feedings_per_day": 2,
      "label": null,
      "is_active": true,
      "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"
      }
    }
  ]
}

PUT /v1/farm/{farm_id}/rations/{ration_id}

Update Ration

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

Request body (application/json)

FieldTypePresenceConstraints
namestringOptionalminLength: 1
unitstringOptionalminLength: 1
is_activebooleanOptional
ingredientsarrayOptionalminItems: 1
ingredients[]objectRequired
ingredients[].idstringOptionalformat: "uuid"
ingredients[].namestringRequiredminLength: 1
ingredients[].per_head_lbsnumberRequiredminimum: 0
ingredients[].positionintegerOptionalminimum: 0
json example
{}

Request example

bash example
curl --fail-with-body -X PUT \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations/<ration_id>' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{}'

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
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
namestringRequired
is_activebooleanRequired
farm_idstringRequired
unitstringRequired
ingredientsarrayRequired
ingredients[]objectRequired
ingredients[].idstringRequired
ingredients[].namestringRequired
ingredients[].per_head_lbsstringRequired
ingredients[].positionintegerRequired
ingredients[].ration_idstringRequired
ingredients[].created_atstringRequiredformat: "date-time"
ingredients[].updated_atstringRequiredformat: "date-time"
assignmentsarrayRequired
assignments[]objectRequired
assignments[].idstringRequired
assignments[].ration_idstringRequired
assignments[].group_idstringRequired
assignments[].feedings_per_dayintegerRequired
assignments[].labelstring or nullRequired
assignments[].is_activebooleanRequired
assignments[].created_atstringRequiredformat: "date-time"
assignments[].updated_atstringRequiredformat: "date-time"
assignments[].groupobjectRequired
assignments[].group.idstringRequired
assignments[].group.namestringRequired
json example
{
  "id": "11111111-1111-4111-8111-111111111111",
  "farm_id": "11111111-1111-4111-8111-111111111111",
  "name": "Hay ration",
  "unit": "lb",
  "is_active": true,
  "created_at": "2026-09-01T12:00:00.000Z",
  "updated_at": "2026-09-01T12:00:00.000Z",
  "ingredients": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "name": "Hay",
      "per_head_lbs": "5.25",
      "position": 0,
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "created_at": "2026-09-01T12:00:00.000Z",
      "updated_at": "2026-09-01T12:00:00.000Z"
    }
  ],
  "assignments": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "ration_id": "11111111-1111-4111-8111-111111111111",
      "group_id": "11111111-1111-4111-8111-111111111111",
      "feedings_per_day": 2,
      "label": null,
      "is_active": true,
      "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}/rations/{ration_id}/assignments

Create Assignment

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

Request body (application/json)

FieldTypePresenceConstraints
group_idstringRequiredformat: "uuid"
feedings_per_dayintegerOptionalminimum: 1; maximum: 12
labelstringOptional
is_activebooleanOptional
json example
{
  "group_id": "11111111-1111-4111-8111-111111111111"
}

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations/<ration_id>/assignments' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"group_id":"11111111-1111-4111-8111-111111111111"}'

Responses

StatusMeaningContent type
201Successapplication/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

201 response schema (application/json)

FieldTypePresenceConstraints
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
is_activebooleanRequired
group_idstringRequired
ration_idstringRequired
feedings_per_daynumberRequired
label (variant 1)nullRequired
label (variant 2)stringRequired
json example
{
  "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,
  "group_id": "11111111-1111-4111-8111-111111111111",
  "ration_id": "11111111-1111-4111-8111-111111111111",
  "feedings_per_day": 1,
  "label": null
}

DELETE /v1/farm/{farm_id}/rations/{ration_id}/assignments/{assignment_id}

Delete Assignment

Current rations 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. Deletion behavior is described below; a successful status does not imply erasure from all retained history. Marks the stored entity inactive (soft deletion).

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
ration_idpathYes{"type":"string","format":"uuid"}
assignment_idpathYes{"type":"string","format":"uuid"}

Request example

bash example
curl --fail-with-body -X DELETE \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations/<ration_id>/assignments/<assignment_id>' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
204Completed; no response body.No body
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

PUT /v1/farm/{farm_id}/rations/{ration_id}/assignments/{assignment_id}

Update Assignment

Current rations 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"}
ration_idpathYes{"type":"string","format":"uuid"}
assignment_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
feedings_per_dayintegerOptionalminimum: 1; maximum: 12
labelstring or nullOptional
is_activebooleanOptional
json example
{}

Request example

bash example
curl --fail-with-body -X PUT \
  'https://api.ranch.bot/v1/farm/<farm_id>/rations/<ration_id>/assignments/<assignment_id>' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{}'

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
idstringRequired
created_atstringRequiredformat: "date-time"
updated_atstringRequiredformat: "date-time"
is_activebooleanRequired
group_idstringRequired
ration_idstringRequired
feedings_per_daynumberRequired
label (variant 1)nullRequired
label (variant 2)stringRequired
json example
{
  "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,
  "group_id": "11111111-1111-4111-8111-111111111111",
  "ration_id": "11111111-1111-4111-8111-111111111111",
  "feedings_per_day": 1,
  "label": null
}

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