Logic functions are server-side TypeScript functions that run on the Twenty platform. They can be triggered by HTTP requests, cron schedules, or database events — and can also be exposed as tools for AI agents.Documentation Index
Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
Use this file to discover all available pages before exploring further.
defineLogicFunction
Define logic functions and their triggers
defineLogicFunction
Define logic functions and their triggers
Each function file uses Available trigger types:The
In your handler, access the forwarded headers like this:Key points:
defineLogicFunction() to export a configuration with a handler and optional triggers.src/logic-functions/createPostCard.logic-function.ts
- httpRoute: Exposes your function on an HTTP path and method under the
/s/endpoint:
e.g.path: '/post-card/create'is callable athttps://your-twenty-server.com/s/post-card/create
- cron: Runs your function on a schedule using a CRON expression.
- databaseEvent: Runs on workspace object lifecycle events. When the event operation is
updated, specific fields to listen to can be specified in theupdatedFieldsarray. If left undefined or empty, any update will trigger the function.
e.g.person.updated,*.created,company.*
You can also manually execute a function using the CLI:You can watch logs with:
Route trigger payload
When a route trigger invokes your logic function, it receives aRoutePayload object that follows the
AWS HTTP API v2 format.
Import the RoutePayload type from twenty-sdk:RoutePayload type has the following structure:| Property | Type | Description | Example |
|---|---|---|---|
headers | Record\<string, string | undefined> | HTTP headers (only those listed in forwardedRequestHeaders) | see section below |
queryStringParameters | Record\<string, string | undefined> | Query string parameters (multiple values joined with commas) | /users?ids=1&ids=2&ids=3&name=Alice -> { ids: '1,2,3', name: 'Alice' } |
pathParameters | Record\<string, string | undefined> | Path parameters extracted from the route pattern | /users/:id, /users/123 -> { id: '123' } |
body | object | null | Parsed request body (JSON) | { id: 1 } -> { id: 1 } |
rawBody | string | undefined | Original UTF-8 request body, before JSON parsing. Useful for verifying HMAC-style webhook signatures (e.g. GitHub’s X-Hub-Signature-256, Stripe). undefined when the runtime did not preserve it. | |
isBase64Encoded | boolean | Whether the body is base64 encoded | |
requestContext.http.method | string | HTTP method (GET, POST, PUT, PATCH, DELETE) | |
requestContext.http.path | string | Raw request path |
forwardedRequestHeaders
By default, HTTP headers from incoming requests are not passed to your logic function for security reasons. To access specific headers, list them in theforwardedRequestHeaders array:Header names are normalized to lowercase. Access them using lowercase keys (e.g.,
event.headers['content-type']).Exposing a function as an AI tool or workflow action
Logic functions can be exposed on two surfaces, each with its own trigger:toolTriggerSettings— makes the function discoverable by Twenty’s AI features (chat, MCP, function calling). Uses standard JSON Schema, the format LLMs natively understand.workflowActionTriggerSettings— makes the function appear as a step in the visual workflow builder. Uses Twenty’s richInputSchemaso the builder can render proper field editors, variable pickers, and labels.
cronTriggerSettings, databaseEventTriggerSettings, and httpRouteTriggerSettings — same pattern, same shape.src/logic-functions/enrich-company.logic-function.ts
- A function can mix surfaces — declare both
toolTriggerSettingsandworkflowActionTriggerSettingsto expose it in chat AND in the workflow builder. toolTriggerSettings.inputSchemaandworkflowActionTriggerSettings.inputSchemaare both optional. When omitted, the manifest builder infers them from the handler source code (JSON Schema for the AI tool, Twenty’sInputSchemafor the workflow action). Provide one explicitly when you want richer typing — for example, withFieldMetadataType-aware fields likeCURRENCYorRELATIONfor the workflow builder, or withdescriptionfields the AI agent can read:
Write a good
description. AI agents rely on the function’s description field to decide when to use the tool. Be specific about what the tool does and when it should be called.Install hooks — pre-install and post-install handlers — share this runtime but are declared with their own define functions and don’t take trigger settings. See Install Hooks for
definePreInstallLogicFunction and definePostInstallLogicFunction.Typed API clients (twenty-client-sdk)
Thetwenty-client-sdk package provides two typed GraphQL clients for interacting with the Twenty API from your logic functions and front components.
| Client | Import | Endpoint | Generated? |
|---|---|---|---|
CoreApiClient | twenty-client-sdk/core | /graphql — workspace data (records, objects) | Yes, at dev/build time |
MetadataApiClient | twenty-client-sdk/metadata | /metadata — workspace config, file uploads | No, ships pre-built |
CoreApiClient
Query and mutate workspace data (records, objects)
CoreApiClient
Query and mutate workspace data (records, objects)
CoreApiClient is the main client for querying and mutating workspace data. It is generated from your workspace schema during yarn twenty dev or yarn twenty build, so it is fully typed to match your objects and fields.true to include a field, use __args for arguments, and nest objects for relations. You get full autocompletion and type checking based on your workspace schema.CoreApiClient is generated at dev/build time. If you use it without running
yarn twenty dev or yarn twenty build first, it throws an error. The generation happens automatically — the CLI introspects your workspace’s GraphQL schema and generates a typed client using @genql/cli.Using CoreSchema for type annotations
CoreSchema provides TypeScript types matching your workspace objects — useful for typing component state or function parameters:MetadataApiClient
Workspace config, applications, and file uploads
MetadataApiClient
Workspace config, applications, and file uploads
MetadataApiClient ships pre-built with the SDK (no generation required). It queries the /metadata endpoint for workspace configuration, applications, and file uploads.Uploading files
MetadataApiClient includes an uploadFile method for attaching files to file-type fields:| Parameter | Type | Description |
|---|---|---|
fileBuffer | Buffer | The raw file contents |
filename | string | The name of the file (used for storage and display) |
contentType | string | MIME type (defaults to application/octet-stream if omitted) |
fieldMetadataUniversalIdentifier | string | The universalIdentifier of the file-type field on your object |
- Uses the field’s
universalIdentifier(not its workspace-specific ID), so your upload code works across any workspace where your app is installed. - The returned
urlis a signed URL you can use to access the uploaded file.
When your code runs on Twenty (logic functions or front components), the platform injects credentials as environment variables:
TWENTY_API_URL— Base URL of the Twenty APITWENTY_APP_ACCESS_TOKEN— Short-lived key scoped to your application’s default function role
process.env automatically. The API key’s permissions are determined by the role referenced in defaultRoleUniversalIdentifier in your application-config.ts.