URL: /code/data/types · Id: `page:/code/data/types`

# Types

> The nine types every data call reads and returns, what null means in each, and how often a route applies each filter you send.

The nine types every data call reads and returns, what null means in each, and how often a route applies each filter you send.

## Null means unknown, never zero
A blank is `null`, and the page says "unknown". A `0` means the source measured zero. Long-tail search terms often have no volume reading, and that reads `searches: null`, not a term nobody searches. Every type below lists what `null` means for each field, so an agent never has to guess.

The filter coverage at the foot of the page is the useful version of `strict`. It shows, per filter, the share of measured calls answered by a route that takes it. A filter under 1% comes back in `ignored` almost every time, so filter on headcount and country first and judge the rest from the rows.

## The `Observed` type
Where a reading came from. Every row a data call returns carries it, and so does the Event the call emits, so a number is never separated from when and how it was read.

| Field | Type | What `null` means |
| --- | --- | --- |
| `observedAt` | `string`, in ISO 8601 | Never null: when the market was read, not when the row was written. A stored reading keeps its first time. |
| `method` | `'sampled' \| 'estimated' \| 'reported'` | Never null. `sampled` was read live from the site, `estimated` is modeled from a panel or an index, and `reported` came from your own connected account. |
| `venue` | [`VenueId`](/code/data/types#venueid) | Absent on a reading that belongs to no site, such as a company profile. |
| `locale` | `string`, in BCP 47, such as en-US | Absent on a reading that has no market, such as an email check. |

## The `Cost` type
What one call spent, on every priced response. A data call bills units returned, never units asked for, and a miss is free wherever a route allows it.

| Field | Type | Unit | What `null` means |
| --- | --- | --- | --- |
| `usd` | `number` | USD | Never null. In try mode it is 0: the read runs and nothing is billed. |
| `maxUsd` | `number` | USD | Never null: the most this call could have spent under its `maxCost`. |
| `units` | `number` | the call’s unit: rows, terms, answers, addresses | Never null: what was billed, or would have been in try mode. |
| `misses` | `number` | None. | Never null: lookups that found nothing and cost nothing. |

## The `Money` type
An amount someone else spent or raised, such as a funding round or a forecast’s spend. What a call costs you is `Cost`, never `Money`.

| Field | Type | Unit | What `null` means |
| --- | --- | --- | --- |
| `amount` | `number` | major units, 2500000 is $2.5M | Never null inside a `Money`; a field that holds a `Money` is `null` when the amount was not disclosed. |
| `currency` | `string` | ISO 4217 | Never null. |

## The `Hostname` type
A domain with no scheme and no path: `harborview-pm.com`. Every company is keyed by one, which is why an Organization is found, enriched and resolved by its domain.

| Field | Type | Unit | What `null` means |
| --- | --- | --- | --- |
| `(value)` | `string` | lowercase, no www. | A field typed `Hostname \| null` is null when no domain is known, such as a person with no current employer. |

## The `VenueId` type
A site as its hub id: `google-search`, `bing`, `chatgpt`, `perplexity`, `reddit`, `linkedin`. Each one is a page under [sites](/venues). A call that does not read a site refuses it with `venue-unsupported`.

| Field | Type | Unit | What `null` means |
| --- | --- | --- | --- |
| `(value)` | `string` | a hub venue id | Never null when present: a reading names the site it was read on. |

## The `OrganizationFilter` type
The filters every Organization call takes, so a count and a find over the same `where` describe the same companies. A filter no route applies comes back in `ignored`; with `strict: true` the call refuses with `filter-unsupported` instead, at $0.

| Field | Type | Unit | What `null` means |
| --- | --- | --- | --- |
| `industries` | `string[]` | industry words, such as property management | Absent: any industry. |
| `headcount` | `{ min?: number; max?: number }` | people | Absent: any size. A company with no known headcount is left out of a ranged filter, never counted as zero. |
| `countries` | `string[]` | ISO 3166-1 alpha-2 | Absent: your home Market. |
| `regions` | `string[]` | ISO 3166-2, such as US-WA | Absent: every region of `countries`. |
| `technologies` | `string[]` | product names as the market says them | Absent: any. |
| `keywords` | `string[]` | words on the company’s own site | Absent: any. |
| `revenue` | `{ min?: number; max?: number }` | USD a year | Absent: any. Most private companies report none, so a revenue range drops them. |
| `fundingStages` | `('pre-seed' \| 'seed' \| 'series-a' \| 'series-b' \| 'later')[]` | None. | Absent: funded or not. |
| `foundedYear` | `{ min?: number; max?: number }` | year | Absent: any. |
| `hiringFor` | `string[]` | open role titles | Absent: hiring or not. It runs on the open-roles read, which applies it on every call it answers. |

## The `ProspectFilter` type
The filters every Prospect call takes. `organizationWhere` holds an `OrganizationFilter`, so "directors at property managers with 20 to 200 staff" is one filter set.

| Field | Type | What `null` means |
| --- | --- | --- |
| `titles` | `string[]` | Absent: any title. |
| `similarTitles` | `boolean` | Absent: `true`, so "property manager" also finds "portfolio manager". Pass `false` for exact titles. |
| `seniority` | `('owner' \| 'c-level' \| 'vp' \| 'director' \| 'manager' \| 'individual')[]` | Absent: any. |
| `departments` | `string[]`, in operations, finance, leasing | Absent: any. |
| `keywords` | `string[]`, in words in the person’s profile | Absent: any. |
| `locations` | `string[]`, in free text, such as Greater Seattle | Absent: anywhere in `countries`. |
| `countries` | `string[]`, in ISO 3166-1 alpha-2 | Absent: your home Market. |
| `organizations` | [`Hostname[]`](/code/data/types#hostname) | Absent: people at any company. |
| `organizationWhere` | [`OrganizationFilter`](/code/data/types#organizationfilter) | Absent: any company. |
| `hasEmail` | `boolean` | Absent: `false`, so people with no work email on file are listed too. |

## The `EmailResult` type
What a mailbox check concluded about one address. The send rule reads it: send `deliverable`, cap `catch-all`, re-check `unknown`, never send `invalid` or `disposable`.

| Field | Type | What `null` means |
| --- | --- | --- |
| `'deliverable'` | [`EmailResult`](/code/data/types#emailresult) | The mailbox exists and accepts mail. |
| `'catch-all'` | [`EmailResult`](/code/data/types#emailresult) | The domain accepts every address, so this one cannot be confirmed. Free at the standard depth; `depth: deep` resolves many. |
| `'invalid'` | [`EmailResult`](/code/data/types#emailresult) | The mailbox does not exist, often because the person left. |
| `'disposable'` | [`EmailResult`](/code/data/types#emailresult) | A throwaway mailbox service. |
| `'unknown'` | [`EmailResult`](/code/data/types#emailresult) | The mail server never answered. Free; check again with `depth: deep`. |

## The `Cursor` type
The `after` value that pages a list. A cursor keeps the page size it was issued with, so `limit` is ignored when `after` is sent and the next page never comes back empty because the size changed.

| Field | Type | What `null` means |
| --- | --- | --- |
| `after` | `string \| null` | The last page: there are no more rows. |
| `total` | `number \| null`, in rows | The source does not report a total. It is never a guess. |

## Filter coverage
| Filter | Calls that take it | A route applies it |
| --- | --- | --- |
| `where.headcount` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 100% of 463,483 calls |
| `where.countries` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 100% of 463,483 calls |
| `where.regions` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 95.2% of 463,483 calls |
| `where.industries` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 94.7% of 463,483 calls |
| `where.revenue` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 65.8% of 463,483 calls |
| `where.keywords` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 59.6% of 463,483 calls |
| `where.technologies` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 42.5% of 463,483 calls |
| `where.foundedYear` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 14.5% of 463,483 calls |
| `where.fundingStages` | [`Organization.count`](/code/data/organizations/count), [`Organization.find`](/code/data/organizations/find) | 0.7% of 463,483 calls |
| `where.hiringFor` | [`Organization.find`](/code/data/organizations/find) | 99.9% of 5,524 calls |
| `where.organizations` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 100% of 9,229,085 calls |
| `where.titles` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 99.2% of 9,229,085 calls |
| `where.organizationWhere` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 94.1% of 9,229,085 calls |
| `where.countries` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 94% of 9,229,085 calls |
| `where.locations` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 92.7% of 9,229,085 calls |
| `where.hasEmail` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 81.3% of 9,229,085 calls |
| `where.keywords` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 68.7% of 9,229,085 calls |
| `where.seniority` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 25.8% of 9,229,085 calls |
| `where.departments` | [`Prospect.count`](/code/data/people/count), [`Prospect.find`](/code/data/people/find) | 18.9% of 9,229,085 calls |

Where no route applies a filter you sent, the response lists it in `ignored`; pass `strict: true` to be refused instead, at $0.