---
title: "Count talent"
method: GET
path: "/api/servicepool/talents/count"
tags: ["talent"]
---

# Count talent

`GET /api/servicepool/talents/count`

## Request

- Base URL: `https://services.fountain.com`
- URL: `https://services.fountain.com/api/servicepool/talents/count`
- Auth: HTTP bearer

Counts visible talent only by default (isHidden is not true and archivedAt is null). Pass onlyReturnHiddenTalent=true to count only hidden talent instead, or includeHidden=true to count BOTH visible and hidden talent (archived still excluded). For Match Score counts, vectors[matchUuid] takes the Pool entity's own uuid (for matchType Opening, a Hire funnel id is also resolved via the opening's hireExternalId); an identifier found in neither space is rejected as a 400 naming the unresolvable id. averageScore is DEPRECATED here and returns null unless the query carries vectors — use GET /talents/averageScore instead. It stays in this response for one release so existing consumers keep parsing. Removing it is also what moves the Average Match tile in the talent table onto GET /talents/averageScore; until then the tile reads it here, because the count computes the number inside a vector search it is already running. The filter lists common fields; any talent field works.

## Query parameters

- `filter` ParametersFilter
  - `where` ParametersFilterWhere
  - `fields` ParametersFilterFields
  - `limit` number
  - `skip` number
  - `order` string[]
  - `collate` ParametersFilterCollation
    - `locale` string
    - `strength` number
    - `caseLevel` boolean
    - `numericOrdering` boolean
- `vectors` JobMatchVectorDto, nullable
  - `matchThreshold` number, required: The match threshold of the job match vector, as a percent from 0 to 100
  - `matchType` 'Job' | 'Opening', required: The match type of the job match vector
  - `matchUuid` string, required: The unique identifier of the job match vector
- `proximity` ProximityMatchDto, nullable
  - `distance` number, required: The numeric distance from location
  - `unit` 'mile' | 'kilometer', required: The unit of measurement
  - `locationUuid` string, required: The unique identifier of the location to check distance against
- `audienceCampaignUuid` string, uuid
- `onlyReturnHiddenTalent` boolean
- `includeHidden` boolean
- `audienceUuid` string, uuid
- `search` string
- `unread` '1'
- `campaignRecipients` 'all' | 'receiving' | 'excluded'

## Response `200`

Fetch a count of `talent`

- object
  - `data` object, required
    - `count` number, required
    - `workerCount` number, required
    - `applicantCount` number, required
    - `prospectCount` number, required
    - `averageScore` number, nullable, required: DEPRECATED — use GET /talents/averageScore. Mean match score across the matched talent, expressed as a 0-1 fraction. Returned here only when the query carries vectors (where it is already being computed, so the tile costs no second vector search); `null` on every other query, including counts that matched talent, and including a proximity-only query — `$geoWithin` filters but writes no score. `null` is NOT a 0% match. Also `null` when the V3 engine is primary for the target opening: this number is a V2 average over the matched population while the rows of GET /talents come back V3-scored, so publishing it would put two engines on one screen. Average the `score` on the rows instead. A caller asking for more than 100 rows keeps V2 row scores and still gets a null average here, because the count cannot observe the list request's limit.
    - `v3` object: How the V3 engine answered this count. `inline` and `rows` are complete answers. `rows-range` is a complete answer for a target matching more than 100,000 talents: GET /talents then serves the page in match-score order and ignores `order`, and this count is the matched rows joined to the same filters, stopping one past the 10,000 display cap: a `count` above the cap means "10,000+", and the per-type counts then describe the best matches counted, so each is a floor of its type. A `rows-range` answer carrying `preview` (basis `fill`) reads rows a build is still writing: `count` is the talent scored so far and grows until the build completes. `preview` is the answer over the evaluation cap while the target's match rows are still being built: `count` is exact over `preview.sampleSize` of the view's `preview.activeTalents` talents — the most recently scored ones (`basis: sample`) or the ones the build has scored so far (`basis: fill`) — not over the whole population, and `queue` says where the target waits for its rows when it is queued (`position` targets ahead of it, `total` queued, `etaAt` expected completion). `blocked` means the count is zero because V3 cannot answer yet, for `reason` (e.g. `target-not-extracted`, or `count-budget-exhausted` when a rows-range count ran past its budget); it is never a count of zero matches.
      - `mode` 'inline' | 'rows' | 'rows-range' | 'preview' | 'blocked', required
      - `reason` string
      - `preview` object
        - `basis` 'sample' | 'fill', required
        - `sampleSize` number, required
        - `activeTalents` number, required
      - `queue` object
        - `position` number, required
        - `total` number, required
        - `etaAt` string, date-time, required
  - `meta` ResponsesPartMeta, required
    - `timestamp` string, date-time, required
    - `verb` 'OPTION' | 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE'
    - `path` string
    - `jti` string
    - `rid` string
    - `count` number
    - `capped` boolean: The server lowered filter[limit] to its ceiling. Page with filter[skip] to read past it.
    - `status` string
    - `duration` number
    - `size` number

---

[API](https://skmtc.dev/fountain/apis/worker-experience-public-api.md) - [All operations](https://skmtc.dev/fountain/apis/worker-experience-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/fountain/apis/worker-experience-public-api/revisions/6b9a31f79e22?raw)
