Body condition score with vet review
Body condition score (BCS) rates how much fat a dog is carrying on the WSAVA 9-point scale: 1 is emaciated, 4-5 is ideal, 9 is obese. Tracked over months, it tells an owner whether their pet's weight is heading the right way.
Scores come from the model straight away. When the model can't see enough of the body to be sure, the result also goes to a vet, and you're notified when the vet's score is in.
1. Get good photos
The model looks for three landmarks: the ribs, the waist from above, and the tuck of the belly from the side. Ask the owner for:
- One photo side on, the dog standing, whole body in frame.
- One photo from directly above, standing.
- Good light, no heavy clothing or harness.
A pet lying down hides the waist and belly, so those photos score with low confidence and usually go to a vet.
curl -X POST -H "x-api-key: YOUR-API-KEY" -H "Content-Type: multipart/form-data" \
-F "images=@/path/to/side.jpg" \
-F "images=@/path/to/above.jpg" \
https://api.thedogapi.com/v1/pets/{pet_id}/images
2. Score it
curl -X POST -H "x-api-key: YOUR-API-KEY" https://api.thedogapi.com/v1/pets/{pet_id}/body-condition-score
{
"score": 6,
"reasons": "Ribs palpable with slight excess fat cover. Waist visible from above but not pronounced.",
"condition_flags": ["Elevated joint load", "Increased metabolic demand"],
"breed_predispositions": ["Hip dysplasia", "Elbow dysplasia"],
"confidence": 3,
"confidence_reason": "…",
"prompt_version": "v1",
"generated_at": "2026-09-30T02:11:04.000Z",
"review": {
"id": "Hk2xT9aQ1b",
"pet_id": "Mhq3zCuduT",
"status": "pending",
"reason": "low_confidence",
"model_score": 6,
"model_confidence": 3,
"vet_score": null,
"vet_notes": null,
"requested_at": "2026-09-30T02:11:04.000Z",
"completed_at": null
}
}
confidence runs from 1 to 5. It starts at 1, goes up by one for each of the three landmarks the model could assess, and by one more when there was more than one photo and at least one landmark was visible. It is not a probability. The model looks at the five most recent photos. At 3 or below, the result goes to a vet automatically and review is filled in. When the model is confident, review is null.
To send a result to a vet anyway, add request_review=true:
curl -X POST -H "x-api-key: YOUR-API-KEY" \
"https://api.thedogapi.com/v1/pets/{pet_id}/body-condition-score?request_review=true"
Optional query parameters: lang for translated reasons, country and season (the model allows for seasonal coat changes, which it works out from the country if you don't pass a season). The result is saved and reused until new photos are added, so these options only take effect on the first call for a set of photos.
3. Get the vet's score
When a vet finishes, we send a pet.bcs.reviewed webhook:
{
"id": "Hk2xT9aQ1b",
"pet_id": "Mhq3zCuduT",
"status": "completed",
"reason": "low_confidence",
"model_score": 6,
"model_confidence": 3,
"vet_score": 5,
"vet_notes": "Waist visible from above, ribs easily felt. Ideal weight.",
"requested_at": "2026-09-30T02:11:04.000Z",
"completed_at": "2026-09-30T09:40:51.000Z",
"sub_id": "usr_8b3d91",
"external_owner_id": "usr_8b3d91",
"_metadata": { "event_type": "pet.bcs.reviewed", "timestamp": "2026-09-30T09:40:52.000Z" }
}
Or poll the pet's reviews, newest first:
curl -H "x-api-key: YOUR-API-KEY" https://api.thedogapi.com/v1/pets/{pet_id}/body-condition-score/reviews
status | Meaning | What to show the owner |
|---|---|---|
pending | With a vet | The model's score, marked as awaiting review |
completed | A vet has scored it | vet_score, and vet_notes if present |
rejected | A vet couldn't score these photos | Ask for new photos, side on and from above |
Once a review is completed, show vet_score in place of the model's score. The pet's body_condition_score field is updated to the vet's score too, unless the pet has been re-scored from newer photos since.
Reviews are done by people, so results are not instant: design for the vet's score arriving later, and tell the owner. pet.bcs.review_requested fires when one is opened, if you want to tell them a vet is looking.
How it's counted
Scoring the same photos again returns the same result and the same review, so a retry or a page refresh doesn't open a second review. New photos give a new score, and a new review if that one needs it. A rejected review is not a completed check.
What it doesn't claim
BCS from photos is a screening tool. It isn't a diagnosis and doesn't replace a vet examining the pet in person. We show the model's reasoning and a vet's view rather than a single number with an accuracy figure attached.
breed_predispositions is a short list for common breeds, not the full predispositions dataset. An empty list doesn't mean the breed has none.
Switching it off
body_condition on the capabilities list.