Skip to main content

Custom Toolkits

Tags: ai, customization, tools

Custom AI toolkit creation and management

In the product: Custom Toolkits · Toolkits

Resources

Request and response models used by the endpoints on this page.

AbilityResponse

FieldTypeRequiredDescription
abilityTypeString
celConditionString
configDict[str, Any]
enabledBoolean
idInteger
uuidString

Example:

{
"id": 0 // Integer,
"uuid": "string" // String,
"abilityType": "string" // String,
"config": {} // Dict[str, Any],
"enabled": false // Boolean,
"celCondition": "string" // String, optional
}

CustomToolResponse

FieldTypeRequiredDescription
abilitiesArray
chatModelLiteral[openai:chat:gpt-4.1, openai:chat:gpt-4.1-mini, openai:chat:gpt-4o, openai:chat:gpt-4o-mini, openai:chat:gpt-5, openai:chat:gpt-5.1, openai:chat:gpt-5-mini, openai:chat:gpt-5-nano, openai:chat:gpt-5.4, openai:chat:gpt-5.4-mini, openai:chat:gpt-5.4-nano, google:vertex:gemini-2.0-flash, google:vertex:gemini-flash-exp-2.0, google:vertex:gemini-2.5-flash, google:vertex:gemini-3-flash, google:vertex:gemini-3.5-flash, google:vertex:gemini-3-pro-preview, google:vertex:gemini-3.1-pro, google:aistudio:gemini-2.5-flash, google:aistudio:gemini-3-flash, google:aistudio:gemini-3.5-flash, google:aistudio:gemini-3-pro-preview, google:aistudio:gemini-3.1-pro, google:aistudio:gemini-3.1-flash-lite, google:aistudio:gemini-2.5-pro, google:vertex:claude-3.5-opus, google:vertex:claude-3.5-sonnet, google:vertex:claude-3.7, google:vertex:claude-4-opus, google:vertex:claude-4-sonnet, google:vertex:claude-4-5-haiku, aws:bedrock:claude-3.5-opus, aws:bedrock:claude-3.5-sonnet, aws:bedrock:claude-3.7, aws:bedrock:claude-4-opus, aws:bedrock:claude-4-1-opus, aws:bedrock:claude-4-sonnet, aws:bedrock:claude-4-5-opus, aws:bedrock:claude-4-6-opus, aws:bedrock:claude-4-5-sonnet, aws:bedrock:claude-4-6-sonnet, aws:bedrock:claude-4-5-haiku, aws:bedrock:gpt-oss-20b, aws:bedrock:gpt-oss-120b, aws:bedrock:nova-pro-1, aws:bedrock:nova-2-lite, aws:bedrock:kimi-k2.5, xai:chat:grok-4.20-0309-reasoning, xai:chat:grok-4.20-0309-non-reasoning, xai:chat:grok-4-1-fast-reasoning, xai:chat:grok-4-1-fast-non-reasoning, xai:chat:grok-4.3, xai:chat:grok-4.5]
createdAtDateTime
customToolkitIdInteger
dataTypesArray
descriptionString
displayNameString
filesArray
idInteger
inputSchemaObject
nameString
outputSchemaObject
promptString
updatedAtDateTime
uuidString

Example:

{
"id": 0 // Integer,
"uuid": "string" // String,
"customToolkitId": 0 // Integer,
"name": "string" // String,
"displayName": "string" // String, optional,
"description": "string" // String,
"prompt": "string" // String,
"chatModel": null // Literal[openai:chat:gpt-4.1, openai:chat:gpt-4.1-mini, openai:chat:gpt-4o, openai:chat:gpt-4o-mini, openai:chat:gpt-5, openai:chat:gpt-5.1, openai:chat:gpt-5-mini, openai:chat:gpt-5-nano, openai:chat:gpt-5.4, openai:chat:gpt-5.4-mini, openai:chat:gpt-5.4-nano, google:vertex:gemini-2.0-flash, google:vertex:gemini-flash-exp-2.0, google:vertex:gemini-2.5-flash, google:vertex:gemini-3-flash, google:vertex:gemini-3.5-flash, google:vertex:gemini-3-pro-preview, google:vertex:gemini-3.1-pro, google:aistudio:gemini-2.5-flash, google:aistudio:gemini-3-flash, google:aistudio:gemini-3.5-flash, google:aistudio:gemini-3-pro-preview, google:aistudio:gemini-3.1-pro, google:aistudio:gemini-3.1-flash-lite, google:aistudio:gemini-2.5-pro, google:vertex:claude-3.5-opus, google:vertex:claude-3.5-sonnet, google:vertex:claude-3.7, google:vertex:claude-4-opus, google:vertex:claude-4-sonnet, google:vertex:claude-4-5-haiku, aws:bedrock:claude-3.5-opus, aws:bedrock:claude-3.5-sonnet, aws:bedrock:claude-3.7, aws:bedrock:claude-4-opus, aws:bedrock:claude-4-1-opus, aws:bedrock:claude-4-sonnet, aws:bedrock:claude-4-5-opus, aws:bedrock:claude-4-6-opus, aws:bedrock:claude-4-5-sonnet, aws:bedrock:claude-4-6-sonnet, aws:bedrock:claude-4-5-haiku, aws:bedrock:gpt-oss-20b, aws:bedrock:gpt-oss-120b, aws:bedrock:nova-pro-1, aws:bedrock:nova-2-lite, aws:bedrock:kimi-k2.5, xai:chat:grok-4.20-0309-reasoning, xai:chat:grok-4.20-0309-non-reasoning, xai:chat:grok-4-1-fast-reasoning, xai:chat:grok-4-1-fast-non-reasoning, xai:chat:grok-4.3, xai:chat:grok-4.5], optional,
"inputSchema": {} // Object, optional,
"outputSchema": {} // Object, optional,
"files": [] // Array<FileResponse>, optional, default: PydanticUndefined,
"dataTypes": [] // Array<DataTypeResponse>, optional, default: PydanticUndefined,
"abilities": [] // Array<AbilityResponse>, optional, default: PydanticUndefined,
"createdAt": "2024-01-01T00:00:00Z" // DateTime,
"updatedAt": "2024-01-01T00:00:00Z" // DateTime
}

CustomToolkitResponse

FieldTypeRequiredDescription
abilitiesArray
createdAtDateTime
customToolsArray
descriptionString
idInteger
nameString
ownerIdInteger
permissionsIntegerDefault: 0
slugString
state<enum ToolkitState
updatedAtDateTime

Example:

{
"id": 0 // Integer,
"name": "string" // String,
"slug": "string" // String,
"description": "string" // String,
"state": null // <enum ToolkitState,
"customTools": [] // Array<CustomToolResponse>, optional, default: PydanticUndefined,
"abilities": [] // Array<AbilityResponse>, optional, default: PydanticUndefined,
"ownerId": 0 // Integer,
"createdAt": "2024-01-01T00:00:00Z" // DateTime,
"updatedAt": "2024-01-01T00:00:00Z" // DateTime,
"permissions": 0 // Integer, optional, default: 0
}

DataTypeMemberRoleAccessResponse

FieldTypeRequiredDescription
accessModeInteger
memberRoleIdInteger
memberRoleNameString

Example:

{
"memberRoleId": 0 // Integer,
"memberRoleName": "string" // String,
"accessMode": 0 // Integer
}

DataTypeResponse

FieldTypeRequiredDescription
accessModeInteger
archivedBooleanDefault: False
categoriesArray
createRulesArray
createdAtDateTime
descriptionString
fieldsArray
idInteger
isCollectionBoolean
memberRoleAccessArray
nameString
ownerIdInteger
pinnedBoolean
promptString
recordCountInteger
recordScopeString
sensitivityString
slugString
updateRulesArray
updatedAtDateTime
uuidString

Example:

{
"id": 0 // Integer,
"name": "string" // String,
"uuid": "string" // String,
"slug": "string" // String,
"accessMode": 0 // Integer, optional,
"description": "string" // String,
"prompt": "string" // String,
"isCollection": false // Boolean,
"pinned": false // Boolean, optional,
"archived": false // Boolean, optional, default: False,
"ownerId": 0 // Integer, optional,
"recordScope": "string" // String,
"sensitivity": "string" // String,
"categories": "string" // Array<String>,
"createdAt": "2024-01-01T00:00:00Z" // DateTime,
"updatedAt": "2024-01-01T00:00:00Z" // DateTime,
"createRules": [] // Array<EventRuleResponse>,
"updateRules": [] // Array<EventRuleResponse>,
"fields": [] // Array<SchemaField>,
"memberRoleAccess": [] // Array<DataTypeMemberRoleAccessResponse>, optional, default: PydanticUndefined,
"recordCount": 0 // Integer, optional
}

EventRuleResponse

FieldTypeRequiredDescription
actionParamsDict[str, Any]
actionType<enum EventRuleActionType
activeBoolean
appConnectionIdInteger
calendarEventTypeIdInteger
calendarIdInteger
celBlockedAtDateTime
conditionsString
createdAtDateTime
dataTypeIdInteger
dataTypeNameString
delayInteger
errorString
errorMessageString
eventType<enum EventRuleEventType
failedAtDateTime
idInteger
journeyIdInteger
journeyStepIdInteger
nameString
objectType<enum EventRuleObjectType
orderInteger
routineIdInteger
taskIdInteger
taskNameString
taskWorkflowIdInteger
triggerParamsDict[str, Any]
updatedAtDateTime
uuidString
workflowRevisionIdInteger

Example:

{
"id": 0 // Integer,
"uuid": "string" // String,
"objectType": null // <enum EventRuleObjectType,
"name": "string" // String,
"eventType": null // <enum EventRuleEventType,
"conditions": "string" // String,
"actionType": null // <enum EventRuleActionType,
"actionParams": {} // Dict[str, Any],
"triggerParams": {} // Dict[str, Any],
"active": false // Boolean,
"createdAt": "2024-01-01T00:00:00Z" // DateTime,
"updatedAt": "2024-01-01T00:00:00Z" // DateTime,
"taskId": 0 // Integer,
"taskName": "string" // String, optional,
"taskWorkflowId": 0 // Integer, optional,
"dataTypeId": 0 // Integer,
"dataTypeName": "string" // String, optional,
"routineId": 0 // Integer,
"workflowRevisionId": 0 // Integer,
"calendarId": 0 // Integer,
"calendarEventTypeId": 0 // Integer,
"journeyStepId": 0 // Integer,
"journeyId": 0 // Integer, optional,
"appConnectionId": 0 // Integer, optional,
"error": "string" // String,
"errorMessage": "string" // String,
"failedAt": "2024-01-01T00:00:00Z" // DateTime,
"celBlockedAt": "2024-01-01T00:00:00Z" // DateTime, optional,
"delay": 0 // Integer,
"order": 0 // Integer
}

FileResponse

FieldTypeRequiredDescription
accessStringDefault: private
accessModeInteger
cdnUrlString
choicePromptString
createdAtDateTime
currentVersionNumberIntegerDefault: 0
dataString
descriptionString
externalIdString
fileSizeInteger
filenameString
folderFileFolderResponse
folderIdInteger
idInteger
isS3StoredBooleanDefault: False
labelsArray
lastEditedByMemberIdInteger
mimeTypeString
ownerIdInteger
permissionsIntegerDefault: 0
shareCountIntegerDefault: 0
siteIdInteger
titleString
updatedAtDateTime
uuidString

Example:

{
"id": 0 // Integer,
"uuid": "string" // String,
"title": "string" // String,
"description": "string" // String,
"accessMode": 0 // Integer, optional,
"choicePrompt": "string" // String, optional,
"filename": "string" // String,
"mimeType": "string" // String,
"folderId": 0 // Integer,
"siteId": 0 // Integer,
"externalId": "string" // String,
"ownerId": 0 // Integer, optional,
"access": "string" // String, optional, default: private,
"folder": null // FileFolderResponse,
"createdAt": "2024-01-01T00:00:00Z" // DateTime,
"updatedAt": "2024-01-01T00:00:00Z" // DateTime,
"data": "string" // String,
"cdnUrl": "string" // String,
"fileSize": 0 // Integer,
"isS3Stored": false // Boolean, optional, default: False,
"permissions": 0 // Integer, optional, default: 0,
"labels": [] // Array<FileLabelResponse>, optional,
"shareCount": 0 // Integer, optional, default: 0,
"currentVersionNumber": 0 // Integer, optional, default: 0,
"lastEditedByMemberId": 0 // Integer, optional
}

SchemaField

FieldTypeRequiredDescription
adminOnlyBooleanWhether only admins can see this field (default: False)
categoriesArray<Literal[personal, identifier, phi, credential]>Regulatory or content categories for audit and policy
celFunctionStringCEL expression that computes this field's value. CONSTRAINT: Can ONLY reference regular fields (TEXT, NUMBER, DATE, etc.). Cannot reference other FUNCTION fields. Syntax: record.data.<field_slug>. Example: 'record.data.score1 + record.data.score2'
defaultValueAnyDefault value for the field
descriptionStringOptional field description
fieldTypeUnion[Literal[enum, email, phone, text, longtext, number, integer, boolean, date, datetime, time_of_day, us_zip_code, array, object, function], DataFieldType]Field type (text, email, enum, etc.) (default: text)
nameStringDisplay name for the field
optionsArrayOptions for enum fields as {label, value} objects.
orderIntegerDeprecated: Display order is now determined by array position
referencedTypeIdIntegerReferenced DataType ID for reference fields
requiredBooleanWhether field is required (default: False)
sensitivityLiteral[public, internal, confidential, restricted, secret]Disclosure severity for audit and access policy (default: confidential)
shouldIndexBooleanWhether to index this field (default: False)
slugStringUnique field identifier
validateCelStringCEL expression for cross-field validation. Context: 'value' (current field value), 'record.data.<field_slug>' (other fields). Returns: true if valid, or a string error message if invalid. CONSTRAINT: Can only reference non-FUNCTION fields. Example: 'value >= record.data.min_score' or 'value < record.data.min_score ? "Must be >= " + string(record.data.min_score) : true'

Example:

{
"slug": "string" // String, Unique field identifier,
"name": "string" // String, Display name for the field,
"description": "string" // String, optional, Optional field description,
"fieldType": 0 // Union[Literal[enum, email, phone, text, longtext, number, integer, boolean, date, datetime, time_of_day, us_zip_code, array, object, function], DataFieldType], optional, default: text, Field type (text, email, enum, etc.),
"required": false // Boolean, optional, default: False, Whether field is required,
"order": 0 // Integer, optional, Deprecated: Display order is now determined by array position,
"options": [] // Array<EnumOption>, optional, Options for enum fields as {label, value} objects.,
"referencedTypeId": 0 // Integer, optional, Referenced DataType ID for reference fields,
"shouldIndex": false // Boolean, optional, default: False, Whether to index this field,
"adminOnly": false // Boolean, optional, default: False, Whether only admins can see this field,
"defaultValue": null // Any, optional, Default value for the field,
"celFunction": "string" // String, optional, CEL expression that computes this field's value. CONSTRAINT: Can ONLY reference regular fields (TEXT, NUMBER, DATE, etc.). Cannot reference other FUNCTION fields. Syntax: record.data.<field_slug>. Example: 'record.data.score1 + record.data.score2',
"validateCel": "string" // String, optional, CEL expression for cross-field validation. Context: 'value' (current field value), 'record.data.<field_slug>' (other fields). Returns: true if valid, or a string error message if invalid. CONSTRAINT: Can only reference non-FUNCTION fields. Example: 'value >= record.data.min_score' or 'value < record.data.min_score ? "Must be >= " + string(record.data.min_score) : true',
"sensitivity": null // Literal[public, internal, confidential, restricted, secret], optional, default: confidential, Disclosure severity for audit and access policy,
"categories": [] // Array<Literal[personal, identifier, phi, credential]>, optional, default: PydanticUndefined, Regulatory or content categories for audit and policy
}

Endpoints

List

GET /api/v2/w/{workspace_uuid}/custom-toolkits

Description:

List all custom toolkits the current member has access to.

Authorization: Requires apps:read scope

Response: List of CustomToolkitResponse


Create

POST /api/v2/w/{workspace_uuid}/custom-toolkits

Description:

Create a new custom toolkit.

Authorization: Requires apps:write scope

Parameters:

Response: See CustomToolkitResponse


Delete Toolkit Id

DELETE /api/v2/w/{workspace_uuid}/custom-toolkits/{toolkit_id}

Description:

Delete a custom toolkit.

Authorization: Requires apps:admin scope

Parameters:

  • toolkit_id (Integer)

Get Toolkit Id

GET /api/v2/w/{workspace_uuid}/custom-toolkits/{toolkit_id}

Description:

Get a specific custom toolkit by ID.

Authorization: Requires apps:read scope

Parameters:

  • toolkit_id (Integer)

Response: See CustomToolkitResponse


Update Toolkit Id

PUT /api/v2/w/{workspace_uuid}/custom-toolkits/{toolkit_id}

Description:

Update a custom toolkit.

Authorization: Requires apps:write scope

Parameters:

Response: See CustomToolkitResponse


Disable

POST /api/v2/w/{workspace_uuid}/custom-toolkits/{toolkit_id}/disable

Description:

Disable a custom toolkit.

Authorization: Requires apps:write scope

Parameters:

  • toolkit_id (Integer)

Response: See CustomToolkitResponse


Enable

POST /api/v2/w/{workspace_uuid}/custom-toolkits/{toolkit_id}/enable

Description:

Enable a custom toolkit.

Authorization: Requires apps:write scope

Parameters:

  • toolkit_id (Integer)

Response: See CustomToolkitResponse