API reference
Analytics
One endpoint: the hiring funnel as counts and medians. It tells you how it measured, because two of the figures are not what you would assume.
GET/analytics/hiring-funnelanalytics:read
Funnel counts, status mix, time in stage, time to hire and source mix for a workspace — or for one job with ?job_id=.
In the expensive rate-limit tier (60/minute): these are GROUP BY aggregates over the whole applications table plus a lateral join over the activity log. Cheap for one workspace, not cheap in a loop across many — so cache the answer rather than calling it per page view.
curl -s "https://tahoe.workonward.com/api/partner/v1/analytics/hiring-funnel?job_id=job_7Kd2mXq4Rp8v" \
-H "Authorization: Bearer $TAHOE_API_KEY"{
"object": "hiring_funnel",
"workspace_id": "wsp_4Kd8sPm2Qx7L",
"job_id": "job_7Kd2mXq4Rp8v",
"funnel": [
{ "stage": "Applied", "position": 1, "count": 148 },
{ "stage": "Phone screen", "position": 2, "count": 41 },
{ "stage": "Onsite", "position": 3, "count": 12 },
{ "stage": "Offer", "position": 4, "count": 3 }
],
"time_in_stage": [
{ "stage_type": "screening", "median_days": 4.5, "applications": 41 },
{ "stage_type": "interview", "median_days": 9.0, "applications": 12 }
],
"time_to_hire": { "median_days": 31.0, "hires": 2 },
"source_mix": { "careers_site": 96, "referral": 31, "job_board": 21 },
"totals": { "applications": 148, "applicants": 141, "jobs": 1 },
"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
}
}The rest of the fields
funnel is ordered by position and named with the workspace’s own stage names, so it is directly chartable — but the names are per job. Two jobs’ funnels are not comparable stage by stage unless they use the same pipeline.
source_mix is a plain object keyed by application source. Treat the keys as an open set: a new source appears without a version bump.
totals.applicants is lower than totals.applications whenever people applied more than once, which is normal rather than a data problem.
Scoping to one job
?job_id= narrows every figure. A job handle from another workspace returns 404 rather than an all-zero report — a slow, confusing answer to a question that should be a clear refusal.
Aggregates stay aggregates
Related events
None. There is no analytics.* event — the numbers move on every application change, so an event per recomputation would be noise. Recompute on a schedule, or after you process a batch of application events.
