Field Catalog API
Field Catalog API
Base URL: https://api.delivr.ai
Version: v1
Authentication: Authorization: Bearer <jwt>
The Field Catalog API returns metadata about every filterable field available in the audience builder. Use it to discover which fields exist, what values they accept, and which operators apply -- so your UI can render the right controls (dropdowns, text inputs, etc.) without hardcoding anything.
List Fields
Retrieve all fields, optionally filtered by schema type, category, or status.
GET /api/v1/field-catalog
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
schema_type | string | (all) | event or audience -- filter to fields in that schema |
category | string | (all) | Filter by category: contact, company, demographics, intent, event, identifier |
status | string | active | active, deprecated, or all |
include_options | string | false | true to include picklist values for select/multiselect fields |
Response
{
"total_count": 119,
"fields": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"field_key": "seniority_level",
"display_name": "Seniority Level",
"description": "Standardized seniority classification",
"category": "contact",
"data_type": "string",
"schema_types": ["audience"],
"field_type": "multiselect",
"operators": ["in", "notin"],
"options": [
{ "value": "cxo", "label": "CXO" },
{ "value": "director", "label": "Director" },
{ "value": "manager", "label": "Manager" },
{ "value": "staff", "label": "Staff" },
{ "value": "vp", "label": "VP" }
],
"status": "active",
"sort_order": 12,
"created_at": "2025-12-01T00:00:00Z",
"updated_at": "2026-02-17T00:00:00Z"
}
]
}Field Object
| Property | Type | Description |
|---|---|---|
id | UUID | Unique identifier |
field_key | string | Machine-readable key used in filter rules (e.g. seniority_level) |
display_name | string | Human-readable label (e.g. "Seniority Level") |
description | string? | Optional description of the field |
category | string | Grouping: contact, company, demographics, intent, event, identifier |
data_type | string | Underlying data type: string, integer, boolean, timestamp |
schema_types | string[] | Which schemas include this field: audience, event, or both |
transform_type | string? | Optional transform hint (e.g. sha256_lc) |
field_type | string | UI control type -- see table below |
operators | string[] | Valid operators for this field in filter rules |
options | object[]? | Picklist values (only present when include_options=true) |
options[].value | string | Value to submit in filter rules (lowercase) |
options[].label | string | Display text for the UI (title-cased) |
example_value | string? | Sample value for documentation |
status | string | active or deprecated |
sort_order | integer | Display ordering within its category |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 8601 timestamp |
Field Types and UI Controls
field_type | UI Control | When options present | Typical operators |
|---|---|---|---|
multiselect | Multi-select dropdown | Populate choices from options | in, notin |
select | Single-select dropdown | Populate choices from options | eq, neq or is, is not |
text | Free-text input | N/A | is, is not, contains, startsWith, endsWith, notnull |
number | Numeric input | N/A | >, >=, <, <=, is, notnull |
Notes
optionsis omitted by default. Passinclude_options=trueto receive them. This matters because the full payload with all options is ~1.5 MB (mostly fromjob_title_normalizedwith 16,077 values).identifierfields are hidden from non-developer users. Internal users (developer flag set) see all categories.valueis lowercase,labelis display-cased. Always submitvaluein filter rules. Showlabelin the UI.
Get Categories
Returns distinct category names for active fields.
GET /api/v1/field-catalog/categories
Response
{
"categories": ["company", "contact", "demographics", "event", "identifier", "intent"]
}Get Single Field
Retrieve a single field by its key. Always includes options.
GET /api/v1/field-catalog/{key}
Path Parameters
| Parameter | Type | Description |
|---|---|---|
key | string | The field_key value (e.g. seniority_level, company_industry) |
Response
Returns a single field object (same shape as items in the list response, options always included).
Fields with Picklist Options
These fields have a bounded set of values the user can pick from. All other fields are free-text.
Contact
| Field | Options | Example Values |
|---|---|---|
seniority_level | 5 | CXO, Director, Manager, Staff, VP |
seniority_level_2 | 10 | CXO, Director, Entry, Manager, Owner, Partner, Senior Individual Contributor, Training, Unpaid, Vice President |
seniority_level_raw | 11 | C-Suite, Director, Entry, Founder, Head, Intern, Manager, Owner, Partner, Senior, VP |
department | 16 | Administrative, Engineering, Executive, Finance, Sales, Marketing, ... |
department_2 | 26 | Accounting, Arts and Design, Business Development, Consulting, ... |
job_title_normalized | 16,077 | Use searchable typeahead -- too many for a static dropdown |
social_connections | 5 | 1-9, 10-99, 100-249, 250-499, 500+ |
email_validation_status | 4 | Catchall, Invalid, Unknown, Valid |
personal_email_validation_status | 2 | Unknown, Valid |
current_business_email_validation_status | 3 | Catchall, Unknown, Valid |
is_email_business | 2 | True (true), False (false) |
is_email_personal | 2 | True (true), False (false) |
is_international | 2 | True (true), False (false) |
dpv_code | 4 | D, N, S, Y |
Company
| Field | Options | Example Values |
|---|---|---|
company_industry | 346 | Banking, Computer Software, Healthcare, Internet, ... |
company_employee_count_range | 11 | Zero, 1 to 10, 11 to 25, ..., 10000+ |
company_revenue_range | 10 | Under 1 million, ..., 1 billion and over |
company_sic | varies | 4-digit SIC codes |
company_naics | varies | NAICS codes |
Demographics
| Field | Options | Example Values |
|---|---|---|
age_range | 6 | 18-24, 25-34, 35-44, 45-54, 55-64, 65 and older |
gender | 3 | Female (f), Male (m), Unknown (u) |
inferred_gender | 2 | Female (f), Male (m) |
inferred_gender_unisex | 2 | Yes (y), No (n) |
has_children | 2 | Yes (y), No (n) |
is_married | 2 | Yes (y), No (n) |
is_homeowner | 2 | Yes (y), No (n) |
income_range_lc | 9 | less than $20,000, $20,000 to $44,999, ..., $250,000+ |
net_worth | 13 | -$20,000 to -$2,500, -$2,499 to $2,499, ..., $1,000,000 or more |
is_profile_b2b | 2 | Yes (y), No (n) |
is_profile_b2c | 2 | Yes (y), No (n) |
Event
| Field | Options |
|---|---|
resolved | 2 (Yes (true), No (false)) |
Using Field Catalog in the Audience Builder
Rendering Filter Controls
- Fetch fields once when the audience builder loads:
GET /api/v1/field-catalog?schema_type=audience&status=active&include_options=true - Group by
categoryfor the sidebar/accordion (Contact, Company, Demographics, Intent). - Sort by
sort_orderwithin each category. - Render controls by
field_type:multiselect/selectwithoptions-- render a dropdown populated fromoptions[].labelmultiselectwith 1000+ options (e.g.job_title_normalized) -- render a searchable typeaheadtext-- render a free-text input
- Show valid operators from the
operatorsarray. Map them to user-friendly labels:
| Operator | Display Label |
|---|---|
in | "is any of" |
notin | "is none of" |
is / eq | "equals" |
is not / neq | "does not equal" |
contains | "contains" |
notcontains | "does not contain" |
startsWith | "starts with" |
endsWith | "ends with" |
notnull | "has a value" |
Submitting Filter Rules
When the user builds a filter, use options[].value (not label) in the rule:
{
"fieldName": "seniority_level",
"conditionRules": {
"operator": "in",
"value": ["cxo", "vp", "director"]
}
}See Building Audience Filters for the full filter structure and examples.
Write Endpoints (Internal Only)
These endpoints require the developer flag (internal users only). Regular authenticated users get 403.
| Method | Path | Description |
|---|---|---|
POST | /api/v1/field-catalog | Create a new field |
POST | /api/v1/field-catalog/bulk | Bulk update fields |
PUT | /api/v1/field-catalog/{key} | Update a field by key |
DELETE | /api/v1/field-catalog/{key} | Delete a field by key |
Updated 15 minutes ago