Skip to main content
The Custom Fields API allows you to create, read, update, and delete custom field definitions and their values for jobs and candidates. Custom fields enable you to store additional structured data beyond the standard fields.

Overview

Custom fields consist of two parts:
  1. Custom Field Definitions: The field templates that define what type of data can be stored (e.g., “Preferred Communication Method” as a select field with options, “Tentative Closing Date” as a date field )
  2. Custom Field Values: The actual values stored for specific jobs or candidates (e.g., “Email” for a particular candidate)

Custom Field Definitions

Each custom field definition has:
  • Entity Type: Either candidate or job (determines which entity the field applies to)
  • Field Type: The data type (text, number, date, select, multi-select, checkbox, textarea)
  • Field Label: The display name for the field
  • Parent Section: The section where the field appears in the UI
  • Options: For select/multi-select fields, the available options

Custom Field Values

Custom field values link field definitions to specific entities with actual data. Values are stored in a normalized table format:
  • Text/Textarea/Select: Stored as strings (JSON string for multi-select arrays)
  • Number: Stored as decimals
  • Date: Stored as DATEONLY (YYYY-MM-DD format)
  • Checkbox: Stored as booleans

Custom Field Definitions

This section covers managing custom field definitions (the field templates).

Get All Custom Fields

Retrieve all custom fields for your company, optionally filtered by entity type.

GET /custom-fields

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Query Parameters

Example Request

Example Response

Get Custom Field by ID

Retrieve a specific custom field by its ID.

GET /custom-fields/:customFieldId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Example Request

Example Response

Error Responses

Custom field not found:
Unauthorized access:

Create Custom Field

Create a new custom field for jobs or candidates.

POST /custom-fields

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Request Body

Field Types

Parent Sections

For Candidates (entityType: "candidate")

  • Personal Details
  • Social Contacts
  • Experience
  • Education
  • Skills
  • Miscellaneous

For Jobs (entityType: "job")

  • Job Overview
  • Job Description
  • Job Pipeline Stages
  • Location
  • Revenue Details
  • Client Company Details
  • Salary Details
  • Candidate Requirements
  • Candidate Form Requirements
  • Screening Questions

Example Requests

Create a Text Field

Create a Select Field

Create a Multi-Select Field

Create a Number Field

Create a Date Field

Create a Checkbox Field

Example Response

Error Responses

Missing required fields:
Invalid entity type:
Invalid field type:
Missing options for select/multi-select:

Update Custom Field

Update an existing custom field. Note: fieldType cannot be changed after creation.

PUT /custom-fields/:customFieldId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Request Body

All fields are optional - only include fields you want to update. Note: fieldType and entityType cannot be updated after creation.

Example Request

Example Response

Error Responses

Custom field not found:
No fields to update:

Delete Custom Field

Delete a custom field. This will remove the field definition, but existing field values on jobs/candidates will remain.

DELETE /custom-fields/:customFieldId

Authentication

Requires API key authentication via Authorization: Bearer YOUR_API_KEY header.

Path Parameters

Example Request

Example Response

Error Responses

Custom field not found:
Unauthorized access:

Limitations and Best Practices

Limitations

  1. Field Type Immutability: Once a custom field is created, its fieldType cannot be changed. You must delete and recreate the field if you need a different type.
  2. Entity Type Immutability: The entityType (candidate or job) cannot be changed after creation.
  3. Options for Select Fields: Select and multi-select fields require at least one option. Options cannot be empty.
  4. Company Isolation: Custom fields are company-specific. You can only access and modify custom fields that belong to your company.

Best Practices

  1. Naming: Use clear, descriptive field labels that indicate the purpose of the field.
  2. Parent Sections: Choose appropriate parent sections to organize fields logically in the UI.
  3. Options: For select/multi-select fields, provide comprehensive and mutually exclusive options.
  4. Descriptions: Include helpful descriptions to guide users on how to use the field.
  5. Field Types: Choose the appropriate field type for your data:
    • Use text for short, single-line inputs
    • Use textarea for longer, multi-line text
    • Use number for numeric values
    • Use date for date values
    • Use select when users should choose one option
    • Use multi-select when users can choose multiple options
    • Use checkbox for boolean yes/no values
  6. Planning: Plan your custom fields carefully since field types cannot be changed after creation.

Custom Field Values

This section covers managing the actual values stored for custom fields on jobs and candidates. Values are stored in a normalized table for efficient querying and filtering.

Get Custom Field Values by Entity

Retrieve all custom field values for a specific candidate or job.

GET /custom-field-values

Authentication: Requires API key authentication via Authorization: Bearer YOUR_API_KEY header. Query Parameters: Example Request:
Example Response:

Get Custom Field Value by ID

Retrieve a specific custom field value by its ID.

GET /custom-field-values/:valueId

Path Parameters: valueId (integer) - The unique identifier of the custom field value Example Request:

Create or Update Custom Field Value

Create a new custom field value or update an existing one (upsert operation).

POST /custom-field-values

Request Body: Value Types by Field Type: Example Request:

Bulk Create or Update Custom Field Values

Create or update multiple custom field values in a single request.

POST /custom-field-values/bulk

Request Body: Example Request:

Delete Custom Field Value

Delete a specific custom field value by its ID.

DELETE /custom-field-values/:valueId

Example Request:

Delete All Custom Field Values for an Entity

Delete all custom field values for a specific candidate or job.

DELETE /custom-field-values/entity/:entityType/:entityId

Query Parameters: Optional parentEntityType and parentEntityId to filter by parent entity Example Request:

Additional Notes

Value Storage Details

  • Text/Textarea/Select: Stored as strings in the value column
  • Multi-select: Stored as JSON stringified arrays (e.g., ["Option 1", "Option 2"])
  • Number: Stored in the valueNumber column as decimals
  • Date: Stored in the valueDate column as DATEONLY (format: YYYY-MM-DD)
  • Checkbox: Stored in the valueBoolean column as booleans

Nested Fields

Custom fields can be nested within work experiences. When setting values for nested fields:
  • Set parentEntityType to "work_experience"
  • Set parentEntityId to the unique ID of the work experience (typically an epoch timestamp)

Upsert Behavior

The create/update endpoint (POST /custom-field-values) performs an upsert operation:
  • If a value already exists for the given customFieldId, entityType, entityId, and parentEntityId, it will be updated
  • If no value exists, a new one will be created

Alternative: Using Custom Fields in Job/Candidate APIs

You can also set custom field values when creating or updating jobs and candidates using the customFields object:
Where the keys are the custom field IDs and the values match the field type. See the Jobs API and Candidates API documentation for details.

Custom Fields in Job Candidate Responses

When retrieving candidates via the Job Candidates API (e.g., GET /job-candidates/stage/:stageId/candidates or POST /job-candidates/bulk-fetch), custom fields are returned in an enriched format that includes field labels and parent sections:
This format provides:
  • label: The display name of the custom field (from the field definition)
  • value: The actual value (type depends on field type: string, number, date, boolean, or array)
  • parentSection: The section where the field appears in the UI
This enriched format makes it easier to display custom fields in your application without needing to fetch field definitions separately. Note that the id and entityType are not included in the nested objects, as they are already represented by the key (customFieldId) and context.