Pixel and DSP Event Fields
Event Resolution Field Catalog
API: GET /api/v3/events/resolution_full_profile on api.delivr.ai (v1 is legacy and remains for back-compat)
Service: Event Store Lookup Service (Rust/DataFusion)
Schema endpoint: GET /api/v3/events_schema?source=pixel
Last verified: 2026-09-02
Sources: Pixel (on-domain) and DSP (ad impression) events share enrichment fields but differ in core event fields.
Quick Reference
- Total schema fields: 140
- Max time window: 25 hours (
end_ms - start_ms) - Default limit: 300 rows
- Resolved on-domain events include identity + enrichment fields (person, company, demographics)
- Unresolved on-domain events include only core event fields (no person/company data)
- Some visitors are never resolved by design: see Where we do not resolve visitors
Query Parameters
| Parameter | Required | Description |
|---|---|---|
source | No | Event source: pixel (default) or dsp |
pixel_id | Conditional | Pixel UUID. Use with source=pixel |
project_id | Conditional | Project UUID. Use with source=pixel, or alongside campaign_id for source=dsp |
campaign_id | Conditional | Campaign ID. Use with source=dsp. Requires project_id for auth |
start_ms | Yes | Inclusive start timestamp (epoch ms) |
end_ms | Yes | Inclusive end timestamp (epoch ms). Max 25h from start_ms |
limit | No | Max rows (default: 300). The ceiling is 2000: a larger value is refused with limit N exceeds max_limit 2000, not reduced. Page with offset for more, and slice the time window for a range longer than 25h. |
offset | No | Rows to skip |
select | No | Comma-separated field list to project specific columns |
filter | No | Filter expression: <field>:<op>:<value>. AND with ,, OR with | |
distinct | No | Comma-separated fields to deduplicate results |
Filter Operators
| Operator | Meaning | Example |
|---|---|---|
eq | Equals | resolved:eq:true |
ne | Not equals. ne:null means IS NOT NULL; an empty value means not the empty string. | first_name:ne:null |
gt | Greater than (numeric fields) | ts_millis:gt:1778673000000 |
gte | Greater than or equal (numeric fields) | ts_millis:gte:1778673000000 |
lt | Less than (numeric fields) | ts_millis:lt:1778673000000 |
lte | Less than or equal (numeric fields) | ts_millis:lte:1778673000000 |
like | Case-insensitive substring match | job_title:like:director |
in | Matches any value in the list. Separate values with ;, because , is the AND separator. | event_type:in:page_view;click |
notin | Matches no value in the list. Same ; separator as in. | event_type:notin:page_view;click |
not_null | Field is not null. Takes no value. | first_name:not_null |
is_null | Field is null. Takes no value. | first_name:is_null |
Common Filters
resolved:eq:true # Only resolved events
resolved:eq:false # Only unresolved events
event_type:eq:page_view # Specific event type
event_type:eq:form_submission|event_type:eq:scroll_depth # Multiple event types (OR)
resolved:eq:true,first_name:ne:null # Resolved with first name (AND)
ip_country:eq:US # Visitors on a US IP address
ip_country:eq:US|ip_country:eq:CA # US or Canadian IPs (OR)
resolved:eq:true,ip_country:eq:US # Resolved US visitors (AND)
ip_country:not_null # Exclude traffic we could not place
ip_country is the country of the request IP, not of the resolved person.
See the note under Network and Client Fields for
why it differs from personal_country, and for how to treat null.
Profile Completeness
| Parameter | Description |
|---|---|
has_valuable_data | Boolean. Narrows to rows with a populated profile: an email of some kind, an email or company name, a first name or company name, and a last name. All four must hold, so a row carrying only a business address does not qualify. Combined with filter using AND. See Filter to Business Emails With a Full Profile. |
Response Metadata
Every response includes a meta object:
| Field | Type | Description |
|---|---|---|
files_scanned | int | Parquet files scanned during query |
buckets_scanned | int | Storage buckets containing matching data |
took_ms | int | Query execution time in milliseconds |
Field Catalog
Fields are grouped by category. Population rates are based on a sample of 34 resolved events.
Legend:
- Rate: Percentage of resolved events where field is non-null
- Nullable: Whether the Arrow schema allows null values
- Resolved-only: Field is only populated when
resolved=true
Core Event Fields
Always present on every event (resolved or unresolved).
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
event_id | Utf8 | No | 100% | Unique event identifier (UUID) |
organization_id | Utf8 | No | - | Delivr organization ID (schema-only, see project_id in responses) |
project_id | Utf8 | - | 100% | Project ID (appears in response data, not in schema) |
event_type | Utf8 | No | 100% | Event type: page_view, scroll_depth, form_submission, etc. |
timestamp | Utf8 | No | 100% | ISO 8601 timestamp with microseconds (UTC) |
ts_millis | Int64 | No | 100% | Epoch milliseconds timestamp |
resolved | Boolean | Yes | 100% | Whether identity resolution succeeded |
Source-Specific Event Fields
Fields that differ between pixel and DSP events.
Pixel-Only Fields
Present only on pixel (on-domain) events. Null or absent on DSP events.
| Field | Data Type | Nullable | Description |
|---|---|---|---|
pixel_id | Utf8 | No | Pixel that captured the event |
cookie_id | Int64 | Yes | Browser cookie identifier |
headers | Utf8 | Yes | Full HTTP request headers (JSON string) |
DSP Campaign Fields
Present only on DSP (ad impression) events. Null or absent on pixel events.
| Field | Data Type | Nullable | Description |
|---|---|---|---|
bid_advertiser_id | Utf8 | Yes | DSP advertiser account ID |
bid_campaign_id | Utf8 | Yes | DSP campaign ID (matches campaign_id query param) |
bid_creative_id | Utf8 | Yes | Creative/ad unit ID |
bid_network_id | Utf8 | Yes | Ad network ID |
click_url | Utf8 | Yes | Click destination URL (null for impressions) |
V2 Metadata Fields
Present on both pixel and DSP events when queried via v2 endpoints.
| Field | Data Type | Nullable | Description |
|---|---|---|---|
source | Utf8 | Yes | Event source: pixel or adkernel |
event_model | Utf8 | Yes | Storage model: pixel or adkernel |
event_source_id | Utf8 | Yes | Source identifier (pixel_id for pixel, campaign_id for DSP) |
date | Utf8 | Yes | Event date: YYYY-MM-DD |
Network and Client Fields
Raw request data from the pixel capture.
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
client_ip | Utf8 | Yes | 100% | IP address as seen by the load balancer (may reflect proxy) |
ip | Utf8 | Yes | 100% | Original visitor IP from X-Forwarded-For |
ip_country | Utf8 | Yes | ~100% since 2026-05-16 | ISO 3166-1 alpha-2 country the visitor IP resolved to. Null when the address could not be placed. Some countries are never resolved: see Where we do not resolve visitors. Check the coverage note below before filtering on earlier dates |
gpc | Boolean | Yes | 100% | Whether the request asserted Global Privacy Control. A true event is never resolved, so it carries no identity |
user_agent | Utf8 | Yes | 100% | Browser user agent string |
referrer_url | Utf8 | Yes | 100% | Page referrer URL |
event_data | Utf8 | Yes | 100% | Page-level event payload (JSON string with URL, title, viewport, etc.) |
extra_json | Utf8 | Yes | 0% | Additional event metadata (JSON string) |
ip_countryis where the request came from, not where the visitor is or
who they are. It is the geolocation of the request IP observed at capture
time, so a VPN or proxy places the event at the exit node's country rather
than the visitor's physical location.personal_countryand
company_countryare profile attributes of the resolved person and their
employer. The three routinely disagree, and legitimately so: someone
travelling, working remotely, or on a VPN produces a request country that
differs from both. Filter onip_countryto scope by where traffic comes
from; filter onpersonal_countryto scope by where a person is based.Events on IPv4 addresses carry
ip_country. IPv6 is not yet placed and reads
as null, as does any address outside the lookup. Null means unknown, so decide
explicitly whether unknown traffic belongs in or out of your filter.
ip_countrycoverage by period. The field is populated across history,
but how much of it is usable depends on when the event was captured.
Period Coverage What a country filter does 2026-05-16 onward Effectively complete Works as expected 2026-03-20 to 2026-05-15 Roughly 1 to 4% Returns a small, unrepresentative slice Before 2026-03-20 No events retained No results The gap is not a backfill limitation. During that earlier window a capture
defect on our side recorded an internal address instead of the visitor's, so
for most of those events there is no visitor IP to place and no country is
derivable by any means.This is worth reading twice, because the failure is quiet. A filter like
ip_country:eq:USover April returns rows, and they are real rows, correctly
placed. They are simply a few percent of the traffic that was actually there.
Nothing in the response distinguishes that from a genuinely quiet month. For
any analysis spanning early 2026, either start at 2026-05-16 or compare
ip_country:not_nullagainst the unfiltered count first, so you can see how
much of the window you are actually measuring.
Where we do not resolve visitors
Some events are collected normally but never carry an identity. This is by
design, not a match-rate problem, and no amount of retrying or re-firing the
pixel will change it.
You still get the event. The page view, the URL, the timestamp, the
referrer, the visitor's IP and ip_country are all recorded and returned as
usual. That data is yours: you are the controller for it, your privacy notice
governs it, and your own analytics are unaffected. What is withheld is the
person we would otherwise attach to it, which comes from our graph and which we
are the controller for.
Such an event comes back with resolved: false and no person fields: no name,
no email, no job title, no employer attributed to that individual.
Company fields may still be present. When we cannot resolve a person, we
fall back to looking up the organization from the visitor's IP, and that path
runs independently of the identity gate. So a withheld event can still carry
company_name, company_domain, company_linkedin_url,
company_employee_count_range and company_revenue_range.
That is deliberate. Those five describe an organization rather than a person, so
they are not personal data about the visitor, and account-level intelligence is
usually the reason you were watching that traffic in the first place. If you
need strictly person-resolved rows, filter on resolved:eq:true rather than on
the presence of a company name.
Two reasons a visitor is not resolved
1. The visitor asserted Global Privacy Control.
gpc is true on the event. GPC is a browser-level opt out of the sale and
sharing of personal information, recognized under the CCPA and CPRA, and it
applies regardless of where the visitor is.
To exclude these events:
gpc:ne:true|gpc:is_null
Both halves are needed.
gpcis null before 2026-09-02, as noted below,
and in SQL a null compares as neither equal nor unequal to anything. So both
gpc:eq:falseand the seemingly safergpc:ne:truesilently discard every
event from before that date, resolved ones included. Only the explicit
|gpc:is_nullkeeps them.
Note this excludes GPC events only. It is not a filter for "everything that can
resolve": the geographic exclusion below is a separate reason, with its own
filter.
2. The visitor's IP places them in a country that requires opt-in consent.
These are jurisdictions whose law requires prior consent for the kind of
profile data we would attach. We do not hold that consent for a visitor we have
never met, so we do not resolve them.
| Region | Countries |
|---|---|
| European Union | Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden |
| Rest of the EEA | Iceland, Liechtenstein, Norway |
| United Kingdom | United Kingdom |
| Switzerland | Switzerland |
Nowhere else is excluded. Traffic from Canada, Brazil, India, Australia, Japan,
Mexico and everywhere else resolves normally, subject to the usual match rate.
Scoping your queries
Prefer a positive filter. Say what you want rather than enumerating what you do
not, and the query keeps meaning the same thing if the list above ever changes:
ip_country:eq:US
ip_country:eq:US|ip_country:eq:CA
If you do need to exclude the list explicitly, exclude nulls back in as well:
ip_country:notin:AT;BE;BG;HR;CY;CZ;DK;EE;FI;FR;DE;GR;HU;IE;IT;LV;LT;LU;MT;NL;PL;PT;RO;SK;SI;ES;SE;IS;LI;NO;GB;CH|ip_country:is_null
To combine both reasons, note that , is AND between groups and | is OR
within one. For eligible US traffic:
ip_country:eq:US,gpc:ne:true|gpc:is_null
For everything eligible to resolve anywhere, exclude the restricted countries
rather than naming one:
ip_country:notin:AT;BE;BG;HR;CY;CZ;DK;EE;FI;FR;DE;GR;HU;IE;IT;LV;LT;LU;MT;NL;PL;PT;RO;SK;SI;ES;SE;IS;LI;NO;GB;CH|ip_country:is_null,gpc:ne:true|gpc:is_null
That reads as (country not restricted OR unplaceable) AND (no GPC OR GPC
unknown). Both null branches are needed, for the reason given above and below.
The trailing
|ip_country:is_nullis load-bearing.notinfollows SQL
semantics, where a null is neither in the list nor not in it, so a bare
notinclause silently drops every event whose country could not be placed.
Those visitors resolve normally, so dropping them undercounts your eligible
traffic by however much of it is IPv6, and nothing in the response tells you
it happened. This is the main reason to reach for the positive filter instead.
Two things this is easy to confuse with
A null ip_country is not an exclusion. Null means we could not place the
address, most often because it is IPv6. Those visitors are resolved normally.
If you want to separate "not resolved because of where they are" from "not
resolved for any other reason", note that the first group always has a non-null
ip_country drawn from the table above.
This is about the request IP, not the person. A German employee browsing
from a New York IP is resolved; a US employee browsing from Berlin is not. The
gate reads ip_country, which is where the request came from. It does not read
personal_country or company_country, which are attributes of the person we
have not identified yet at the moment the decision is made.
Why it works this way
For the event itself you are the controller. For the identity and profile we
attach, we are, because that data comes from our own databases rather than from
your site. Those countries require opt-in consent for that processing, and
consent given to you for your own purposes does not extend to ours. Rather than
rely on a basis we cannot evidence for a visitor we have never had a
relationship with, we do not make the association at all: the identity is never
attached, rather than attached and filtered out later.
gpcstarts on 2026-09-02 and is null before it. That null is permanent
and correct: the signal was never read on those events, which is not the same
as a visitor declining to assert it, so it is left unknown rather than
backfilled to false.
DSP
event_data: For DSP events, contains a JSON object withcontent(app_bundle, traffic_type),device(browser, os, carrier, connection_type, make, model),geo(city, country, lat, lon, postal_code, region), andpricing(advertiser_price, bid_price, win_price) sub-objects.
Identity Resolution Fields
Hashed email identifiers used for identity matching. Present on all resolved events.
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
hem | Utf8 | Yes | 100% | Primary HEM (SHA256 lowercase, matches sha256_lc_hem) |
hems | List<Utf8> | Yes | 100% | All associated HEMs for this identity (array) |
domain_lc | Utf8 | Yes | 100% | Email domain (lowercase) |
is_email_business | Utf8 | Yes | 100% | "true" / "false" - whether primary email is business |
is_email_personal | Utf8 | Yes | 100% | "true" / "false" - whether primary email is personal |
is_international | Utf8 | Yes | 100% | "true" / "false" - whether the visitor is non-US |
Email Hashes (multiple algorithms and case variants)
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
md5_lc_hem | Utf8 | Yes | 100% | MD5 hash of lowercase email |
md5_uc_hem | Utf8 | Yes | 24% | MD5 hash of original-case email |
sha1_lc_hem | Utf8 | Yes | 100% | SHA1 hash of lowercase email |
sha1_uc_hem | Utf8 | Yes | 24% | SHA1 hash of original-case email |
sha256_lc_hem | Utf8 | Yes | 100% | SHA256 hash of lowercase email |
sha256_uc_hem | Utf8 | Yes | 24% | SHA256 hash of original-case email |
Enrichment-Sourced Email Hashes
Duplicated from the identity graph with emails_ prefix. Populated only when full enrichment data exists.
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
emails_md5_lc_hem | Utf8 | Yes | 24% | MD5 lowercase (enrichment source) |
emails_md5_uc_hem | Utf8 | Yes | 24% | MD5 original-case (enrichment source) |
emails_sha1_lc_hem | Utf8 | Yes | 24% | SHA1 lowercase (enrichment source) |
emails_sha1_uc_hem | Utf8 | Yes | 24% | SHA1 original-case (enrichment source) |
emails_sha256_lc_hem | Utf8 | Yes | 24% | SHA256 lowercase (enrichment source) |
emails_sha256_uc_hem | Utf8 | Yes | 24% | SHA256 original-case (enrichment source) |
Person Fields
Contact-level data from the identity graph. Null on unresolved events.
Name and Identity
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
first_name | Utf8 | Yes | 24% | First name (lowercase) |
middle_name | Utf8 | Yes | 0% | Middle name |
last_name | Utf8 | Yes | 24% | Last name (lowercase) |
gender | Utf8 | Yes | 24% | Gender: "f", "m", "u" |
inferred_gender | Utf8 | Yes | 24% | Algorithmically inferred gender |
inferred_gender_unisex | Utf8 | Yes | 24% | "y" / "n" - whether name is unisex |
age_range | Utf8 | Yes | 24% | Age bracket (e.g., "25-34") |
photo_url | Utf8 | Yes | 24% | Profile photo URL (typically LinkedIn default) |
Email
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
email | Utf8 | Yes | 100% | Primary resolved email address |
emails | Utf8 | Yes | 24% | All known email addresses (comma-separated) |
personal_email | Utf8 | Yes | 24% | Primary personal email |
personal_emails | Utf8 | Yes | 24% | All personal emails (comma-separated) |
current_business_email | Utf8 | Yes | 0% | Current business email |
business_emails | Utf8 | Yes | 0% | All business emails |
primary_contact_emails | Utf8 | Yes | 24% | Primary contact email addresses |
valid_emails | Utf8 | Yes | 0% | Validated email addresses |
invalid_emails | Utf8 | Yes | 0% | Known-invalid email addresses |
email_validation_status | Utf8 | Yes | 100% | Validation status: "catchall", "invalid", "unknown", "valid" |
personal_email_validation_status | Utf8 | Yes | 24% | Personal email validation status |
current_business_email_validation_status | Utf8 | Yes | 0% | Business email validation status |
email_last_seen | Date32 | Yes | 0% | Last date email was verified active |
current_business_email_validation_date | Date32 | Yes | 0% | Business email validation date |
Phone Numbers
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
phones | Utf8 | Yes | 24% | All phone numbers (comma-separated) |
phones_dnc | Utf8 | Yes | 24% | DNC status per phone: "y", "n" (comma-separated) |
direct_numbers | Utf8 | Yes | 24% | Direct/work phone numbers |
direct_numbers_dnc | Utf8 | Yes | 24% | DNC status for direct numbers |
mobile_phones | Utf8 | Yes | 24% | Mobile phone numbers |
mobile_phones_dnc | Utf8 | Yes | 24% | DNC status for mobile phones |
mobile_phones_validation_status | Utf8 | Yes | 24% | Comma-separated, positionally aligned with mobile_phones: "unknown", "valid" |
mobile_phones_validation_date | Utf8 | Yes | 24% | Mobile validation date |
personal_phones | Utf8 | Yes | 24% | Personal phone numbers |
personal_phones_dnc | Utf8 | Yes | 24% | DNC status for personal phones |
Professional Profile
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
job_title | Utf8 | Yes | 24% | Current job title (lowercase) |
job_title_normalized | Utf8 | Yes | 24% | Standardized job title |
job_title_history | Utf8 | Yes | 24% | Previous job titles |
headline | Utf8 | Yes | 24% | LinkedIn headline |
seniority_level | Utf8 | Yes | 24% | Normalized seniority: "cxo", "director", "manager", "staff", "vp" |
seniority_level_2 | Utf8 | Yes | 0% | Secondary seniority classification |
seniority_level_raw | Utf8 | Yes | 24% | Raw seniority from source: "entry", "senior", etc. |
department | Utf8 | Yes | 0% | Primary department |
department_2 | Utf8 | Yes | 0% | Secondary department |
department_raw | Utf8 | Yes | 0% | Raw department from source |
subdepartments | Utf8 | Yes | 0% | Subdepartment classifications |
job_functions | Utf8 | Yes | 0% | Job function categories |
inferred_years_experience | Utf8 | Yes | 0% | Estimated years of experience |
education_history | Utf8 | Yes | 24% | Education records (JSON string with name, URL, dates) |
Social Profiles
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
linkedin_url | Utf8 | Yes | 24% | LinkedIn profile URL |
twitter_url | Utf8 | Yes | 0% | Twitter/X profile URL |
github_url | Utf8 | Yes | 0% | GitHub profile URL |
facebook_url | Utf8 | Yes | 0% | Facebook profile URL |
social_connections | Utf8 | Yes | 24% | Connection count range (e.g., "1-9", "500+") |
Personal Address
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
personal_address | Utf8 | Yes | 0% | Street address |
personal_address_2 | Utf8 | Yes | 0% | Address line 2 |
personal_city | Utf8 | Yes | 24% | City (stored lowercase, returned title-cased by API) |
personal_state | Utf8 | Yes | 24% | State name (stored lowercase, returned title-cased by API) |
personal_state_code | Utf8 | Yes | 24% | Two-letter state code (stored lowercase, returned uppercase by API) |
personal_country | Utf8 | Yes | 24% | Country name (stored lowercase, returned title-cased by API) |
personal_country_alpha2 | Utf8 | Yes | 24% | ISO 3166-1 alpha-2 country code |
personal_country_alpha3 | Utf8 | Yes | 24% | ISO 3166-1 alpha-3 country code |
personal_country_numeric | Float64 | Yes | 24% | ISO 3166-1 numeric country code |
personal_timezone | Int32 | Yes | 0% | UTC offset |
personal_zip | Utf8 | Yes | 0% | ZIP code |
personal_zip4 | Utf8 | Yes | 0% | ZIP+4 code |
address_id | Utf8 | Yes | 24% | Encoded address identifier |
dpv_code | Utf8 | Yes | 0% | Delivery Point Validation code (USPS) |
Demographics
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
has_children | Utf8 | Yes | 24% | "y" / "n" |
income_range_lc | Utf8 | Yes | 24% | Household income range (e.g., "$150,000 to $199,999") |
net_worth | Utf8 | Yes | 24% | Estimated net worth range |
is_homeowner | Utf8 | Yes | 24% | "y" / "n" |
is_married | Utf8 | Yes | 24% | "y" / "n" |
is_profile_b2b | Utf8 | Yes | 24% | "y" / "n" - B2B profile flag |
is_profile_b2c | Utf8 | Yes | 24% | "y" / "n" - B2C profile flag |
Company Fields
Firmographic data from the identity graph. Null on unresolved events.
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
company_name | Utf8 | Yes | 24% | Company name |
company_name_history | Utf8 | Yes | 24% | Previous company names |
company_domain | Utf8 | Yes | 24% | Company website domain |
company_related_domains | Utf8 | Yes | 24% | Associated domains (comma-separated) |
company_description | Utf8 | Yes | 24% | Company description |
company_industry | Utf8 | Yes | 24% | Primary industry |
company_naics | Utf8 | Yes | 24% | NAICS industry code |
company_sic | Utf8 | Yes | 0% | SIC industry code |
company_employee_count | Utf8 | Yes | 24% | Exact employee count (string) |
company_employee_count_range | Utf8 | Yes | 24% | Employee range (e.g., "1 to 10", "51 to 100", "101 to 250") |
company_total_revenue | Float64 | Yes | 24% | Annual revenue (numeric) |
company_revenue_range | Utf8 | Yes | 24% | Revenue bracket (e.g., "1 million to 5 million") |
company_address | Utf8 | Yes | 24% | Company street address |
company_address2 | Utf8 | Yes | 0% | Company address line 2 |
company_city | Utf8 | Yes | 24% | Company city |
company_state | Utf8 | Yes | 24% | Company state |
company_zip_code | Utf8 | Yes | 24% | Company ZIP code |
company_country | Utf8 | Yes | 24% | Company country |
company_phones | Utf8 | Yes | 24% | Company phone numbers |
company_phones_dnc | Utf8 | Yes | 24% | Company phone DNC status |
company_linkedin_url | Utf8 | Yes | 24% | Company LinkedIn URL |
company_id | Utf8 | Yes | 24% | Internal company identifier (MD5 hash) |
company_id_right | Utf8 | Yes | 24% | Matched company ID from enrichment join |
Internal Identifier Fields
Used for identity graph linking and deduplication.
| Field | Data Type | Nullable | Rate | Description |
|---|---|---|---|---|
first_uuid_norm | Utf8 | Yes | 24% | Primary normalized UUID from identity graph |
flattened_uuids | Utf8 | Yes | 24% | All UUIDs linked to this identity |
profile_pid_all | Utf8 | Yes | 24% | Profile person ID (MD5 hash) |
last_updated | Date32 | Yes | 0% | Last enrichment update date |
Selectable Fields
All 140 fields can be used with the select parameter. Full list for copy-paste:
event_id,pixel_id,organization_id,event_type,timestamp,ts_millis,cookie_id,hem,hems,
user_agent,client_ip,ip,ip_country,gpc,event_data,headers,referrer_url,extra_json,resolved,
address_id,age_range,business_emails,company_address,company_address2,company_city,
company_country,company_description,company_domain,company_employee_count,
company_employee_count_range,company_id,company_id_right,company_industry,
company_linkedin_url,company_naics,company_name,company_name_history,company_phones,
company_phones_dnc,company_related_domains,company_revenue_range,company_sic,
company_state,company_total_revenue,company_zip_code,current_business_email,
current_business_email_validation_date,current_business_email_validation_status,
department,department_2,department_raw,direct_numbers,direct_numbers_dnc,domain_lc,
dpv_code,education_history,email,email_last_seen,email_validation_status,emails,
emails_md5_lc_hem,emails_md5_uc_hem,emails_sha1_lc_hem,emails_sha1_uc_hem,
emails_sha256_lc_hem,emails_sha256_uc_hem,first_name,first_uuid_norm,flattened_uuids,
gender,has_children,headline,income_range_lc,inferred_gender,inferred_gender_unisex,
inferred_years_experience,invalid_emails,is_email_business,is_email_personal,
is_homeowner,is_international,is_married,is_profile_b2b,is_profile_b2c,job_functions,
job_title,job_title_history,job_title_normalized,last_name,last_updated,linkedin_url,
md5_lc_hem,md5_uc_hem,middle_name,mobile_phones,mobile_phones_dnc,
mobile_phones_validation_date,mobile_phones_validation_status,net_worth,
personal_address,personal_address_2,personal_city,personal_country,
personal_country_alpha2,personal_country_alpha3,personal_country_numeric,
personal_email,personal_email_validation_status,personal_emails,personal_phones,
personal_phones_dnc,personal_state,personal_state_code,personal_timezone,personal_zip,
personal_zip4,phones,phones_dnc,photo_url,primary_contact_emails,profile_pid_all,
seniority_level,seniority_level_2,seniority_level_raw,sha1_lc_hem,sha1_uc_hem,
sha256_lc_hem,sha256_uc_hem,social_connections,subdepartments,valid_emails,twitter_url,
github_url,facebook_url,job_title_normalized
Notes
Population Rate Patterns
Fields fall into two tiers based on enrichment availability:
- 100% on resolved on-domain events: Core event fields (
event_id,timestamp,cookie_id,ip,hem,email,user_agent, etc.). These exist for every resolved on-domain event. - ~24% on resolved on-domain events: Full enrichment fields (person demographics, company firmographics, phone numbers, etc.). These are only populated when the identity graph has a rich profile match.
The 24% rate reflects on-domain events where only a HEM-to-email resolution occurred without full profile enrichment. The has_valuable_data=true query parameter can filter to only on-domain events with enrichment data populated.
Field Value Formatting
- Names: Stored and returned in lowercase
- Addresses, industries: Stored in lowercase, returned title-cased by the Events API (e.g.,
"florida"stored,"Florida"returned) - Boolean-like strings:
"y"/"n"or"true"/"false"(not actual booleans) - Phone numbers: E.164 format with
+prefix, comma-separated when multiple - DNC fields: Positionally aligned with their phone counterpart (e.g.,
phones: "+1234, +5678"andphones_dnc: "n, y") - JSON fields:
event_data,headers,education_historyare stringified JSON - Hashes: Lowercase hex strings (MD5: 32 chars, SHA1: 40 chars, SHA256: 64 chars)
- Dates:
Date32fields useYYYY-MM-DDformat; timestamps use ISO 8601 with microseconds
Endpoints Summary
| Endpoint | Scope | Description |
|---|---|---|
GET /api/v3/events/resolution_full_profile | pixel_id, project_id, or campaign_id | Query pixel or DSP events |
GET /api/v3/events_schema | source only | Get field schema by source (pixel or dsp) |
Each tier route takes the same parameters; the route you call sets both the billable meter and the fields it can return. Use GET /api/v3/events/{tier}/schema to see what a given tier admits.
DSP Event Types
DSP events have different event types than pixel events:
| Source | Event Types |
|---|---|
| Pixel | page_view, scroll_depth, form_submission, click, file_download, copy, exit_intent, user_idle, video_play, video_pause, video_complete |
| DSP | impression, click, conversion |
Updated 13 days ago
