All docs

Fields

List, create, and write custom field definitions and values for contacts and companies

Fields are the column definitions for contacts and companies. Use these endpoints to discover available fields — both built-in and custom — and to create new custom columns, populate their values, and optionally provision enrichment pipelines that fill them automatically.


List Contact Fields

GET /fields

Returns all contact field definitions, including base fields and any custom fields. Pass list_id to include list-specific custom fields.

Query Parameters

ParameterTypeDefaultDescription
list_idintegerInclude custom fields specific to this list

Example

cURL

curl "https://be.graph8.com/api/v1/fields" \
  -H "Authorization: Bearer $API_KEY"

Response

{
  "data": [
    {
      "id": 1,
      "title": "Job Level",
      "name": "job_level",
      "data_type": "text",
      "is_global": true
    }
  ]
}

List Company Fields

GET /fields/companies

Returns all company field definitions, including base fields and any custom fields. Same response shape as GET /fields.

Query Parameters

ParameterTypeDefaultDescription
list_idintegerInclude custom fields specific to this list

Example

cURL

curl "https://be.graph8.com/api/v1/fields/companies" \
  -H "Authorization: Bearer $API_KEY"

Response

{
  "data": [
    {
      "id": 1,
      "title": "Company Name",
      "name": "COMPANY_NAME",
      "data_type": "text",
      "is_global": true
    }
  ]
}

Create a Custom Field

POST /fields → 201

Creates a single custom column for contacts or companies. Optionally provisions a waterfall enrichment pipeline alongside the column in the same request.

Request Body

FieldTypeRequiredDescription
titlestringRDisplay name for the column
data_typestringOColumn data type. Default "text"
list_idintegerOScope to a specific list. null or omitted = global. Required when enrichment is set.
entitystringO"contacts" or "companies". Default "contacts"
enrichmentobjectOWhen present, provisions a waterfall pipeline alongside the column. See enrichment fields below.

enrichment object fields

FieldTypeRequiredDescription
typestringOPipeline kind. Default "waterfall" (only supported kind today)
namestringOPipeline display name. Default "<title> Enrichment"
field_to_enrichstringOColumn slug to target. Defaults to the new column’s slug
skip_existing_valuesbooleanOSkip contacts that already have a value. Default true
providersarray of stringsOShorthand provider list. Mutually exclusive with steps. Allowed: graph8, hunter, prospeo, dropcontact, icypeas, leadmagic, emaillistverify, apollo, lusha, rocketreach
stepsarray of objectsOFull step DTOs. Mutually exclusive with providers
email_verificationobjectOPost-enrichment validation config. See below.

email_verification object fields

FieldTypeDescription
enabledbooleanEnable email verification
providerstringzerobounce, hunter, icypeas, or leadmagic
use_system_credentialsbooleanUse graph8’s system credentials for the provider
accept_catchallbooleanTreat catch-all addresses as valid
valid_statusesarray of stringsWhich statuses to accept (e.g. ["valid"])

Example

cURL

# Simple column (no enrichment)
curl -X POST "https://be.graph8.com/api/v1/fields" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Job Level",
    "data_type": "text",
    "list_id": 12345,
    "entity": "contacts"
  }'

# Column + enrichment pipeline
curl -X POST "https://be.graph8.com/api/v1/fields" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Job Level",
    "data_type": "text",
    "list_id": 12345,
    "entity": "contacts",
    "enrichment": {
      "type": "waterfall",
      "name": "Job Level Enrichment",
      "field_to_enrich": "job_level",
      "skip_existing_values": true,
      "providers": ["hunter", "prospeo"],
      "email_verification": {
        "enabled": true,
        "provider": "zerobounce",
        "use_system_credentials": true,
        "accept_catchall": false,
        "valid_statuses": ["valid"]
      }
    }
  }'

Response (no enrichment)

{
  "data": {
    "id": 1,
    "title": "Job Level",
    "data_type": "text",
    "name": "job_level",
    "list_id": 12345,
    "is_global": false,
    "enrichment": null
  }
}

Response (with enrichment)

{
  "data": {
    "id": 1,
    "title": "Job Level",
    "data_type": "text",
    "name": "job_level",
    "list_id": 12345,
    "is_global": false,
    "enrichment": {
      "column_id": "job_level",
      "config_id": "uuid",
      "name": "Job Level Enrichment",
      "type": "waterfall",
      "providers": ["hunter", "prospeo"],
      "email_verification": {
        "enabled": true,
        "provider": "zerobounce"
      }
    }
  }
}

Create Multiple Custom Fields

POST /fields/batch → 201

Creates many custom columns in a single request. All columns are created in a single DB transaction with a single view rebuild — far more efficient than calling POST /fields in a loop when setting up a list with many columns.

entity and list_id are shared across the entire batch. title, data_type, and enrichment are per-column.

Request Body

FieldTypeRequiredDescription
entitystringO"contacts" or "companies". Applies to all columns. Default "contacts"
list_idintegerOShared list scope. Required if any field has enrichment set.
fieldsarray of objectsR1–100 column definitions. Each item may have title (R), data_type (O), and enrichment (O, same shape as POST /fields)

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/fields/batch" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "entity": "contacts",
    "list_id": 12345,
    "fields": [
      { "title": "Persona" },
      { "title": "Account Tier", "data_type": "text" },
      {
        "title": "Work Email",
        "enrichment": {
          "type": "waterfall",
          "providers": ["graph8", "hunter", "prospeo"],
          "email_verification": {
            "enabled": true,
            "provider": "zerobounce"
          }
        }
      }
    ]
  }'

Response

{
  "data": {
    "entity": "contacts",
    "list_id": 12345,
    "total_requested": 3,
    "total_created": 3,
    "results": [
      {
        "title": "Persona",
        "id": 10,
        "name": "udo_persona_1700000000",
        "ok": true,
        "error": null,
        "enrichment": null
      },
      {
        "title": "Account Tier",
        "id": 11,
        "name": "udo_account_tier_1700000000",
        "ok": true,
        "error": null,
        "enrichment": null
      },
      {
        "title": "Work Email",
        "id": 12,
        "name": "udo_work_email_1700000000",
        "ok": true,
        "error": null,
        "enrichment": {
          "column_id": "udo_work_email_1700000000",
          "config_id": "uuid",
          "name": "Work Email Enrichment",
          "type": "waterfall",
          "providers": ["graph8", "hunter", "prospeo"],
          "email_verification": {
            "enabled": true,
            "provider": "zerobounce"
          }
        }
      }
    ]
  }
}

Write a Custom Field Value

PATCH /fields/{column_id}/values

Sets (or clears) the value of a custom column for a single contact or company record.

Path Parameters

ParameterTypeDescription
column_idintegerThe numeric ID of the custom field (from GET /fields)

Request Body

FieldTypeRequiredDescription
record_idintegerRContact or company ID
valuestringONew value. Pass null or omit to clear the field
entitystringO"contacts" or "companies". Default "contacts"

Example

cURL

# Set a value
curl -X PATCH "https://be.graph8.com/api/v1/fields/1/values" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "record_id": 101,
    "value": "Director",
    "entity": "contacts"
  }'

# Clear a value
curl -X PATCH "https://be.graph8.com/api/v1/fields/1/values" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "record_id": 101,
    "value": null,
    "entity": "contacts"
  }'

Response

{ "data": { "column_id": 1, "record_id": 101, "updated": true } }

Read a Custom Field Value

GET /fields/{column_id}/values

Reads the value of a custom column for a single contact or company record.

Path Parameters

ParameterTypeDescription
column_idintegerThe numeric ID of the custom field (from GET /fields)

Query Parameters

ParameterTypeDefaultDescription
record_idintegerR — Contact ID (entity=contacts) or company ID (entity=companies)
entitystringcontactscontacts or companies

Example

cURL

curl "https://be.graph8.com/api/v1/fields/1/values?record_id=101&entity=contacts" \
  -H "Authorization: Bearer $API_KEY"

Response

{
  "data": {
    "column_id": 1,
    "record_id": 101,
    "entity": "contacts",
    "name": "udo_job_level_1712000000",
    "value": "Director"
  }
}

value is null when the column has not been set for this record.

Errors: 400 for an invalid entity; 404 when the column (for that entity) or the record does not exist.

Build with graph8