Ranch.Bot
Skip to reference

Birth sources API

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

GET /v1/farm/{farm_id}/birth-sources/{source_sms_id}

Read retained birth-source evidence

Returns ordered attachment processing status and current farm-matched numeric tag candidates for the original source author with current farm membership. Requires read:records and read:animals for external credentials. No source URLs, signed URLs, raw OCR text, or image bytes are returned. Partial or uncertain candidates require producer selection; this operation writes no farm records.

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

Request example

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

Responses

StatusMeaningContent type
200Private source evidenceapplication/json
401Authentication requiredNo body
403Required read scope missingNo body
404Source unavailable to the current user and farmNo body

200 response schema (application/json)

FieldTypePresenceConstraints
source_sms_idstringRequiredformat: "uuid"
source_message_idstring or nullRequired
stagestringRequiredenum: ["LEGACY","CONTROL","PENDING","PROCESSING","BLOCKED","FAILED","COMPLETE"]
failure_codestring or nullRequired
mediaarrayRequired
media[]objectRequired
media[].idstringRequiredformat: "uuid"
media[].ordinalintegerRequiredminimum: 0
media[].file_idstring or nullRequired
media[].content_typestring or nullRequired
media[].statestringRequiredenum: ["PENDING","RETAINED","FAILED"]
media[].ocr_statestringRequiredenum: ["PENDING","COMPLETE","FAILED","UNSUPPORTED"]
media[].ocr_versionstring or nullRequired
media[].ocr_attemptsintegerRequiredminimum: 0
media[].ocr_failure_codestring or nullRequiredenum: ["UNSUPPORTED_IMAGE","IMAGE_LIMIT","OCR_UNAVAILABLE","OCR_TIMEOUT","OCR_OUTPUT_LIMIT","OCR_FAILED",null]
media[].ocr_completed_atstring or nullRequiredformat: "date-time"
media[].candidatesarrayRequiredmaxItems: 128
media[].candidates[]objectRequired
media[].candidates[].animal_idstringRequiredformat: "uuid"
media[].candidates[].identifier_idstringRequiredformat: "uuid"
media[].candidates[].identifier_valuestringRequiredmaxLength: 100
media[].candidates[].normalized_identifierstringRequired
media[].candidates[].is_iso_eidbooleanRequired
media[].candidates[].match_kindstringRequiredenum: ["exact","suffix","partial"]
media[].candidates[].confidencestringRequiredenum: ["high","low"]
media[].candidates[].requires_selectionbooleanRequired
media[].candidates[].supporting_observationsarrayRequiredmaxItems: 128
media[].candidates[].supporting_observations[]objectRequired
media[].candidates[].supporting_observations[].media_idstringRequiredformat: "uuid"
media[].candidates[].supporting_observations[].digitsstringRequired
media[].candidates[].supporting_observations[].ocr_confidencenumberRequiredminimum: 0; maximum: 100
media[].candidates[].supporting_observations[].boxobjectRequired
media[].candidates[].supporting_observations[].box.leftnumberRequiredminimum: 0
media[].candidates[].supporting_observations[].box.topnumberRequiredminimum: 0
media[].candidates[].supporting_observations[].box.widthnumberRequired
media[].candidates[].supporting_observations[].box.heightnumberRequired
media[].candidates[].supporting_observations[].match_kindstringRequiredenum: ["exact","suffix","partial"]
media[].candidates_truncatedbooleanRequired
candidatesarrayRequiredmaxItems: 128
candidates[]objectRequired
candidates[].animal_idstringRequiredformat: "uuid"
candidates[].identifier_idstringRequiredformat: "uuid"
candidates[].identifier_valuestringRequiredmaxLength: 100
candidates[].normalized_identifierstringRequired
candidates[].is_iso_eidbooleanRequired
candidates[].match_kindstringRequiredenum: ["exact","suffix","partial"]
candidates[].confidencestringRequiredenum: ["high","low"]
candidates[].requires_selectionbooleanRequired
candidates[].supporting_observationsarrayRequiredmaxItems: 128
candidates[].supporting_observations[]objectRequired
candidates[].supporting_observations[].media_idstringRequiredformat: "uuid"
candidates[].supporting_observations[].digitsstringRequired
candidates[].supporting_observations[].ocr_confidencenumberRequiredminimum: 0; maximum: 100
candidates[].supporting_observations[].boxobjectRequired
candidates[].supporting_observations[].box.leftnumberRequiredminimum: 0
candidates[].supporting_observations[].box.topnumberRequiredminimum: 0
candidates[].supporting_observations[].box.widthnumberRequired
candidates[].supporting_observations[].box.heightnumberRequired
candidates[].supporting_observations[].match_kindstringRequiredenum: ["exact","suffix","partial"]
candidates_truncatedbooleanRequired

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