> ## Documentation Index
> Fetch the complete documentation index at: https://docs.clarvo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Search filters

> Every filter in Clarvo, what it does, and whether it narrows your results (hard) or shapes their ranking (soft).

Filters refine a search until the results match who you're looking for. Open **Edit Filters**
from your search to access them, grouped into the tabs below.

## Hard vs. soft filters

Filters work in one of two ways, and knowing which is which is the key to widening or
tightening a search:

<CardGroup cols={2}>
  <Card title="Hard filter" icon="filter">
    **Narrows** your results. Candidates that don't match are removed from the list.
  </Card>

  <Card title="Soft filter" icon="arrow-up-wide-short">
    **Shapes ranking**. Matching candidates move up the list, but non-matching candidates can
    still appear. Clarvo matches these by *meaning*, not exact text.
  </Card>
</CardGroup>

<Note>
  Several criteria you might expect to be strict (job titles, industries, and a
  candidate's field of study) are deliberately soft. Clarvo matches them
  semantically and uses them to rank candidates, so a strong match with a differently-worded
  title or a related industry still shows up instead of being filtered out.
</Note>

## Job title & role

<ParamField path="Job titles" type="Soft filter">
  Clarvo matches titles by **meaning**, not exact wording, and uses them to **rank**
  candidates. Someone whose title is phrased differently but does the same work still appears.
</ParamField>

<ParamField path="Seniority levels" type="Hard filter">
  Narrows to the seniority levels you select, with a little tolerance for the levels just
  above and below.
</ParamField>

<ParamField path="Years of experience" type="Hard filter (lenient)">
  Candidates well below your minimum are filtered out; the exact amount of experience also
  influences ranking. You can set a maximum too.
</ParamField>

<ParamField path="Average tenure" type="Hard filter">
  Narrows to candidates whose average time per role meets your minimum.
</ParamField>

<ParamField path="Freelancers" type="Hard filter">
  **Limit to** or **exclude** current freelancers, useful when sourcing for contract work.
</ParamField>

<ParamField path="Work mode & job type" type="Soft filter">
  Preferences like remote work shape ranking rather than strictly excluding candidates.
</ParamField>

## Industry

<ParamField path="Industries" type="Soft filter">
  Industry experience is matched **semantically** and shapes ranking. A candidate from a
  closely related industry still appears, ranked by how relevant their background is.
</ParamField>

## Location

<ParamField path="Location" type="Hard filter">
  Keeps only candidates in the cities or countries you choose. Add several locations for a
  broader or remote-friendly search.
</ParamField>

## Skills

Skills are the most flexible filter: they can narrow **or** just rank, depending on the mode
and how you group them.

<ParamField path="Loose vs. Strict mode" type="Hybrid">
  In **Loose** mode the skills filter is broad: it splits your skills into two buckets,
  *required* and *nice to have* (below). In **Strict** mode it becomes a hard filter built
  around your skill groups (Must / Can groups, further below).
</ParamField>

### Required vs. nice to have in Loose mode

In Loose mode your skills sit in two buckets, and they behave very differently. Drag a skill
between buckets, or use the **Add skill** button in each, to decide which is which.

<ParamField path="Required skills (Loose mode)" type="Hard filter (lenient)">
  Shown under **"Must have at least one of these skills."** Clarvo keeps only candidates who
  match **at least one** of these skills, no matter which you list. It's an *any-of* match
  (OR logic) across the whole bucket, not an *all-of* one, so adding more required skills
  **widens** the pool rather than narrowing it. Leave this bucket empty to skip skill-based
  narrowing entirely.
</ParamField>

<ParamField path="Nice-to-have skills (Loose mode)" type="Soft filter">
  Shown under **"Preferably has some of these skills."** These never exclude anyone, they only
  **lift** matching candidates in the ranking. A search with *only* nice-to-have skills (no
  required ones) applies no skill filter at all and simply ranks everyone by how well they
  match.
</ParamField>

<Tip>
  Loose mode's two buckets are the same idea as Strict mode's **Must** and **Can** groups,
  just simpler: one shared "any of these" requirement instead of several groups that each
  must be matched. Switch to Strict when you need a skill from *every* group, not just one
  skill overall.
</Tip>

### Skill groups as boolean logic (Strict mode)

Strict mode turns your skills into a boolean expression. You build it by sorting skills into
**groups** and marking each group **Must** or **Can**:

* **Within a group, skills are OR.** A candidate qualifies for the group by matching *any one*
  of its skills. Put interchangeable skills together, like `React` OR `Vue` OR `Angular`.
* **Between Must groups, the logic is AND.** A candidate must satisfy *every* Must group to
  appear. Use a separate group per distinct requirement.

So three Must groups read like `(React OR Vue) AND (TypeScript) AND (AWS OR GCP)`: a frontend
framework, *and* TypeScript, *and* a cloud platform. Drag skills between groups, or use **Add
new group**, to shape the expression. Loose mode is the special case where every skill shares
one big OR.

<ParamField path="Must groups" type="Hard filter (in Strict mode)">
  In Strict mode, a candidate must match at least one skill from **every Must group** to
  appear (OR within the group, AND across groups).
</ParamField>

<ParamField path="Can groups" type="Soft filter">
  **Can** skills sit outside the AND requirement: they only affect ranking, lifting matching
  candidates without excluding anyone.
</ParamField>

<ParamField path="Minimum experience per skill" type="Soft filter">
  Setting a desired minimum experience for a skill (the clock icon) influences ranking.
</ParamField>

## Companies

<ParamField path="Limit to companies" type="Hard filter">
  Keeps only candidates who have worked at the companies you choose (at any point in their
  history), great for targeting competitors.
</ParamField>

<ParamField path="Exclude companies" type="Hard filter">
  Removes candidates who **currently** work at the companies you choose. Switch the recency to
  also exclude anyone who worked there in the past.
</ParamField>

<ParamField path="Company size & founded year" type="Hard filter">
  Narrows by how large a candidate's company is, or how recently it was founded.
</ParamField>

## Education

<ParamField path="Education level" type="Hard filter">
  Narrows to candidates at or above a minimum degree level (or, optionally, excludes anyone
  with a higher degree).
</ParamField>

<ParamField path="Graduation years" type="Hard filter">
  Narrows by when candidates finished their most recent education.
</ParamField>

<ParamField path="Field of study" type="Soft filter">
  Matched by meaning and used to **rank** candidates. A related field still appears, it just
  ranks accordingly.
</ParamField>

<ParamField path="Schools & GPA" type="Soft filter">
  Treated as preferences that inform ranking rather than strict cut-offs.
</ParamField>

## Languages

<ParamField path="Required languages" type="Hard filter">
  Candidates must speak every required language (at a reasonable proficiency).
</ParamField>

<ParamField path="Nice to have languages" type="Soft filter">
  A bonus that improves ranking but never excludes anyone.
</ParamField>

## Interaction filters

These narrow results based on your team's prior activity, so you don't reach out to the same
person twice. Each can be scoped to **this project** or **your whole organization**.

<ParamField path="Previously contacted & viewed profiles" type="Hard filter">
  **Limit to** or **exclude** candidates you (or your team) have already contacted or viewed,
  optionally within a recent time window.
</ParamField>

<ParamField path="LinkedIn connections" type="Hard filter">
  **Limit to** or **exclude** candidates who are already LinkedIn connections.
</ParamField>

## Saving filters as templates

Built a filter set you like? Save it as a **template** to apply the same criteria to future
searches in one click. Your filters also persist as you work, so you won't lose them when
refining a search.

<Tip>
  Too few candidates? Loosen the hard filters first. Switch skills to Loose, move a
  Must group to Can, widen seniority or experience, or remove a location, then turn on
  [deep search](/search/deep-search). Soft filters (titles, industries, field of study) never
  need loosening; they only affect ordering.
</Tip>
