Dental Screening
/dental-screeningdental_photo_screening_v1Visible oral surfaces using front, left, right, upper and lower views.
- Media
- 1–5 oral images
- Limit
- 10 MB each
The REST lifecycle covers Dental Screening, Behaviour Observation and experimental Visual Wellness—from private upload to veterinary release and final PDF. Visual Wellness is a whole-body appearance workflow, not Eye AI.
https://us-central1-decennium-global.cloudfunctions.net/partnerApi/v1/partner/visual-wellnessCapability mounts
/dental-screeningdental_photo_screening_v1Visible oral surfaces using front, left, right, upper and lower views.
/behavior-observationbehavior_observation_v1Observable body-language evidence combined with partner-provided context.
/visual-wellnessvisual_wellness_v1Experimental review of visible body condition, coat/skin appearance, visible muscle condition, and visible aging markers. This is not Eye AI.
Send the shared sandbox key as Authorization: Bearer …. The key resolves partner, tenant and scopes; do not send those identities in case payloads.
Invitation workspaces exchange an X-Partner-Portal-Token for enabled capabilities and limits. Keep campaign tokens in the portal flow, not general API clients.
End-to-end
All three products use the same partner key. Select the capability mount for this case.
export PEQABOO_PARTNER_ROOT="https://us-central1-decennium-global.cloudfunctions.net/partnerApi/v1/partner"
export PEQABOO_CAPABILITY="dental-screening" # or behavior-observation / visual-wellness (experimental)
export PEQABOO_API_BASE="$PEQABOO_PARTNER_ROOT/$PEQABOO_CAPABILITY"
export PEQABOO_PARTNER_API_KEY="replace-with-your-sandbox-key"One case represents one animal and one analysis type. The API returns its actual analysisType.
curl --request POST "$PEQABOO_API_BASE/cases" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header "Content-Type: application/json" \
--data '{
"externalCaseId": "YOUR-CASE-001",
"species": "canine",
"pet": { "name": "Milo" },
"consent": { "accepted": true, "version": "partner-pilot-2026-08" }
}' | tee case.json
export CASE_ID="$(jq -r '.data.case.id' case.json)"Declare the exact MIME type and size. Visual and Dental use angle; Behaviour uses kind.
export MEDIA_FILE="./milo-front.jpg"
export MEDIA_SIZE="$(wc -c < "$MEDIA_FILE" | tr -d ' ')"
curl --request POST "$PEQABOO_API_BASE/cases/$CASE_ID/upload-session" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header "Content-Type: application/json" \
--data "$(jq -n --argjson sizeBytes "$MEDIA_SIZE" '{
fileName: "milo-front.jpg",
contentType: "image/jpeg",
sizeBytes: $sizeBytes,
angle: "front"
}')" | tee upload-session.json
# Behaviour uses kind: "primary_video" or "supporting_image" instead of angle.
export UPLOAD_URL="$(jq -r '.data.uploadUrl' upload-session.json)"
export UPLOAD_SESSION_ID="$(jq -r '.data.uploadSessionId' upload-session.json)"PUT bytes directly to storage, then complete the session so Peqaboo can verify the object.
# Send only the headers returned in data.requiredHeaders.
curl --request PUT "$UPLOAD_URL" \
--header "Content-Type: image/jpeg" \
--data-binary "@$MEDIA_FILE"
curl --request POST "$PEQABOO_API_BASE/cases/$CASE_ID/complete-upload" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header "Content-Type: application/json" \
--data "$(jq -n --arg uploadSessionId "$UPLOAD_SESSION_ID" \
'{uploadSessionId: $uploadSessionId}')"Meet the selected capability media requirements, then queue the case exactly once.
curl --request POST "$PEQABOO_API_BASE/cases/$CASE_ID/submit" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header "Content-Type: application/json" \
--data '{}'Stop polling when the case needs a retake, awaits vet review, is released, or fails.
curl --silent "$PEQABOO_API_BASE/cases/$CASE_ID" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
| jq '{status: .data.case.status, quality: .data.case.quality}'An authorised veterinarian releases the draft. Only then does the PDF endpoint return a download URL.
curl --request POST "$PEQABOO_API_BASE/cases/$CASE_ID/review" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" \
--header "Idempotency-Key: $(uuidgen)" \
--header "Content-Type: application/json" \
--data '{"decision":"release","notes":"Reviewed by an authorised veterinarian."}'
curl --silent "$PEQABOO_API_BASE/cases/$CASE_ID/report.pdf" \
--header "Authorization: Bearer $PEQABOO_PARTNER_API_KEY" | tee report-link.json
curl --location "$(jq -r '.data.downloadUrl' report-link.json)" \
--output "$CASE_ID-report.pdf"Every capability mount
/cases201Create one consented capability case.
Idempotency-Key required
/cases200List cases inside this tenant and capability.
/cases/{caseId}200Read status, quality, draft and review data.
/cases/{caseId}/upload-session201Create a short-lived direct upload URL.
Idempotency-Key required
/cases/{caseId}/complete-upload200Verify and attach uploaded media.
Idempotency-Key required
/cases/{caseId}/submit202Queue the verified case for analysis.
Idempotency-Key required
/cases/{caseId}/review200Release, request retakes, or fail the draft.
Idempotency-Key required
/cases/{caseId}/report.pdf200 / 202Get the released PDF download URL.
Create → upload → analyse → vet review → PDF
draftuploadingqueuedprocessingneeds_retakeawaiting_vet_reviewreleasedfailedDental Screening
1–5 oral images
10 MB each
Behaviour Observation
1 video + up to 5 images
3–600 sec; video up to 500 MB
Visual Wellness (experimental)
3–15 JPEG, PNG or WebP whole-body images
10 MB each
Upload sessions last 15 minutes. Behaviour accepts MP4, MOV or WebM for the primary video, and JPEG, PNG or WebP supporting images. Image capabilities accept JPEG, PNG or WebP.
Stable JSON recovery
| HTTP | Example code | Recovery |
|---|---|---|
| 400 | invalid_request | Fix the payload, media declaration, consent or capability-specific field. |
| 401 | partner_auth_failed | Check the key or invitation token and environment. |
| 403 | insufficient_scope | Ask Peqaboo to enable the capability or review scope. |
| 404 | case_not_found | The case is absent, in another tenant, or in another capability mount. |
| 409 | invalid_status_transition | Refresh the case and follow its current state. |
| 410 | upload_session_expired | Create a fresh upload session for that file. |
| 429 | daily_case_limit_reached | Wait for reset or request a pilot limit review. |
| 500 | internal_error | Retry with the original idempotency key and payload. |
{
"success": false,
"error": {
"code": "invalid_status_transition",
"message": "Refresh the case and follow its current next action."
}
}Outputs describe only evidence visible or audible in supplied media. They do not establish disease, cause, pain or prognosis.
Drafts can request retakes. Only an authorised veterinary reviewer should release a report for downstream use.
Keep capture views and owner-provided context available to the reviewer; do not present an AI score alone.
The PDF becomes available after release and remains subject to the limitations written in the report.
Partner AI reports are observational and non-diagnostic. They do not replace history-taking, physical examination, diagnostic testing, emergency triage or a veterinarian’s clinical judgement.
Ready to integrate?
Use the OpenAPI file for generated clients, or follow the safe cURL lifecycle above.