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.
Summary
Returns recruitment performance metrics for eligible companies, with configurable metric, grouping, date range, company, project, and agency filters.
URL Parameters
- None
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| company | string | No | Filter 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. |
| page | integer | No | Page number (default 1) |
| limit | integer | No | Records per page (default 50, max 200) |
| project | string | No | Filter by project id |
| agency | string | No | Filter by agency id(s). Pass a single id or comma-separated ids. |
| metric | enum(rows, timeToFill, workersOverHours) | No | Metric mode. Defaults to rows. |
| groupBy | enum(all, company, project, agency, month, week) | No | Aggregation dimension for metric=timeToFill or metric=workersOverHours. Pass a single value or comma-separated values such as company,agency. Defaults to all. |
| hoursThreshold | number | No | Weekly net-hours threshold for metric=workersOverHours. Defaults to 48. |
| from | string | No | Period filter start (YYYY-MM-DD). Applies to requisition created date for rows, supplier date accepted for timeToFill, and week ending for workersOverHours. |
| to | string | No | Period filter end (YYYY-MM-DD). Applies to requisition created date for rows, supplier date accepted for timeToFill, and week ending for workersOverHours. |
| sortBy | enum(createdAt, reqRef) | No | Sort field |
| sortOrder | enum(asc, desc) | No | Sort direction |
| fields | string | No | Comma-separated list of response fields or dot-path nested fields to return |
Request Example
- cURL
- JavaScript
- Python
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'
const response = await fetch(
"https://api.requidex.com/api/open/v1/requisitions/recruitment-metrics?from=2026-02-01&to=2026-02-28",
{
method: "GET",
headers: {
Authorization: "Bearer <API_KEY>",
Accept: "application/json",
},
},
);
const json = await response.json();
import requests
response = requests.request(
'GET',
'https://api.requidex.com/api/open/v1/requisitions/recruitment-metrics?from=2026-02-01&to=2026-02-28',
headers={
'Authorization': 'Bearer <API_KEY>',
'Accept': 'application/json',
},
timeout=30,
)
print(response.json())
Response Fields
When metric is omitted or set to rows, the endpoint returns paginated recruitment metric rows.
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.
| Field | Type | Description |
|---|---|---|
| assigned | string | Assigned date (DD/MM/YYYY) |
| currentStage | enum(submitted, cvReviewed, interviewed, offerMade, offerAccepted, offerRejected, assigned) | Current recruitment stage |
| cvRejected | string | Yes when the submitted worker was rejected, otherwise No |
| cvReviewed | string | CV reviewed date (DD/MM/YYYY) |
| interviewed | string | Interviewed date (DD/MM/YYYY) |
| managerReviewDays | integer | Days from submitted to CV reviewed |
| offerAccepted | string | Offer accepted date (DD/MM/YYYY) |
| offerMade | string | Offer made date (DD/MM/YYYY) |
| offerRejected | string | Offer rejected date (DD/MM/YYYY) |
| offerToStartDays | integer | Days from offer accepted to requisition start |
| project | string | Project name |
| reqCreated | string | Requisition created date (DD/MM/YYYY) |
| reqRef | string | Requisition reference |
| reqStart | string | Requisition start date (DD/MM/YYYY) |
| submitted | string | Submitted date (DD/MM/YYYY) |
| supplier | string | Agency name |
| timeToFillDays | integer | Days from requisition created to offer made, or to accepted supplier response date when offer made is not recorded |
| timeToInterviewDays | integer | Days from submitted to interviewed |
| timeToOfferAcceptedDays | integer | Days from requisition created to offer accepted |
| timeToOfferDays | integer | Days from submitted to offer made |
| trade | string | Trade name |
| worker | string | Worker name |
Aggregate response fields
For metric=timeToFill, each row contains:
| Field | Type | Description |
|---|---|---|
| group | object | Group keys for the requested groupBy; empty when groupBy=all |
| rawCount | integer | Accepted supplier responses before IQR outlier exclusion |
| excludedOutliers | integer | Responses excluded by the 1.5 IQR rule |
| iqrBounds | object | Lower and upper day bounds used for outlier exclusion |
| values | object | count, averageDays, medianDays, minDays, maxDays, p25Days, and p75Days after outlier exclusion |
For metric=workersOverHours, each row contains:
| Field | Type | Description |
|---|---|---|
| group | object | Group keys for the requested groupBy; empty when groupBy=all |
| values | object | thresholdHours, hoursField, workerWeeks, workersOverThreshold, distinctWorkersOverThreshold, totalHours, averageWeeklyHours, and maxWeeklyHours |
Response Example (200)
{
"success": true,
"data": [
{
"reqRef": "REQ-R1002",
"reqCreated": "20/02/2026",
"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": "",
"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"
}
}
Errors
| HTTP Status | Description |
|---|---|
| 400 | Invalid query parameter |
| 401 | Missing, invalid, revoked, or expired API key |
| 403 | Forbidden due to scope or IP restrictions |
| 405 | Method not allowed on Open API routes |
| 429 | Rate limit exceeded |
| 500 | Unexpected internal error |