Skip to content

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.

Request
curl https://tahoe.workonward.com/api/partner/v1/analytics/hiring-funnel \
  -H "Authorization: Bearer $TAHOE_API_KEY"
Response
{
  "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

FieldMeaning
status_breakdownHow many applications are in each status: new, in_review, advanced, rejected, withdrawn, hired.
funnelHow 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_stageFor 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_hireFor hired applications, the median number of days from applying to being hired. hires is how many were counted.
source_mixApplications 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.
totalsThe number of applications, of distinct applicants and of distinct jobs that have applications.
methodA 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.

Request
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.

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.