Skip to content

Create Contact Column

POST
/contacts/columns/create

Create a custom contact column. Global if list_id is null, list-scoped otherwise.

Optionally pass an enrichment block to provision a companion waterfall pipeline in the same request — STRONGLY RECOMMENDED so the UI ‘Enrich’ button works out-of-the-box. Without it the column is created but isn’t enrichable until a pipeline is provisioned via POST /enrichment/waterfall/configs.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

Request body for POST /contacts/columns/create.

Mirrors the shared CreateColumnRequest shape (title, data_type, list_id, created_by) plus an OPTIONAL enrichment block that, when supplied, provisions a companion waterfall pipeline in the same request — so the new column is immediately runnable via POST /enrichment/waterfall/enrich.

Without the enrichment block the column is created, but it has no enrichment plan; the UI “Enrich” button (and g8_enrich_contacts in waterfall mode) will return 422 (waterfall_config_missing) until a pipeline is provisioned separately via POST /enrichment/waterfall/configs.

Backwards compatible: callers that previously POSTed only title / data_type / list_id / created_by continue to work unchanged.

object
created_by
required

Email of the user creating the column (for audit).

string format: email
data_type

Column data type. Currently only ‘text’ is supported.

string
default: text
Allowed values: text int numeric boolean
enrichment
Any of:

Optional enrichment-pipeline block attached at column-create time.

When supplied, POST /fields creates a companion enrichment_configs row in the same request so the new column is immediately runnable via POST /enrichment/waterfall/enrich. Without this block the column exists but has no enrichment plan — calling /waterfall/enrich on it returns 422 (waterfall_config_missing).

Currently only type='waterfall' is supported; AI / formula enrichment will follow once the rest of the agent surface lands.

object
email_verification
Any of:

Email verification config attached to a waterfall pipeline.

Mirrors the canonical EmailVerificationConfigDto in enrichment/interfaces/fastapi/waterfall_dtos.py so the dev-API and the UI persist an identical settings shape (the CF worker reads settings. email_verification.* regardless of which surface saved the pipeline).

object
accept_catchall

Treat catch-all responses as valid (domains that accept any address).

boolean
enabled

Enable post-enrichment email verification

boolean
default: true
provider

Verification provider. Charges credits when use_system_credentials=True.

string
default: zerobounce
Allowed values: zerobounce hunter icypeas leadmagic
use_system_credentials

Use graph8-managed API keys (charges credits). False = use org’s BYOK keys.

boolean
default: true
valid_statuses

Verification statuses to accept as valid. Typical: [‘valid’] or [‘valid’,‘catch-all’].

Array<string>
field_to_enrich
Any of:
string
name
Any of:
string
providers
Any of:
Array<string>
skip_existing_values

If true, skip rows where the target field is already populated.

boolean
default: true
steps
Any of:
Array<object>

Single step in a caller-supplied waterfall sequence.

Mirrors WaterfallStepDto in enrichment/interfaces/fastapi/waterfall_dtos.py. Persisted verbatim into enrichment_configs.config.steps[] so the CF worker can resolve provider, action and credentials the same way UI-saved pipelines do.

object
action
required

Provider action: lookup_person, find_email, enrich_person, …

string
action_display_name
Any of:
string
confidence_threshold
number
<= 1
config

Provider-specific options (e.g. apollo reveal_phone_numbers=true).

object
key
additional properties
any
enabled
boolean
default: true
id
Any of:
string
input_mapping

Maps provider input names to graph8 column identifiers (CONTACT_*).

object
key
additional properties
string
is_system_provider

True = use graph8-managed credentials + charge credits. False = use org BYOK.

boolean
max_retries
integer
<= 3
order

0-indexed execution order.

integer
output_field
Any of:
string
output_mapping

Optional output field remap (deprecated — prefer output_field).

object
key
additional properties
string
provider
required

Provider name: graph8, hunter, prospeo, dropcontact, apollo, …

string
stop_on_success
boolean
default: true
target_field
Any of:
string
type

Pipeline kind. Only ‘waterfall’ is supported today.

string
default: waterfall
list_id
Any of:
integer
title
required

Column title shown in the UI (e.g. ‘Lead Score’)

string

Responses

201

Successful Response

object
data
required

Response shape for POST /contacts/columns/create.

Mirrors the Column entity fields verbatim so existing callers reading data.id / data.title / data.name / data.is_global etc. keep working without code changes. Adds one new optional enrichment field that is populated when the request included an enrichment block.

object
data_type

User-selectable dynamic-column data types.

Every member must have a physical type in the repos’ pg_type_map (contacts/companies CDP repos + enrichment DynamicColumnRepository: int→INTEGER, numeric→NUMERIC, text→TEXT, boolean→BOOLEAN) and belong to the user-owned family in lists/usecases/dynamic_column_write_contract.py — both already list these four. Write paths coerce values per type via shared.infrustructure.db.cdp.dynamic_column_values.coerce_dynamic_value.

string
default: text
Allowed values: text int numeric boolean
enrichment
Any of:

Echo of the companion enrichment config created by enrichment block.

object
column_id
required

Column_id slug to pass to /enrichment/waterfall/enrich

string
config_id
required
string
email_verification
Any of:
object
key
additional properties
any
name
required
string
providers
Array<string>
type
required
string
id
Any of:
integer
is_global

Computed: True when object_id is null/empty (global column).

boolean
name
Any of:
string
object_id
Any of:
string
title
required
string
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string