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.

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