Overview
Custom fields consist of two parts:- 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 )
- 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
candidateorjob(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 viaAuthorization: Bearer YOUR_API_KEY header.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
entityType | string | No | Filter by entity type: candidate or job |
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 viaAuthorization: Bearer YOUR_API_KEY header.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
customFieldId | string | The unique identifier of the custom field |
Example Request
Example Response
Error Responses
Custom field not found:Create Custom Field
Create a new custom field for jobs or candidates.POST /custom-fields
Authentication
Requires API key authentication viaAuthorization: Bearer YOUR_API_KEY header.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
entityType | string | Yes | Entity type: candidate or job |
fieldLabel | string | Yes | Display name for the field |
fieldType | string | Yes | Field type: text, number, date, select, multi-select, checkbox, textarea |
parentSection | string | No | Section where field appears (see Parent Sections) |
options | array | Conditional | Required for select and multi-select types. Array of option strings |
description | string | No | Description/help text for the field |
Field Types
| Field Type | Description | Options Required |
|---|---|---|
text | Single-line text input | No |
textarea | Multi-line text input | No |
number | Numeric input | No |
date | Date picker | No |
checkbox | Boolean checkbox | No |
select | Single-select dropdown | Yes |
multi-select | Multi-select dropdown | Yes |
Parent Sections
For Candidates (entityType: "candidate")
Personal DetailsSocial ContactsExperienceEducationSkillsMiscellaneous
For Jobs (entityType: "job")
Job OverviewJob DescriptionJob Pipeline StagesLocationRevenue DetailsClient Company DetailsSalary DetailsCandidate RequirementsCandidate Form RequirementsScreening 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:Update Custom Field
Update an existing custom field. Note:fieldType cannot be changed after creation.
PUT /custom-fields/:customFieldId
Authentication
Requires API key authentication viaAuthorization: Bearer YOUR_API_KEY header.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
customFieldId | string | The unique identifier of the custom field to update |
Request Body
All fields are optional - only include fields you want to update.| Field | Type | Required | Description |
|---|---|---|---|
fieldLabel | string | No | Updated display name |
parentSection | string | No | Updated parent section |
options | array | No | Updated options (for select/multi-select fields) |
description | string | No | Updated description |
fieldType and entityType cannot be updated after creation.
Example Request
Example Response
Error Responses
Custom field not found: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 viaAuthorization: Bearer YOUR_API_KEY header.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
customFieldId | string | The unique identifier of the custom field to delete |
Example Request
Example Response
Error Responses
Custom field not found:Limitations and Best Practices
Limitations
-
Field Type Immutability: Once a custom field is created, its
fieldTypecannot be changed. You must delete and recreate the field if you need a different type. -
Entity Type Immutability: The
entityType(candidate or job) cannot be changed after creation. - Options for Select Fields: Select and multi-select fields require at least one option. Options cannot be empty.
- Company Isolation: Custom fields are company-specific. You can only access and modify custom fields that belong to your company.
Best Practices
- Naming: Use clear, descriptive field labels that indicate the purpose of the field.
- Parent Sections: Choose appropriate parent sections to organize fields logically in the UI.
- Options: For select/multi-select fields, provide comprehensive and mutually exclusive options.
- Descriptions: Include helpful descriptions to guide users on how to use the field.
-
Field Types: Choose the appropriate field type for your data:
- Use
textfor short, single-line inputs - Use
textareafor longer, multi-line text - Use
numberfor numeric values - Use
datefor date values - Use
selectwhen users should choose one option - Use
multi-selectwhen users can choose multiple options - Use
checkboxfor boolean yes/no values
- Use
- 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:
| Parameter | Type | Required | Description |
|---|---|---|---|
entityType | string | Yes | Entity type: candidate or job |
entityId | integer | Yes | The ID of the candidate or job |
parentEntityType | string | No | Filter by parent entity type (e.g., work_experience for nested fields) |
parentEntityId | integer | No | Filter by parent entity ID (epoch timestamp for work experiences) |
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:
| Field | Type | Required | Description |
|---|---|---|---|
customFieldId | integer | Yes | The ID of the custom field |
entityType | string | Yes | Entity type: candidate or job |
entityId | integer | Yes | The ID of the candidate or job |
value | mixed | Yes | The value to store (type depends on field type) |
parentEntityType | string | No | Parent entity type (e.g., work_experience for nested fields) |
parentEntityId | integer | No | Parent entity ID (epoch timestamp for work experiences) |
| Field Type | Value Format | Example |
|---|---|---|
text | string | "Some text" |
textarea | string | "Long text content" |
number | number | 42.5 |
date | string (ISO date) | "2024-01-15" |
checkbox | boolean | true |
select | string | "Option 1" |
multi-select | array of strings | ["Option 1", "Option 2"] |
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:
| Field | Type | Required | Description |
|---|---|---|---|
entityType | string | Yes | Entity type: candidate or job |
entityId | integer | Yes | The ID of the candidate or job |
values | array | Yes | Array of value objects with customFieldId, value, and optional parentEntityType/parentEntityId |
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
valuecolumn - Multi-select: Stored as JSON stringified arrays (e.g.,
["Option 1", "Option 2"]) - Number: Stored in the
valueNumbercolumn as decimals - Date: Stored in the
valueDatecolumn as DATEONLY (format:YYYY-MM-DD) - Checkbox: Stored in the
valueBooleancolumn as booleans
Nested Fields
Custom fields can be nested within work experiences. When setting values for nested fields:- Set
parentEntityTypeto"work_experience" - Set
parentEntityIdto 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, andparentEntityId, 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 thecustomFields object:
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:
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
id and entityType are not included in the nested objects, as they are already represented by the key (customFieldId) and context..png?fit=max&auto=format&n=lKy84_BssSCy2hcz&q=85&s=ac7c949427cc2893306f6036415f087e)