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

# More filters

> Target on about 40 more fields, from department and NAICS codes to revenue bands and verified emails, with AND and OR groups.

A lane's basic filters (location, size, industries, seniority, titles) cover most audiences. **More filters** go further: about 40 fields about the person, their contact details and their company, combined with **all** (AND) and **any** (OR) groups.

They're applied on top of the lane's other filters, to every count, sample and export. Like everything else before an export, they're free.

## In the dashboard

Open a lane, choose **Edit filters**, and scroll to **More filters**:

1. **Add condition**: pick a field, an operator and the values.
2. **Add group**: a nested group with its own **All of these (AND)** or **Any of these (OR)**.
3. **Save filters**. The lane page lists them in plain words under **Filters**, and the funnel gets a **+ more filters** step after the next check.

## Over the API

Send `conditions` when you create or change a lane:

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X PATCH https://intentleads.si/api/v1/lanes/L1 \
  -H "Authorization: Bearer $INTENT_LEADS_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "conditions": {
      "all": [
        {"field": "department_detail", "op": "any_of", "value": ["sales", "business development"]},
        {"any": [
          {"field": "naics", "op": "starts_with", "value": ["3391", "3345"]},
          {"field": "sic", "op": "any_of", "value": ["3841", "3845"]}
        ]},
        {"field": "revenue_range", "op": "any_of", "value": ["5 million to 10 million", "10 million to 25 million", "25 million to 50 million"]},
        {"field": "email_status", "op": "any_of", "value": ["valid"]}
      ]
    }
  }'
```

This keeps people in sales or business development, at companies with a medical-device NAICS **or** SIC code, with $5M to $50M revenue, whose email checked out as valid.

* A **group** is `{"all": [...]}` or `{"any": [...]}`. Groups nest up to 3 levels deep.
* A **condition** is `{"field": "...", "op": "...", "value": ...}`.
* A bare list, like `[{...}, {...}]`, is read as `{"all": [...]}`.
* Send `"conditions": null` to remove them all.
* The response has the stored `filters.conditions` and a plain-language `filters.conditions_summary`.

Counts update after the lane's next check. To see them now, run one: `POST /api/v1/lanes/L1/checks`, or `intentleads checks run --lane L1`.

## Operators

| `op` | Value | Meaning |
| - | - | - |
| `any_of` / `none_of` | List | Matches one of the values / none of them. |
| `is` / `is_not` | List or one value | Exact match, ignoring case. |
| `contains` / `not_contains` | List | Contains any of the words / none of them. |
| `starts_with` / `ends_with` | List | Starts or ends with any of them. |
| `at_least` / `at_most` | Number | Numeric comparison. |
| `between` | `[min, max]` | Inclusive range. |
| `exists` / `missing` | None | The field has a value / has none. |
| `is` (flag fields) | `true` or `false` | Yes/no fields like `has_mobile`. |

Text is matched without regard to case. Each field takes only some operators; the tables below and `GET /api/v1/catalog` (`conditions.fields`) list them.

## Fields

### Intent

| Field | What it is | Operators | Values |
| - | - | - | - |
| `intent_score` | Intent score. 1 to 99: how strongly the person researched the topic, from their own last 14 days. Not a percentile. Strength bands follow it. | `at_least`, `at_most`, `between` | 1 to 99 |

### Role

| Field | What it is | Operators | Values |
| - | - | - | - |
| `seniority` | Seniority | `any_of`, `none_of` | `cxo`, `vp`, `director`, `manager`, `staff` |
| `seniority_detail` | Seniority (detailed). Finer than Seniority: separates owners and partners from the C-suite. | `any_of`, `none_of` | `owner`, `partner`, `cxo`, `vice president`, `director`, `manager`, `senior individual contributor`, `entry`, `training`, `unpaid` |
| `seniority_as_listed` | Seniority as listed. The level as the person describes it, e.g. Founder or Head of. | `any_of`, `none_of`, `exists` | `owner`, `founder`, `partner`, `c_suite`, `vp`, `head`, `director`, `manager`, `senior`, `entry`, `intern` |
| `department` | Department | `any_of`, `none_of` | `sales`, `marketing`, `executive`, `operations`, `finance`, `engineering`, `information technology`, `product management`, `customer service`, `human resources`, `legal`, `administrative`, `education`, `healthcare services`, `media and communication`, `community and social services` |
| `department_detail` | Department (detailed). 26 departments, e.g. Business Development, Purchasing, Entrepreneurship. | `any_of`, `none_of` | `sales`, `business development`, `marketing`, `entrepreneurship`, `operations`, `purchasing`, `finance`, `accounting`, `consulting`, `engineering`, `information technology`, `product management`, `program and project management`, `quality assurance`, `research`, `support`, `human resources`, `legal`, `administrative`, `arts and design`, `education`, `healthcare services`, `media and communication`, `community and social services`, `military and protective services`, `real estate` |
| `job_title` | Job title. The title as the person wrote it. Not case-sensitive. | `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists` | Text |
| `standard_title` | Standard job title. The title cleaned up to a standard form, e.g. 'vice president of sales'. Use contains for anything looser. | `any_of`, `none_of`, `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists` | Text |
| `job_function` | Job function. e.g. business\_development, executive management. | `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists`, `missing` | Text |
| `subdepartment` | Sub-department | `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists`, `missing` | Text |
| `past_titles` | Past job titles. Any title the person held before. | `contains`, `not_contains`, `exists`, `missing` | Text |
| `headline` | Profile headline | `contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists` | Text |
| `connections` | Professional connections | `any_of`, `none_of`, `exists` | `1-9`, `10-99`, `100-249`, `250-499`, `500+` |

### Where the person is

| Field | What it is | Operators | Values |
| - | - | - | - |
| `person_state` | State (where the person lives) | `any_of`, `none_of` | US states: two-letter codes like `tx` |
| `person_city` | City (where the person lives) | `is`, `is_not`, `contains`, `not_contains`, `starts_with`, `exists` | Text |
| `person_zip` | ZIP code (where the person lives). starts\_with matches a ZIP prefix, e.g. 100 for Manhattan. | `is`, `is_not`, `starts_with`, `exists` | Text |
| `person_country` | Country (where the person lives). Full country names, e.g. united states, canada. | `any_of`, `none_of`, `contains`, `exists` | Text |
| `outside_us` | Based outside the US | `is` | `true` or `false` |

### Contact details

| Field | What it is | Operators | Values |
| - | - | - | - |
| `email_status` | Email check result. Of the person's main email. People with no check result match neither any\_of nor none\_of, so pick the results you want. | `any_of`, `none_of` | `valid`, `catchall`, `unknown`, `invalid` |
| `work_email_status` | Work email check result | `any_of`, `none_of` | `valid`, `catchall`, `unknown` |
| `has_work_email` | Work email | `is` | `true` only |
| `main_email_is_work` | Main email is a work address | `is` | `true` or `false` |
| `has_mobile` | Mobile number | `is` | `true` or `false` |
| `callable_mobile` | Mobile not on do-not-call lists | `is` | `true` only |
| `has_direct_phone` | Direct phone | `is` | `true` or `false` |
| `has_phone` | Any phone for the person | `is` | `true` or `false` |
| `has_linkedin` | LinkedIn profile | `is` | `true` only |
| `b2b_profile` | Business profile | `is` | `true` or `false` |

### Company

| Field | What it is | Operators | Values |
| - | - | - | - |
| `company_name` | Company name | `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists` | Text |
| `company_domain` | Company website. The bare domain, e.g. ends\_with .io. | `contains`, `not_contains`, `is`, `is_not`, `starts_with`, `ends_with`, `exists` | Text |
| `industry` | Industry | `any_of`, `none_of` | 346 values: see `GET /api/v1/catalog` |
| `naics` | NAICS code. 2 to 6 digits. 3391 matches every code under 3391 (medical equipment and supplies); a full 6-digit code matches only itself. Companies can have several codes; any of them counts. | `starts_with`, `exists` | 2 to 6 digits |
| `sic` | SIC code. 4-digit codes, e.g. 3841. Companies can have several codes; any of them counts, and a code stored as 6 digits (384100) counts as its first 4. | `any_of`, `none_of` | 4 digits |
| `company_description` | Company description. Words in the company's own description, e.g. injection molding. | `contains`, `not_contains`, `exists` | Text |
| `employee_range` | Company size band. Use bands for large companies (e.g. 1,000+); the staff range in Companies is limited to 5,000 wide. Bands are recorded separately from exact staff counts, so a few companies' counts fall just outside their band. | `any_of`, `none_of` | `1 to 10`, `11 to 25`, `26 to 50`, `51 to 100`, `101 to 250`, `251 to 500`, `501 to 1000`, `1001 to 5000`, `5001 to 10000`, `10000+` |
| `employees` | Staff (exact count). Between two numbers, at most 5,000 apart. | `between`, `exists` | 1 to 100,000 |
| `revenue_range` | Annual revenue | `any_of`, `none_of` | `under 1 million`, `1 million to 5 million`, `5 million to 10 million`, `10 million to 25 million`, `25 million to 50 million`, `50 million to 100 million`, `100 million to 250 million`, `250 million to 500 million`, `500 million to 1 billion`, `1 billion and over` |
| `company_state` | Company state (HQ) | `any_of`, `none_of` | US states: names like `texas` |
| `company_city` | Company city (HQ) | `is`, `is_not`, `contains`, `not_contains`, `starts_with`, `exists` | Text |
| `company_zip` | Company ZIP code (HQ) | `is`, `is_not`, `starts_with`, `exists` | Text |
| `company_country` | Company country (HQ). Full country names, e.g. united states, united kingdom. | `any_of`, `none_of`, `contains`, `exists` | Text |
| `has_company_linkedin` | Company LinkedIn page | `is` | `true` only |

## Good to know

* **Blanks.** `none_of`, `not_contains` and `is_not` also leave out people with no value for that field. For example, "department is none of sales" drops people with no department too. To keep only the values you want, use `any_of`.
* **Industry codes.** A company can have several NAICS or SIC codes; any of them counts. `naics` `starts_with` `3391` matches every code under 3391, and a full 6-digit code matches only itself. SIC codes stored with 6 digits (`384100`) match their 4-digit code.
* **Revenue** is in bands (`revenue_range`). There's no exact-revenue filter.
* **Company size.** `employees` takes `between`, at most 5,000 apart. For bigger companies, use `employee_range` bands such as `1001 to 5000`.
* **Keyword groups** are set on keywords, not here. See [Keyword groups](/guides/keywords#keyword-groups).
* **Limits:** up to 40 conditions per lane, 500 values for `any_of` / `none_of`, 50 for the text operators, and about 60 KB of values per lane in total. Past that, the API says so: use fewer values, a shorter NAICS prefix instead of many codes, or split them across lanes.

The CLI shows and sets them with `intentleads lanes rules L1` and lists the fields with `intentleads catalog fields`. AI agents use `update_lane` with `conditions` (see [MCP](/mcp-setup)).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.