Q4 Solution
Submit a device type and useful life for every asset
Q4 Solution
POST /api/v2/q4/solution
Request Body
| Field | Type | Notes |
|---|---|---|
assets | array | One entry per asset in facilities A to E |
assets[].ceid | string | CEID from the records |
assets[].serial_number | string | Serial Number from the records. Needed if you don't send ceid |
assets[].device_type | string | A type from the Device Types API |
assets[].useful_life_years | number or null | The type's useful life under the health system's replacement strategy |
process | string | Markdown, up to 12,000 characters: how you labeled the assets |
{
"assets": [
{
"ceid": "31829716",
"serial_number": "DE752K5076",
"device_type": "Physiological Monitor",
"useful_life_years": 10
}
],
"process": "## How I labeled the assets\n..."
}
Each entry is matched to one asset by CEID. When several assets share a CEID, serial_number picks between them; when there's no ceid, serial_number alone is used. Device types are compared ignoring case, spacing and plurals.
How It's Scored
| Part | Weight | Per asset |
|---|---|---|
| Device type | 70% | 1 for the right type, 0.5 for a reference type that's a generic or more specific version of it (Infusion Pump for an infusion pump), else 0 |
| Useful life | 30% | 1 when the type is right and the life matches the expected useful life, else 0 |
Both parts are averaged over every asset, so assets you leave out count as zero.
What We Look For in the Write-up
Your write-up is read by the Equiply team with these points in mind. It doesn't change your score.
- type_matching: how descriptions and models were mapped to reference types (search, hybrid search, synonyms, model knowledge), and how candidates were ranked.
- lifespan_choice: which lifespan you used and why, tied to the health system's replacement strategy.
- validation: how you checked labels: spot checks, agreement across records of the same model, consistency between similar descriptions, confidence thresholds.
- hard_cases: accessories, multi-function devices, vague descriptions and assets with no good match.
Responses
200
{
"challenge": "q4",
"score": 139,
"max_points": 200,
"best_score": 139,
"result": {
"device_type_accuracy": 0.712,
"useful_life_accuracy": 0.655,
"coverage": 0.998,
"unmatched_assets": 4
},
"attempts_remaining": 4
}
coverageis the share of assets you sent an entry for.unmatched_assetscounts entries that didn't match any asset, or matched one you'd already sent.
400
{
"error": "INVALID_SUBMISSION",
"message": "assets[12] needs a \"ceid\" or a \"serial_number\" from the records"
}
{
"error": "INVALID_SUBMISSION",
"message": "assets[3].useful_life_years must be a number of years between 0 and 100, or null"
}
Invalid requests don't use a submission.