Skip to main content

Validation API

Overview

The Validation API runs SDAC analyses for a report and returns a normalized issue list designed for dashboards, widgets, and triage views.

Authentication

Widget clients call the same-origin proxy. Direct APIM callers must use an environment-published route and send:

  • Authorization: Bearer {access_token}
  • Ocp-Apim-Subscription-Key: {subscription_key}

See Authentication for the full header contract.

Endpoint

AttributeValue
EndpointPOST /api/ingestion/sdac/validate
MethodPOST
Content-Typeapplication/json
ResponseJSON

Request

{
"reportId": "8201EDC2-2EDE-4CA1-AF44-D0F5AA185CDB",
"forceRefresh": false
}
FieldTypeRequiredDescription
reportIdUUID stringYesUploaded SDAC report identifier
forceRefreshbooleanNoAccepted for compatibility. The current route validates the field but does not vary execution based on it

Response

{
"reportId": "8201EDC2-2EDE-4CA1-AF44-D0F5AA185CDB",
"districtName": "Maplewood Richmond Heights",
"quarter": "Q3",
"totalRecords": 21,
"issues": [
{
"id": 1,
"priority": "high",
"title": "FRINGE: Speech-Language Pathologist",
"description": "Fringe rate exceeds the expected range after position-level aggregation.",
"amount": 5300,
"category": "FRINGE",
"recordId": 16,
"positionLabel": "Speech-Language Pathologist",
"mainRowNumber": 16,
"linkedRecordIds": [16, 39],
"occupants": ["Jordan Williams", "Avery Lee"],
"reasons": ["High fringe rate", "Split occupancy across linked rows"],
"confidence": "HIGH"
}
],
"summary": {
"errorCount": 2,
"warningCount": 1,
"passedCount": 4,
"analysisTime": 1843
}
}

Response Fields

FieldTypeDescription
reportIdUUID stringReport that was validated
districtNamestringDistrict display name
quarterstringReporting quarter
totalRecordsnumberCanonical record or position count used by the response
issuesarrayNormalized issues sorted by priority
summary.errorCountnumberTotal errors across completed analyses
summary.warningCountnumberTotal warnings across completed analyses
summary.passedCountnumberCurrent aggregate returned by the route. When any errors or warnings exist, the handler subtracts one from summary.completed rather than counting clean analyses individually
summary.analysisTimenumberTotal execution time in milliseconds

Issue Fields

FieldDescription
idStable issue row identifier within the response payload
priorityhigh, medium, or low
titleShort category-and-target label
descriptionHuman-readable issue summary
amountOptional numeric amount associated with the issue
categoryAnalysis category that produced the issue
recordIdPrimary linked record identifier when the issue is tied to a specific row or position
positionLabelPosition-first label when available
mainRowNumberMain-roster row number when the issue maps to a canonical position row
linkedRecordIdsRelated rows that contributed to the finding
occupantsOccupant names associated with the flagged position
reasonsStructured reasons returned by the underlying analysis
confidenceConfidence value when position-level analysis provides one

Error Cases

StatusDescription
400Invalid request body
401Missing or expired bearer token
403Invalid subscription key or insufficient scope
404Report not found
500Validation failed

Side Effects

  • The endpoint runs SDAC analyses for the requested report and assembles a normalized issue list.
  • The current handler reruns ingestion analyses regardless of whether forceRefresh is omitted or set.
  • This route does not create a new report or a chat conversation.

Example

curl -X POST "$WIDGET_BASE_URL/api/ingestion/sdac/validate" \
-H "Content-Type: application/json" \
-d '{
"reportId": "8201EDC2-2EDE-4CA1-AF44-D0F5AA185CDB"
}'

Operational Notes

  • This endpoint is the fastest way to populate a review queue or widget issue pane.
  • For narrative, conversational follow-up on the same report, use the Chat API.
  • For header metadata only, use the lighter Report Info API.