ChallengesDocs

Q4 Solution

Submit a device type and useful life for every asset

Q4 Solution

POST /api/v2/q4/solution

Request Body

FieldTypeNotes
assetsarrayOne entry per asset in facilities A to E
assets[].ceidstringCEID from the records
assets[].serial_numberstringSerial Number from the records. Needed if you don't send ceid
assets[].device_typestringA type from the Device Types API
assets[].useful_life_yearsnumber or nullThe type's useful life under the health system's replacement strategy
processstringMarkdown, 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

PartWeightPer asset
Device type70%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 life30%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
}
  • coverage is the share of assets you sent an entry for.
  • unmatched_assets counts 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.