Ranch.Bot
Skip to reference

Birth history API

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

GET /v1/farm/{farm_id}/birth-history/settings

Read producer birth-history settings

Requires read:records. Settings are species-bound and provide no biological defaults.

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

Request example

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

Responses

StatusMeaningContent type
200Farm-scoped birth historyapplication/json
401Authentication requiredNo body
403Current farm access and required scopes requiredNo body
404Farm or animal not foundNo body

200 response schema (application/json)

FieldTypePresenceConstraints
speciesstringRequired
settings (variant 1)objectRequired
settings (variant 1).versionnumberRequiredconst: 1
settings (variant 1).speciesstringRequiredenum: ["BISON","CATTLE","ELK","GOAT","HORSE","OTHER","SHEEP"]
settings (variant 1).gestation_daysobjectOptional
settings (variant 1).gestation_days.minintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).gestation_days.maxintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).minimum_sire_age_daysintegerOptionalminimum: 1; maximum: 10000
settings (variant 1).birth_windowsarrayOptionalmaxItems: 40; default: []
settings (variant 1).birth_windows[]objectRequired
settings (variant 1).birth_windows[].labelstringRequiredminLength: 1; maxLength: 80
settings (variant 1).birth_windows[].start_datestringRequired
settings (variant 1).birth_windows[].end_datestringRequired
settings (variant 2)nullRequired

PUT /v1/farm/{farm_id}/birth-history/settings

Replace producer birth-history settings

Requires write:records and current editor membership. The producer supplies species gestation/age intervals and zero-to-many absolute birth windows. An empty window list means no planned windows. Configuration changes invalidate earlier birth previews.

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

Request body (application/json)

FieldTypePresenceConstraints
versionnumberRequiredconst: 1
speciesstringRequiredenum: ["BISON","CATTLE","ELK","GOAT","HORSE","OTHER","SHEEP"]
gestation_daysobjectOptional
gestation_days.minintegerRequiredminimum: 1; maximum: 2000
gestation_days.maxintegerRequiredminimum: 1; maximum: 2000
minimum_sire_age_daysintegerOptionalminimum: 1; maximum: 10000
birth_windowsarrayOptionalmaxItems: 40; default: []
birth_windows[]objectRequired
birth_windows[].labelstringRequiredminLength: 1; maxLength: 80
birth_windows[].start_datestringRequired
birth_windows[].end_datestringRequired

Create request.json with a JSON body matching the request schema above before running this example.

Request example

bash example
curl --fail-with-body -X PUT \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-history/settings' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

Responses

StatusMeaningContent type
200Farm-scoped birth historyapplication/json
400Invalid dates, bounds, or mismatched speciesNo body
401Authentication requiredNo body
403Current farm access and required scopes requiredNo body
404Farm or animal not foundNo body

200 response schema (application/json)

FieldTypePresenceConstraints
speciesstringRequired
settings (variant 1)objectRequired
settings (variant 1).versionnumberRequiredconst: 1
settings (variant 1).speciesstringRequiredenum: ["BISON","CATTLE","ELK","GOAT","HORSE","OTHER","SHEEP"]
settings (variant 1).gestation_daysobjectOptional
settings (variant 1).gestation_days.minintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).gestation_days.maxintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).minimum_sire_age_daysintegerOptionalminimum: 1; maximum: 10000
settings (variant 1).birth_windowsarrayOptionalmaxItems: 40; default: []
settings (variant 1).birth_windows[]objectRequired
settings (variant 1).birth_windows[].labelstringRequiredminLength: 1; maxLength: 80
settings (variant 1).birth_windows[].start_datestringRequired
settings (variant 1).birth_windows[].end_datestringRequired
settings (variant 2)nullRequired

GET /v1/farm/{farm_id}/birth-history/evidence

Review explicit dated birth history

Requires read:records and read:animals. Compares configured windows with dated farm-scoped RecordItem.metadata.birth_history facts. Current group membership is never historical evidence. Missing sex, birth date, intact-at-exposure or age settings remain unknown; a sole plausible exposure may propose a presumed sire with source provenance and a conservative review score, never DNA confidence. No parentage or breeding records are written.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
dam_idqueryYes{"type":"string","format":"uuid"}
birth_datequeryYes{"type":"string","pattern":"^\d{4}-\d{2}-\d{2}$"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-history/evidence?dam_id=PLACEHOLDER_DAM_ID&birth_date=PLACEHOLDER_BIRTH_DATE' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
200Farm-scoped birth historyapplication/json
401Authentication requiredNo body
403Current farm access and required scopes requiredNo body
404Farm or animal not foundNo body

200 response schema (application/json)

FieldTypePresenceConstraints
evidence_versionnumberRequiredconst: 1
settings (variant 1)objectRequired
settings (variant 1).versionnumberRequiredconst: 1
settings (variant 1).speciesstringRequiredenum: ["BISON","CATTLE","ELK","GOAT","HORSE","OTHER","SHEEP"]
settings (variant 1).gestation_daysobjectOptional
settings (variant 1).gestation_days.minintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).gestation_days.maxintegerRequiredminimum: 1; maximum: 2000
settings (variant 1).minimum_sire_age_daysintegerOptionalminimum: 1; maximum: 10000
settings (variant 1).birth_windowsarrayOptionalmaxItems: 40; default: []
settings (variant 1).birth_windows[]objectRequired
settings (variant 1).birth_windows[].labelstringRequiredminLength: 1; maxLength: 80
settings (variant 1).birth_windows[].start_datestringRequired
settings (variant 1).birth_windows[].end_datestringRequired
settings (variant 2)nullRequired
settings_statusstringRequiredenum: ["configured","not_configured"]
planned_window_statusstringRequiredenum: ["within","outside","not_configured"]
matching_birth_windowsarrayOptionalmaxItems: 40; default: []
matching_birth_windows[]objectRequired
matching_birth_windows[].labelstringRequiredminLength: 1; maxLength: 80
matching_birth_windows[].start_datestringRequired
matching_birth_windows[].end_datestringRequired
conception_window (variant 1)objectRequired
conception_window (variant 1).start_datestringRequired
conception_window (variant 1).end_datestringRequired
conception_window (variant 2)nullRequired
sireobjectRequired
sire.statusstringRequiredenum: ["unknown","candidates","presumed"]
sire.animal_idstringOptionalformat: "uuid"
sire.confidencenumberOptionalminimum: 0; maximum: 1
sire.provenancestringOptionalmaxLength: 1000
sire.presumed_crossstringOptionalmaxLength: 220
sire.candidatesarrayRequiredmaxItems: 128
sire.candidates[]objectRequired
sire.candidates[].animal_idstringRequiredformat: "uuid"
sire.candidates[].eligibilitystringRequiredenum: ["plausible","unknown","excluded"]
sire.candidates[].reasonsarrayRequiredmaxItems: 16
sire.candidates[].reasons[]stringRequiredmaxLength: 1000
sire.candidates[].exposure_record_idsarrayRequiredmaxItems: 128
sire.candidates[].exposure_record_ids[]stringRequiredformat: "uuid"
sire.candidates[].exposure_record_item_idsarrayRequiredmaxItems: 128
sire.candidates[].exposure_record_item_ids[]stringRequiredformat: "uuid"
sire.candidates[].membership_record_idsarrayRequiredmaxItems: 128
sire.candidates[].membership_record_ids[]stringRequiredformat: "uuid"
sire.candidates[].membership_record_item_idsarrayRequiredmaxItems: 128
sire.candidates[].membership_record_item_ids[]stringRequiredformat: "uuid"
sire.candidates[].overlap_intervalsarrayRequiredmaxItems: 128
sire.candidates[].overlap_intervals[]objectRequired
sire.candidates[].overlap_intervals[].start_datestringRequired
sire.candidates[].overlap_intervals[].end_datestringRequired
sire.candidates[].breedstringOptionalmaxLength: 100
movement_comparisonsarrayRequiredmaxItems: 128
movement_comparisons[]objectRequired
movement_comparisons[].record_idstringRequiredformat: "uuid"
movement_comparisons[].record_item_idstringRequiredformat: "uuid"
movement_comparisons[].kindstringRequiredenum: ["purchase","movement_in","movement_out"]
movement_comparisons[].datestringRequired
movement_comparisons[].relation_to_conceptionstringRequiredenum: ["before","within","after","unknown"]
unresolvedarrayRequiredmaxItems: 64
unresolved[]stringRequiredmaxLength: 1000

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