Analytics
Aggregate hiring-funnel numbers for a job or the whole workspace.
One endpoint returns the hiring funnel as counts and medians, for the whole workspace or for one job. Every number is an aggregate: nothing in the response points at a single application or person. The response also explains how it measured two of the numbers, because they are easy to misread.
GET/analytics/hiring-funnelanalytics:read
Status counts, stage counts, time in stage, time to hire and where applications came from. Without parameters it covers every job in the workspace.
curl https://tahoe.workonward.com/api/partner/v1/analytics/hiring-funnel \
-H "Authorization: Bearer $TAHOE_API_KEY"{
"object": "hiring_funnel",
"workspace_id": "wsp_4Kd8sPm2Qx7L",
"job_id": null,
"status_breakdown": {
"new": 52,
"in_review": 41,
"advanced": 31,
"rejected": 20,
"withdrawn": 2,
"hired": 2
},
"funnel": [
{ "stage": "Applied", "position": 1, "count": 70 },
{ "stage": "Screen", "position": 2, "count": 41 },
{ "stage": "Interview", "position": 3, "count": 12 },
{ "stage": "Offer", "position": 4, "count": 3 },
{ "stage": "Hired", "position": 5, "count": 2 },
{ "stage": "Rejected", "position": 6, "count": 20 }
],
"time_in_stage": [
{ "stage_type": "Applied", "median_days": 3.2, "applications": 68 },
{ "stage_type": "Screen", "median_days": 4.5, "applications": 41 },
{ "stage_type": "Interview", "median_days": 9.0, "applications": 12 },
{ "stage_type": "Offer", "median_days": 2.5, "applications": 3 }
],
"time_to_hire": { "median_days": 31.0, "hires": 2 },
"source_mix": { "public_board": 131, "ats:greenhouse": 17 },
"totals": { "applications": 148, "applicants": 141, "jobs": 6 },
"method": {
"time_in_stage": "Median days that in-flight applications have spent in their current stage, grouped by stage type. Excludes rejected, withdrawn and hired applications.",
"time_to_hire": "Median days from applied_at to the hire event, derived from the activity log and falling back to updated_at.",
"aggregate_only": true
}
}It is in the expensive rate-limit tier (60 per minute). The numbers change slowly, so fetch them on a schedule and keep the answer rather than calling the endpoint on every page view.
What each number means
| Field | Meaning |
|---|---|
status_breakdown | How many applications are in each status: new, in_review, advanced, rejected, withdrawn, hired. |
funnel | How many applications sit in each pipeline stage right now, in stage order and under the workspace’s own stage names. Across the whole workspace, stages with the same name and position in different jobs are added together. |
time_in_stage | For applications still in progress, the median number of days they have spent in the stage they are in now, grouped by stage type. applications is how many were counted. |
time_to_hire | For hired applications, the median number of days from applying to being hired. hires is how many were counted. |
source_mix | Applications by where they came from, largest first, up to 20 sources. For example public_board for the Tahoe job board, or ats: plus the ATS name for applications imported from the customer’s ATS. Applications with no recorded source are counted under unknown. |
totals | The number of applications, of distinct applicants and of distinct jobs that have applications. |
method | A plain-language note on how time_in_stage and time_to_hire are measured, and aggregate_only: true. |
Read these before you chart anything
Stage names in funnel belong to each job’s pipeline, so two jobs’ funnels only line up stage by stage if they use the same stages. Treat the keys of source_mix as an open set: a new source can appear at any time. totals.applicants is lower than totals.applications whenever someone applied more than once, which is normal.
One job at a time
Pass job_id to narrow every number to one job. A job handle from another workspace returns 404, not a report full of zeros.
curl "https://tahoe.workonward.com/api/partner/v1/analytics/hiring-funnel?job_id=job_7Kd2mXq4Rp8v" \
-H "Authorization: Bearer $TAHOE_API_KEY"Aggregates stay aggregates
aggregate_only: true states what this endpoint is for. A funnel over a small group can still identify people when you join it with data you already hold: a stage with a count of one, matched against an application list, names a person. Do not use the numbers that way. Equal-opportunity and diversity figures are not available through the API at all, per person or in total, for the same reason.
Related events
There is no analytics event: the numbers move with every application change. Recompute on a schedule, or after you process a batch of application events from the change feed.