Skip to main content

List Recruitment Metrics

GET/requisitions/recruitment-metrics
Agency-scoped keys

This endpoint is not available for agency-scoped API keys.

Stage tracking

Recruitment metrics are available only for companies with stage tracking enabled in company config. If no accessible company in the request has it enabled, the API returns HTTP 403 with FEATURE_NOT_ENABLED. Do not retry until the configuration changes or you select an accessible company with stage tracking enabled. MCP clients can check availability with describe_open_api_metadata.

Summary​

Returns recruitment performance metrics for eligible companies, with configurable metric, grouping, date range, company, project, and agency filters. For metric=timeToFill, duration runs from requisition approval to accepted supplier response. Responses accepted on or after the latest reopening use the reopened date instead of approval. Earlier responses retain their approval-date baseline.

URL Parameters​

  • None

Query Parameters​

NameTypeRequiredDescription
companystringNoFilter by company id(s). Pass a single id or comma-separated ids. If omitted, data for all companies linked to the API key is returned.
pageintegerNoPage number (default 1)
limitintegerNoRecords per page (default 50, max 200)
projectstringNoFilter by project id
agencystringNoFilter by agency id(s). Pass a single id or comma-separated ids.
metricenum(rows, timeToFill, workersOverHours)NoMetric mode. Defaults to rows.
groupByenum(all, company, project, agency, month, week)NoAggregation dimension for metric=timeToFill or metric=workersOverHours. Pass a single value or comma-separated values such as company,agency. Defaults to all.
hoursThresholdnumberNoWeekly net-hours threshold for metric=workersOverHours. Defaults to 48.
fromstringNoPeriod filter start (YYYY-MM-DD). Applies to requisition created date for rows, supplier date accepted for timeToFill, and week ending for workersOverHours.
tostringNoPeriod filter end (YYYY-MM-DD). Applies to requisition created date for rows, supplier date accepted for timeToFill, and week ending for workersOverHours.
sortByenum(createdAt, reqRef)NoSort field
sortOrderenum(asc, desc)NoSort direction
fieldsstringNoComma-separated list of response fields or dot-path nested fields to return

Request Example​

curl -X GET 'https://api.requidex.com/api/open/v1/requisitions/recruitment-metrics?from=2026-02-01&to=2026-02-28' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Accept: application/json'

Response Fields​

When metric is omitted or set to rows, the endpoint returns paginated recruitment metric rows. Stage identifiers remain stable; currentStageLabel and stageDates[].label use the hiring company’s configured names. Custom stages are included, and excluded stages retain any recorded dates. When metric=timeToFill, it returns grouped approved-date to supplier accepted-date day metrics with the 1.5 IQR outlier rule applied per group. When metric=workersOverHours, it returns grouped worker-week net-hours threshold metrics.

FieldTypeDescription
assignedstringAssigned date (DD/MM/YYYY)
currentStagestringCurrent recruitment stage
cvRejectedstringYes when the submitted worker was rejected, otherwise No
cvReviewedstringCV reviewed date (DD/MM/YYYY)
interviewedstringInterviewed date (DD/MM/YYYY)
managerReviewDaysintegerDays from submitted to CV reviewed
missingCompliancestringMissing compliance date (DD/MM/YYYY)
offerAcceptedstringOffer accepted date (DD/MM/YYYY)
offerMadestringOffer made date (DD/MM/YYYY)
offerRejectedstringOffer rejected date (DD/MM/YYYY)
offerToStartDaysintegerDays from offer accepted to requisition start
projectstringProject name
reqCreatedstringRequisition created date (DD/MM/YYYY)
reqReopenedstringLatest reopened date (DD/MM/YYYY), or an empty string if never reopened
reqRefstringRequisition reference
reqStartstringRequisition start date (DD/MM/YYYY)
submittedstringSubmitted date (DD/MM/YYYY)
supplierstringAgency name
timeToFillDaysintegerDays from requisition creation to offer made, or accepted supplier response when no offer is recorded. Uses the latest reopened date when the target date is on or after reopening
timeToInterviewDaysintegerDays from submitted to interviewed
timeToOfferAcceptedDaysintegerDays from requisition created to offer accepted
timeToOfferDaysintegerDays from submitted to offer made
tradestringTrade name
workerstringWorker name

Aggregate response fields​

For metric=timeToFill, each row contains:

FieldTypeDescription
groupobjectGroup keys for the requested groupBy; empty when groupBy=all
rawCountintegerAccepted supplier responses before IQR outlier exclusion
excludedOutliersintegerResponses excluded by the 1.5 IQR rule
iqrBoundsobjectLower and upper day bounds used for outlier exclusion
valuesobjectcount, averageDays, medianDays, minDays, maxDays, p25Days, and p75Days after outlier exclusion

For metric=workersOverHours, each row contains:

FieldTypeDescription
groupobjectGroup keys for the requested groupBy; empty when groupBy=all
valuesobjectthresholdHours, hoursField, workerWeeks, workersOverThreshold, distinctWorkersOverThreshold, totalHours, averageWeeklyHours, and maxWeeklyHours

Additional row fields:

FieldTypeDescription
currentStageLabelstringConfigured name of the current stage
interviewRequestedstringFirst interview request date (DD/MM/YYYY), or empty
interviewBookedstringFirst interview booking date (DD/MM/YYYY), or empty
withdrewstringFirst withdrawal date (DD/MM/YYYY), or empty
requestToBookingDaysinteger/nullDays from interview request to booking
bookingToInterviewDaysinteger/nullDays from booking to interview
timeToWithdrawalDaysinteger/nullDays from submission to first withdrawal
hasWithdrawnbooleanWhether this submission has a dated withdrawal entry, even if the worker later returned to another stage
stageDatesarray[object]Stage dates in company-configured order, followed by any remaining built-in or historical stages.
Show child attributes
  • stage string — Stable built-in or custom stage identifier
  • label string — Configured stage name
  • enabled boolean — Whether the stage is included in company configuration
  • at string — First recorded date (DD/MM/YYYY), or empty
  • daysFromSubmitted integer/null — Days from submission to the first recorded stage date (retained for compatibility)
  • elapsedFromStage string — Selected base identifier, defaulting to submitted
  • elapsedFromStageLabel string — Configured base name
  • elapsedDays integer/null — Days from the first recorded base date to the first target date; null if either date is missing or the base occurred later

For row metrics, meta.withdrawalSummary covers all matching worker submissions before pagination:

FieldTypeDescription
withdrawalSummaryobjectWithdrawal summary within the caller’s existing report scope.
Show child attributes
  • submissions integer — Matching worker submissions
  • withdrawn integer — Submissions with a dated withdrawal history entry
  • ratePercent number — Withdrawn submissions divided by matching submissions, as a percentage rounded to two decimal places; zero when there are no submissions

This counts recorded withdrawal stages, including submissions later moved to another stage. It does not infer withdrawals from rejections or assignment cancellations. Timing fields are null when either required date is missing.

Response Example (200)​

{
"success": true,
"data": [
{
"reqRef": "REQ-R1002",
"reqCreated": "20/02/2026",
"reqReopened": "",
"reqStart": "01/03/2026",
"project": "Northern Rail Electrification",
"trade": "Electrician",
"supplier": "Northline Labour Desk",
"worker": "Jordan Worker",
"submitted": "21/02/2026",
"cvReviewed": "21/02/2026",
"interviewed": "",
"offerMade": "",
"offerAccepted": "",
"offerRejected": "",
"assigned": "",
"missingCompliance": "",
"managerReviewDays": 0,
"timeToInterviewDays": null,
"timeToOfferDays": null,
"timeToFillDays": null,
"timeToOfferAcceptedDays": null,
"offerToStartDays": null,
"currentStage": "cvReviewed",
"cvRejected": "No"
}
],
"meta": {
"page": 1,
"limit": 50,
"total": 1
}
}

Aggregate Response Example (200)​

{
"success": true,
"data": [
{
"group": {
"agency": {
"id": "67bc36db80a1616ec3f48988",
"name": "Northline Labour Desk"
}
},
"rawCount": 12,
"excludedOutliers": 1,
"iqrBounds": {
"lower": 0,
"upper": 21
},
"values": {
"count": 11,
"averageDays": 7.45,
"medianDays": 6,
"minDays": 1,
"maxDays": 18,
"p25Days": 4,
"p75Days": 10
}
}
],
"meta": {
"total": 1,
"metric": "timeToFill",
"groupBy": "agency",
"dateField": "dateAccepted",
"outlierRule": "IQR_1_5"
}
}

MCP Tool​

The MCP server exposes this operation as open_api_list_recruitment_metrics with the inputs company, page, limit, project, agency, metric, groupBy, hoursThreshold, from, to, sortBy, sortOrder, and fields.

Errors​

HTTP StatusDescription
400Invalid query parameter
401Missing, invalid, revoked, or expired API key
403Access restriction, or FEATURE_NOT_ENABLED when stage tracking is requested but unavailable
405Method not allowed on Open API routes
429Rate limit exceeded
500Unexpected internal error