Ranch.Bot
Skip to reference

Birth events API

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

POST /v1/farm/{farm_id}/birth-events/preview

Preview a birth event

Validate without saving farm data. Display the entire returned bundle and resolved review. Obtain explicit producer approval of this exact preview before confirmation. A read-only device session cannot call POST; an EDITOR device session needs read:records and a write scope. External credential scopes: read:records. Minimum farm role: EDITOR.

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

Request body (application/json)

FieldTypePresenceConstraints
request_idstringRequiredformat: "uuid"
bundleobjectRequired
bundle.dam_idstringRequiredformat: "uuid"
bundle.birth_datestringRequired
bundle.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
bundle.dam_updateobjectOptional
bundle.dam_update.kindstringOptionalminLength: 1; maxLength: 80
bundle.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
bundle.maternal_observationsarrayOptionalmaxItems: 20; default: []
bundle.maternal_observations[]objectRequired
bundle.maternal_observations[].datestringRequired
bundle.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.lactation_observationsarrayOptionalmaxItems: 20; default: []
bundle.lactation_observations[]objectRequired
bundle.lactation_observations[].datestringRequired
bundle.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspringarrayRequiredminItems: 1; maxItems: 20
bundle.offspring[]objectRequired
bundle.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].sexstringRequiredenum: ["male","female","unknown"]
bundle.offspring[].birth_weightobjectOptional
bundle.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
bundle.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
bundle.offspring[].vigorarrayOptionalmaxItems: 20; default: []
bundle.offspring[].vigor[]objectRequired
bundle.offspring[].vigor[].datestringRequired
bundle.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
bundle.offspring[].supplementation[]objectRequired
bundle.offspring[].supplementation[].datestringRequired
bundle.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
bundle.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
bundle.sireobjectOptionaldefault: {"status":"unknown"}
bundle.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
bundle.sire.animal_idstringOptionalformat: "uuid"
bundle.sire.provenancestringOptionalminLength: 1; maxLength: 1000
bundle.sire.confidencenumberOptionalminimum: 0; maximum: 1
bundle.protocolobjectOptional
bundle.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
bundle.protocol.completed_datestringRequired
bundle.protocol.version_idstringOptionalformat: "uuid"
bundle.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.follow_uparrayOptionalmaxItems: 20; default: []
bundle.follow_up[]objectRequired
bundle.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
bundle.follow_up[].due_datestringOptional
bundle.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.group_idsarrayOptionalmaxItems: 20; default: []
bundle.group_ids[]stringRequiredformat: "uuid"
bundle.current_locationstringOptionalminLength: 1; maxLength: 80
bundle.source_sms_idstringOptionalformat: "uuid"
bundle.source_message_idstringOptionalformat: "uuid"
bundle.evidencearrayOptionalmaxItems: 20; default: []
bundle.evidence[]objectRequired
bundle.evidence[].file_idstringRequiredformat: "uuid"
bundle.evidence[].media_idstringOptionalformat: "uuid"
bundle.evidence[].link_to_dambooleanOptionaldefault: false
bundle.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
bundle.unresolvedarrayOptionalmaxItems: 30; default: []
bundle.unresolved[]stringRequiredminLength: 1; maxLength: 1000
bundle.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
bundle.additional_source_sms_ids[]stringRequiredformat: "uuid"

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 POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-events/preview' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

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
409The approved preview is stale, the request ID is already used, or the protocol version has different steps.application/json
429Rate limit exceeded. Retry after the indicated delay.application/json
500Unexpected server failure.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
request_idstringRequiredformat: "uuid"
bundleobjectRequired
bundle.dam_idstringRequiredformat: "uuid"
bundle.birth_datestringRequired
bundle.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
bundle.dam_updateobjectOptional
bundle.dam_update.kindstringOptionalminLength: 1; maxLength: 80
bundle.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
bundle.maternal_observationsarrayOptionalmaxItems: 20; default: []
bundle.maternal_observations[]objectRequired
bundle.maternal_observations[].datestringRequired
bundle.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.lactation_observationsarrayOptionalmaxItems: 20; default: []
bundle.lactation_observations[]objectRequired
bundle.lactation_observations[].datestringRequired
bundle.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspringarrayRequiredminItems: 1; maxItems: 20
bundle.offspring[]objectRequired
bundle.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].sexstringRequiredenum: ["male","female","unknown"]
bundle.offspring[].birth_weightobjectOptional
bundle.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
bundle.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
bundle.offspring[].vigorarrayOptionalmaxItems: 20; default: []
bundle.offspring[].vigor[]objectRequired
bundle.offspring[].vigor[].datestringRequired
bundle.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
bundle.offspring[].supplementation[]objectRequired
bundle.offspring[].supplementation[].datestringRequired
bundle.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
bundle.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
bundle.sireobjectOptionaldefault: {"status":"unknown"}
bundle.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
bundle.sire.animal_idstringOptionalformat: "uuid"
bundle.sire.provenancestringOptionalminLength: 1; maxLength: 1000
bundle.sire.confidencenumberOptionalminimum: 0; maximum: 1
bundle.protocolobjectOptional
bundle.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
bundle.protocol.completed_datestringRequired
bundle.protocol.version_idstringOptionalformat: "uuid"
bundle.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.follow_uparrayOptionalmaxItems: 20; default: []
bundle.follow_up[]objectRequired
bundle.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
bundle.follow_up[].due_datestringOptional
bundle.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.group_idsarrayOptionalmaxItems: 20; default: []
bundle.group_ids[]stringRequiredformat: "uuid"
bundle.current_locationstringOptionalminLength: 1; maxLength: 80
bundle.source_sms_idstringOptionalformat: "uuid"
bundle.source_message_idstringOptionalformat: "uuid"
bundle.evidencearrayOptionalmaxItems: 20; default: []
bundle.evidence[]objectRequired
bundle.evidence[].file_idstringRequiredformat: "uuid"
bundle.evidence[].media_idstringOptionalformat: "uuid"
bundle.evidence[].link_to_dambooleanOptionaldefault: false
bundle.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
bundle.unresolvedarrayOptionalmaxItems: 30; default: []
bundle.unresolved[]stringRequiredminLength: 1; maxLength: 1000
bundle.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
bundle.additional_source_sms_ids[]stringRequiredformat: "uuid"
confirmation_hashstringRequired
reviewobjectRequired

POST /v1/farm/{farm_id}/birth-events

Confirm a reviewed birth event

Save all reviewed animals, observations, relationships, care records, tasks and evidence in one transaction. Submit only request_id, bundle and confirmation_hash from the approved preview. Reusing the exact request is idempotent. A changed hash or reused request ID with different data returns 409; obtain approval of a fresh preview after corrections or changed farm evidence. External credential scopes: write:records, write:animals, write:groups. Minimum farm role: EDITOR.

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

Request body (application/json)

FieldTypePresenceConstraints
request_idstringRequiredformat: "uuid"
bundleobjectRequired
bundle.dam_idstringRequiredformat: "uuid"
bundle.birth_datestringRequired
bundle.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
bundle.dam_updateobjectOptional
bundle.dam_update.kindstringOptionalminLength: 1; maxLength: 80
bundle.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
bundle.maternal_observationsarrayOptionalmaxItems: 20; default: []
bundle.maternal_observations[]objectRequired
bundle.maternal_observations[].datestringRequired
bundle.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.lactation_observationsarrayOptionalmaxItems: 20; default: []
bundle.lactation_observations[]objectRequired
bundle.lactation_observations[].datestringRequired
bundle.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspringarrayRequiredminItems: 1; maxItems: 20
bundle.offspring[]objectRequired
bundle.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].sexstringRequiredenum: ["male","female","unknown"]
bundle.offspring[].birth_weightobjectOptional
bundle.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
bundle.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
bundle.offspring[].vigorarrayOptionalmaxItems: 20; default: []
bundle.offspring[].vigor[]objectRequired
bundle.offspring[].vigor[].datestringRequired
bundle.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
bundle.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
bundle.offspring[].supplementation[]objectRequired
bundle.offspring[].supplementation[].datestringRequired
bundle.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
bundle.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
bundle.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
bundle.sireobjectOptionaldefault: {"status":"unknown"}
bundle.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
bundle.sire.animal_idstringOptionalformat: "uuid"
bundle.sire.provenancestringOptionalminLength: 1; maxLength: 1000
bundle.sire.confidencenumberOptionalminimum: 0; maximum: 1
bundle.protocolobjectOptional
bundle.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
bundle.protocol.completed_datestringRequired
bundle.protocol.version_idstringOptionalformat: "uuid"
bundle.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.follow_uparrayOptionalmaxItems: 20; default: []
bundle.follow_up[]objectRequired
bundle.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
bundle.follow_up[].due_datestringOptional
bundle.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.group_idsarrayOptionalmaxItems: 20; default: []
bundle.group_ids[]stringRequiredformat: "uuid"
bundle.current_locationstringOptionalminLength: 1; maxLength: 80
bundle.source_sms_idstringOptionalformat: "uuid"
bundle.source_message_idstringOptionalformat: "uuid"
bundle.evidencearrayOptionalmaxItems: 20; default: []
bundle.evidence[]objectRequired
bundle.evidence[].file_idstringRequiredformat: "uuid"
bundle.evidence[].media_idstringOptionalformat: "uuid"
bundle.evidence[].link_to_dambooleanOptionaldefault: false
bundle.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
bundle.unresolvedarrayOptionalmaxItems: 30; default: []
bundle.unresolved[]stringRequiredminLength: 1; maxLength: 1000
bundle.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
bundle.additional_source_sms_ids[]stringRequiredformat: "uuid"
confirmation_hashstringRequired

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 POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-events' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

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
409The approved preview is stale, the request ID is already used, or the protocol version has different steps.application/json
429Rate limit exceeded. Retry after the indicated delay.application/json
500Unexpected server failure.application/json

201 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
farm_idstringRequiredformat: "uuid"
request_idstringRequiredformat: "uuid"
confirmation_hashstringRequired
created_by_user_idstringRequiredformat: "uuid"
dam_idstringRequiredformat: "uuid"
birth_datestringRequiredformat: "date-time"
time_precisionstring or nullRequired
bundleobjectRequired
bundle.inputobjectRequired
bundle.input.dam_idstringRequiredformat: "uuid"
bundle.input.birth_datestringRequired
bundle.input.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
bundle.input.dam_updateobjectOptional
bundle.input.dam_update.kindstringOptionalminLength: 1; maxLength: 80
bundle.input.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
bundle.input.maternal_observationsarrayOptionalmaxItems: 20; default: []
bundle.input.maternal_observations[]objectRequired
bundle.input.maternal_observations[].datestringRequired
bundle.input.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.lactation_observationsarrayOptionalmaxItems: 20; default: []
bundle.input.lactation_observations[]objectRequired
bundle.input.lactation_observations[].datestringRequired
bundle.input.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.offspringarrayRequiredminItems: 1; maxItems: 20
bundle.input.offspring[]objectRequired
bundle.input.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].sexstringRequiredenum: ["male","female","unknown"]
bundle.input.offspring[].birth_weightobjectOptional
bundle.input.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
bundle.input.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
bundle.input.offspring[].vigorarrayOptionalmaxItems: 20; default: []
bundle.input.offspring[].vigor[]objectRequired
bundle.input.offspring[].vigor[].datestringRequired
bundle.input.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
bundle.input.offspring[].supplementation[]objectRequired
bundle.input.offspring[].supplementation[].datestringRequired
bundle.input.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
bundle.input.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
bundle.input.sireobjectOptionaldefault: {"status":"unknown"}
bundle.input.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
bundle.input.sire.animal_idstringOptionalformat: "uuid"
bundle.input.sire.provenancestringOptionalminLength: 1; maxLength: 1000
bundle.input.sire.confidencenumberOptionalminimum: 0; maximum: 1
bundle.input.protocolobjectOptional
bundle.input.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
bundle.input.protocol.completed_datestringRequired
bundle.input.protocol.version_idstringOptionalformat: "uuid"
bundle.input.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.input.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.input.follow_uparrayOptionalmaxItems: 20; default: []
bundle.input.follow_up[]objectRequired
bundle.input.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
bundle.input.follow_up[].due_datestringOptional
bundle.input.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.input.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.input.group_idsarrayOptionalmaxItems: 20; default: []
bundle.input.group_ids[]stringRequiredformat: "uuid"
bundle.input.current_locationstringOptionalminLength: 1; maxLength: 80
bundle.input.source_sms_idstringOptionalformat: "uuid"
bundle.input.source_message_idstringOptionalformat: "uuid"
bundle.input.evidencearrayOptionalmaxItems: 20; default: []
bundle.input.evidence[]objectRequired
bundle.input.evidence[].file_idstringRequiredformat: "uuid"
bundle.input.evidence[].media_idstringOptionalformat: "uuid"
bundle.input.evidence[].link_to_dambooleanOptionaldefault: false
bundle.input.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
bundle.input.unresolvedarrayOptionalmaxItems: 30; default: []
bundle.input.unresolved[]stringRequiredminLength: 1; maxLength: 1000
bundle.input.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
bundle.input.additional_source_sms_ids[]stringRequiredformat: "uuid"
bundle.reviewobjectRequired
record_idstringRequiredformat: "uuid"
source_sms_idstring or nullRequiredformat: "uuid"
source_message_idstring or nullRequiredformat: "uuid"
agent_action_idstring or nullRequiredformat: "uuid"
created_atstringRequiredformat: "date-time"
offspringarrayRequired
offspring[]objectRequired
offspring[].idstringRequiredformat: "uuid"
offspring[].birth_event_idstringRequiredformat: "uuid"
offspring[].animal_idstringRequiredformat: "uuid"
offspring[].review_labelstringRequired
offspring[].positionintegerRequired
offspring[].detailsobjectRequired
tasksarrayRequired
tasks[]objectRequired
tasks[].idstringRequiredformat: "uuid"
tasks[].farm_idstringRequiredformat: "uuid"
tasks[].birth_event_idstringRequiredformat: "uuid"
tasks[].namestringRequired
tasks[].statusstringRequiredenum: ["TODO","DONE","CANCELLED"]
tasks[].due_datestring or nullRequiredformat: "date-time"
tasks[].created_atstringRequiredformat: "date-time"
tasks[].updated_atstringRequiredformat: "date-time"
tasks[].animalsarrayOptional
tasks[].animals[]objectRequired
tasks[].animals[].idstringRequiredformat: "uuid"
recordobjectRequired
record.idstringRequiredformat: "uuid"
record.filesarrayRequired
record.files[]objectRequired
record.files[].idstringRequiredformat: "uuid"
record.files[].namestringRequired
record.files[].mime_typestringRequired
care_recordsarrayRequired
care_records[]objectRequired
care_records[].idstringRequiredformat: "uuid"
care_records[].namestringRequired
care_records[].applied_atstring or nullRequiredformat: "date-time"
care_records[].record_itemsarrayRequired
care_records[].record_items[]objectRequired

GET /v1/farm/{farm_id}/birth-events

List birth events

List saved births with pagination, optionally filtered by dam or offspring animal_id. External credential scopes: read:records. Minimum farm role: READER.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
skipqueryNo{"type":"integer","minimum":0,"default":0}
takequeryNo{"type":"integer","minimum":1,"maximum":200,"default":50}
animal_idqueryNo{"type":"string","format":"uuid"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-events' \
  -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
totalintegerRequiredminimum: 0
recordsarrayRequired
records[]objectRequired
records[].idstringRequiredformat: "uuid"
records[].farm_idstringRequiredformat: "uuid"
records[].request_idstringRequiredformat: "uuid"
records[].confirmation_hashstringRequired
records[].created_by_user_idstringRequiredformat: "uuid"
records[].dam_idstringRequiredformat: "uuid"
records[].birth_datestringRequiredformat: "date-time"
records[].time_precisionstring or nullRequired
records[].bundleobjectRequired
records[].bundle.inputobjectRequired
records[].bundle.input.dam_idstringRequiredformat: "uuid"
records[].bundle.input.birth_datestringRequired
records[].bundle.input.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
records[].bundle.input.dam_updateobjectOptional
records[].bundle.input.dam_update.kindstringOptionalminLength: 1; maxLength: 80
records[].bundle.input.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
records[].bundle.input.maternal_observationsarrayOptionalmaxItems: 20; default: []
records[].bundle.input.maternal_observations[]objectRequired
records[].bundle.input.maternal_observations[].datestringRequired
records[].bundle.input.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.lactation_observationsarrayOptionalmaxItems: 20; default: []
records[].bundle.input.lactation_observations[]objectRequired
records[].bundle.input.lactation_observations[].datestringRequired
records[].bundle.input.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.offspringarrayRequiredminItems: 1; maxItems: 20
records[].bundle.input.offspring[]objectRequired
records[].bundle.input.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
records[].bundle.input.offspring[].sexstringRequiredenum: ["male","female","unknown"]
records[].bundle.input.offspring[].birth_weightobjectOptional
records[].bundle.input.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
records[].bundle.input.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
records[].bundle.input.offspring[].vigorarrayOptionalmaxItems: 20; default: []
records[].bundle.input.offspring[].vigor[]objectRequired
records[].bundle.input.offspring[].vigor[].datestringRequired
records[].bundle.input.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
records[].bundle.input.offspring[].supplementation[]objectRequired
records[].bundle.input.offspring[].supplementation[].datestringRequired
records[].bundle.input.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
records[].bundle.input.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
records[].bundle.input.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
records[].bundle.input.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.sireobjectOptionaldefault: {"status":"unknown"}
records[].bundle.input.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
records[].bundle.input.sire.animal_idstringOptionalformat: "uuid"
records[].bundle.input.sire.provenancestringOptionalminLength: 1; maxLength: 1000
records[].bundle.input.sire.confidencenumberOptionalminimum: 0; maximum: 1
records[].bundle.input.protocolobjectOptional
records[].bundle.input.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
records[].bundle.input.protocol.completed_datestringRequired
records[].bundle.input.protocol.version_idstringOptionalformat: "uuid"
records[].bundle.input.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
records[].bundle.input.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
records[].bundle.input.follow_uparrayOptionalmaxItems: 20; default: []
records[].bundle.input.follow_up[]objectRequired
records[].bundle.input.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.follow_up[].due_datestringOptional
records[].bundle.input.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
records[].bundle.input.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
records[].bundle.input.group_idsarrayOptionalmaxItems: 20; default: []
records[].bundle.input.group_ids[]stringRequiredformat: "uuid"
records[].bundle.input.current_locationstringOptionalminLength: 1; maxLength: 80
records[].bundle.input.source_sms_idstringOptionalformat: "uuid"
records[].bundle.input.source_message_idstringOptionalformat: "uuid"
records[].bundle.input.evidencearrayOptionalmaxItems: 20; default: []
records[].bundle.input.evidence[]objectRequired
records[].bundle.input.evidence[].file_idstringRequiredformat: "uuid"
records[].bundle.input.evidence[].media_idstringOptionalformat: "uuid"
records[].bundle.input.evidence[].link_to_dambooleanOptionaldefault: false
records[].bundle.input.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
records[].bundle.input.unresolvedarrayOptionalmaxItems: 30; default: []
records[].bundle.input.unresolved[]stringRequiredminLength: 1; maxLength: 1000
records[].bundle.input.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
records[].bundle.input.additional_source_sms_ids[]stringRequiredformat: "uuid"
records[].bundle.reviewobjectRequired
records[].record_idstringRequiredformat: "uuid"
records[].source_sms_idstring or nullRequiredformat: "uuid"
records[].source_message_idstring or nullRequiredformat: "uuid"
records[].agent_action_idstring or nullRequiredformat: "uuid"
records[].created_atstringRequiredformat: "date-time"
records[].offspringarrayRequired
records[].offspring[]objectRequired
records[].offspring[].idstringRequiredformat: "uuid"
records[].offspring[].birth_event_idstringRequiredformat: "uuid"
records[].offspring[].animal_idstringRequiredformat: "uuid"
records[].offspring[].review_labelstringRequired
records[].offspring[].positionintegerRequired
records[].offspring[].detailsobjectRequired
records[].tasksarrayRequired
records[].tasks[]objectRequired
records[].tasks[].idstringRequiredformat: "uuid"
records[].tasks[].farm_idstringRequiredformat: "uuid"
records[].tasks[].birth_event_idstringRequiredformat: "uuid"
records[].tasks[].namestringRequired
records[].tasks[].statusstringRequiredenum: ["TODO","DONE","CANCELLED"]
records[].tasks[].due_datestring or nullRequiredformat: "date-time"
records[].tasks[].created_atstringRequiredformat: "date-time"
records[].tasks[].updated_atstringRequiredformat: "date-time"
records[].tasks[].animalsarrayOptional
records[].tasks[].animals[]objectRequired
records[].tasks[].animals[].idstringRequiredformat: "uuid"
records[].recordobjectRequired
records[].record.idstringRequiredformat: "uuid"
records[].record.filesarrayRequired
records[].record.files[]objectRequired
records[].record.files[].idstringRequiredformat: "uuid"
records[].record.files[].namestringRequired
records[].record.files[].mime_typestringRequired
records[].care_recordsarrayRequired
records[].care_records[]objectRequired
records[].care_records[].idstringRequiredformat: "uuid"
records[].care_records[].namestringRequired
records[].care_records[].applied_atstring or nullRequiredformat: "date-time"
records[].care_records[].record_itemsarrayRequired
records[].care_records[].record_items[]objectRequired

GET /v1/farm/{farm_id}/birth-events/{event_id}

Get a birth event

Retrieve a saved birth and its accessible evidence from the current farm. External credential scopes: read:records. Minimum farm role: READER.

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

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/birth-events/<event_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
idstringRequiredformat: "uuid"
farm_idstringRequiredformat: "uuid"
request_idstringRequiredformat: "uuid"
confirmation_hashstringRequired
created_by_user_idstringRequiredformat: "uuid"
dam_idstringRequiredformat: "uuid"
birth_datestringRequiredformat: "date-time"
time_precisionstring or nullRequired
bundleobjectRequired
bundle.inputobjectRequired
bundle.input.dam_idstringRequiredformat: "uuid"
bundle.input.birth_datestringRequired
bundle.input.time_precisionstringOptionalenum: ["date_only","morning","afternoon","evening","night"]; default: "date_only"
bundle.input.dam_updateobjectOptional
bundle.input.dam_update.kindstringOptionalminLength: 1; maxLength: 80
bundle.input.dam_update.notesstringOptionalminLength: 1; maxLength: 1000
bundle.input.maternal_observationsarrayOptionalmaxItems: 20; default: []
bundle.input.maternal_observations[]objectRequired
bundle.input.maternal_observations[].datestringRequired
bundle.input.maternal_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.lactation_observationsarrayOptionalmaxItems: 20; default: []
bundle.input.lactation_observations[]objectRequired
bundle.input.lactation_observations[].datestringRequired
bundle.input.lactation_observations[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.offspringarrayRequiredminItems: 1; maxItems: 20
bundle.input.offspring[]objectRequired
bundle.input.offspring[].review_labelstringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].sexstringRequiredenum: ["male","female","unknown"]
bundle.input.offspring[].birth_weightobjectOptional
bundle.input.offspring[].birth_weight.valuenumberRequiredmaximum: 1000
bundle.input.offspring[].birth_weight.unitstringRequiredenum: ["kg","lb"]
bundle.input.offspring[].vigorarrayOptionalmaxItems: 20; default: []
bundle.input.offspring[].vigor[]objectRequired
bundle.input.offspring[].vigor[].datestringRequired
bundle.input.offspring[].vigor[].textstringRequiredminLength: 1; maxLength: 1000
bundle.input.offspring[].supplementationarrayOptionalmaxItems: 20; default: []
bundle.input.offspring[].supplementation[]objectRequired
bundle.input.offspring[].supplementation[].datestringRequired
bundle.input.offspring[].supplementation[].substancestringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].supplementation[].amountnumberRequiredmaximum: 100000
bundle.input.offspring[].supplementation[].unitstringRequiredminLength: 1; maxLength: 80
bundle.input.offspring[].supplementation[].sourcestringRequiredminLength: 1; maxLength: 1000
bundle.input.sireobjectOptionaldefault: {"status":"unknown"}
bundle.input.sire.statusstringRequiredenum: ["unknown","presumed","confirmed"]
bundle.input.sire.animal_idstringOptionalformat: "uuid"
bundle.input.sire.provenancestringOptionalminLength: 1; maxLength: 1000
bundle.input.sire.confidencenumberOptionalminimum: 0; maximum: 1
bundle.input.protocolobjectOptional
bundle.input.protocol.claimed_namestringRequiredminLength: 1; maxLength: 80
bundle.input.protocol.completed_datestringRequired
bundle.input.protocol.version_idstringOptionalformat: "uuid"
bundle.input.protocol.offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.input.protocol.offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.input.follow_uparrayOptionalmaxItems: 20; default: []
bundle.input.follow_up[]objectRequired
bundle.input.follow_up[].namestringRequiredminLength: 1; maxLength: 1000
bundle.input.follow_up[].due_datestringOptional
bundle.input.follow_up[].offspring_labelsarrayRequiredminItems: 1; maxItems: 20
bundle.input.follow_up[].offspring_labels[]stringRequiredminLength: 1; maxLength: 80
bundle.input.group_idsarrayOptionalmaxItems: 20; default: []
bundle.input.group_ids[]stringRequiredformat: "uuid"
bundle.input.current_locationstringOptionalminLength: 1; maxLength: 80
bundle.input.source_sms_idstringOptionalformat: "uuid"
bundle.input.source_message_idstringOptionalformat: "uuid"
bundle.input.evidencearrayOptionalmaxItems: 20; default: []
bundle.input.evidence[]objectRequired
bundle.input.evidence[].file_idstringRequiredformat: "uuid"
bundle.input.evidence[].media_idstringOptionalformat: "uuid"
bundle.input.evidence[].link_to_dambooleanOptionaldefault: false
bundle.input.evidence[].offspring_labelstringOptionalminLength: 1; maxLength: 80
bundle.input.unresolvedarrayOptionalmaxItems: 30; default: []
bundle.input.unresolved[]stringRequiredminLength: 1; maxLength: 1000
bundle.input.additional_source_sms_idsarrayOptionalmaxItems: 20; default: []
bundle.input.additional_source_sms_ids[]stringRequiredformat: "uuid"
bundle.reviewobjectRequired
record_idstringRequiredformat: "uuid"
source_sms_idstring or nullRequiredformat: "uuid"
source_message_idstring or nullRequiredformat: "uuid"
agent_action_idstring or nullRequiredformat: "uuid"
created_atstringRequiredformat: "date-time"
offspringarrayRequired
offspring[]objectRequired
offspring[].idstringRequiredformat: "uuid"
offspring[].birth_event_idstringRequiredformat: "uuid"
offspring[].animal_idstringRequiredformat: "uuid"
offspring[].review_labelstringRequired
offspring[].positionintegerRequired
offspring[].detailsobjectRequired
tasksarrayRequired
tasks[]objectRequired
tasks[].idstringRequiredformat: "uuid"
tasks[].farm_idstringRequiredformat: "uuid"
tasks[].birth_event_idstringRequiredformat: "uuid"
tasks[].namestringRequired
tasks[].statusstringRequiredenum: ["TODO","DONE","CANCELLED"]
tasks[].due_datestring or nullRequiredformat: "date-time"
tasks[].created_atstringRequiredformat: "date-time"
tasks[].updated_atstringRequiredformat: "date-time"
tasks[].animalsarrayOptional
tasks[].animals[]objectRequired
tasks[].animals[].idstringRequiredformat: "uuid"
recordobjectRequired
record.idstringRequiredformat: "uuid"
record.filesarrayRequired
record.files[]objectRequired
record.files[].idstringRequiredformat: "uuid"
record.files[].namestringRequired
record.files[].mime_typestringRequired
care_recordsarrayRequired
care_records[]objectRequired
care_records[].idstringRequiredformat: "uuid"
care_records[].namestringRequired
care_records[].applied_atstring or nullRequiredformat: "date-time"
care_records[].record_itemsarrayRequired
care_records[].record_items[]objectRequired

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