add_a_contact_group_to_a_campaign
ChatGPTAdd a contact group to a campaign Creates new conversations by adding every contact in a contact group to a campaign. Responses include direct Enginy app URLs when available. Responses include a campaignAppUrl that opens the campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: Campaign or contact group not found
add_a_contact_to_a_campaign
ChatGPTAdd a contact to a campaign Creates a new conversation by adding a contact to a campaign. Responses include direct Enginy app URLs when available. Responses include a campaignAppUrl that opens the campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: Campaign not found
add_blocklist_entries_by_value
ChatGPTAdd blocklist entries by value Add raw blocklist entries by (type, value). LinkedIn URL values are normalized; entries that cannot be normalized are skipped and reported in the response. DOMAIN values that are shared link-shortener hosts (e.g. linktr.ee, bit.ly) are also skipped, because blocking them would block every company that uses the same shortener — block such companies by their LinkedIn URL instead. > Required scope: BLOCKLIST_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: BLOCKLIST_WRITE. Known failure modes: - 400: Bad request - no valid items after normalization
add_companies_to_a_list
ChatGPTAdd companies to a list Add companies to a list. Responses include direct Enginy app URLs when available. The response includes listAppUrl for the target list. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error or companies not found - 404: List not found
add_contacts_to_a_list
ChatGPTAdd contacts to a list Add contacts to a list. Responses include direct Enginy app URLs when available. The response includes listAppUrl for the target list. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error or contacts not found - 404: List not found
archive_inbox_contact_thread
ChatGPTArchive inbox contact thread Archive one inbox contact thread. Required parameters: - contactId: contact ID path parameter. Notes: - Archiving is lead-level, so all visible threads for that contact move into the archived inbox. - The endpoint is idempotent. If the contact is already archived it still returns success. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid contact ID - 404: Contact or inbox thread not found
attach_inbox_tags_to_a_contact_thread
ChatGPTAttach inbox tags to a contact thread Attach one or more tags to a contact thread. Required parameters: - contactId: contact ID path parameter. - tagIds: array of tag IDs in the request body. Optional body fields: - senderIdentityId: target one sender-specific thread when the same contact appears under multiple sender identities. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool requires a body payload matching the input schema. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid contact ID - 404: Contact, thread, sender identity, or tags not found
block_contacts_or_companies_by_id
ChatGPTBlock contacts or companies by ID Block contacts (LEAD) or companies (COMPANY) by their Enginy IDs. The server resolves each entity to its emails, LinkedIn URLs, and domains and creates blocklist entries for each. Use blockTypes to restrict which value kinds are extracted. Entries are permanent unless periodDays is provided. Values already covered by an existing blocklist entry are skipped and reported in alreadyBlocked, so repeating the call is safe and creates no duplicates. > Required scope: BLOCKLIST_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: BLOCKLIST_WRITE. Known failure modes: - 400: Bad request - invalid blockTypes for entityType
build_inbox_link
ChatGPTBuild inbox link Build a deep-link URL into the user's /inbox view with the given filters applied. Use when the user asks to be sent to / shown / opened an inbox view, or when a reply benefits from a clickable link to actionable inbox state ("here are the 3 unread WhatsApp threads — open them: <link>"). Do NOT call this to FETCH messages — use list_inbox_threads or get_inbox_contact_messages for data. Notes: - All fields are optional; omitting filters returns the default inbox URL. - folder defaults to 'received'. Common alternatives: 'unread', 'ai_draft', 'tags'. - leadId opens a SINGLE contact thread; leadIds filters the LIST view to those contacts. Almost always prefer leadIds. - Resolve names to numeric IDs first via get_identities / get_campaigns / get_companies / list_inbox_tags when the user gives names. - Pure URL construction — no DB read, no side effects. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: MESSAGING_READ.
bulk_create_companies
ChatGPTBulk create companies Create up to 100 companies in a single request. Each item behaves exactly like POST /v1/company (including per-item mergeWithExisting, listId, and custom/AI fields). Items are processed independently: the request succeeds with a per-item results array and a summary, so one invalid company does not roll back the rest. Responses include direct Enginy app URLs when available. Each successful result includes an appUrl field for the company. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: COMPANIES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: COMPANIES_WRITE. Known failure modes: - 400: Bad request - the batch envelope failed validation (e.g. empty or too large)
bulk_create_contacts
ChatGPTBulk create contacts Create up to 100 contacts in a single request. Each item behaves exactly like POST /v1/contact (including nested/aliased company data, per-item mergeWithExisting, listId, and custom/AI fields). Items are processed independently: the request succeeds with a per-item results array and a summary, so one invalid contact does not roll back the rest. Responses include direct Enginy app URLs when available. Each successful result includes appUrl for the contact and companyAppUrl when a company is associated. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CONTACTS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CONTACTS_WRITE. Known failure modes: - 400: Bad request - the batch envelope failed validation (e.g. empty or too large)
cancel_workflow_run
ChatGPTCancel workflow run Cancels a RUNNING workflow run. Returns 409 if the run already finished or is otherwise not cancellable. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 404: Run not found or not accessible. - 409: The run is not RUNNING and cannot be cancelled.
clone_a_campaign
ChatGPTClone a campaign Clone a campaign with a new identity, preserving workflow, messages, tasks, tags, and folder. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the cloned campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: Campaign or identity not found
complete_task
ChatGPTComplete task Mark a task as completed. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
complete_tasks_batch
ChatGPTComplete tasks batch Mark multiple tasks as completed. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
create_a_contact_custom_field
ChatGPTCreate a contact custom field Create a workspace-scoped text custom field for contacts. Use the returned field name in contact create/update payloads and outreach templates. This stores literal text supplied by users or integrations; it does not create or run an AI variable. > Required scope: CONTACTS_WRITE > > Rate limit: 30 requests per minute This tool requires a body payload matching the input schema. Required scopes: CONTACTS_WRITE. Known failure modes: - 400: Bad request - name is missing, empty, or the body contains unsupported fields - 409: Conflict - the field name is already in use in this workspace
create_a_list
ChatGPTCreate a list Create a new empty destination list for contacts or companies. For a user request like "build/find me a new list of prospects", create the destination list, then use AI Finder preview and import tools to populate it instead of returning existing CRM contacts. Responses include direct Enginy app URLs when available. The created list response includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error or folder not found
create_a_message_template
ChatGPTCreate a message template Creates a non-prompt-library (workspace-owned) entry. Requires the AI variable split to be enabled for the workspace; otherwise returns 403 and the legacy POST /v1/ai-variables (aiField) endpoint must be used instead. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 409: Conflict - an entity with this name already exists
create_a_new_company
ChatGPTCreate a new company Create a new company. If mergeWithExisting is true (default), the company will merge into an existing record matched by normalized LinkedIn URL, domain, website, or exact name. Set mergeWithExisting to false to always create a new company. Responses include direct Enginy app URLs when available. The response includes an appUrl field for the company. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: COMPANIES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: COMPANIES_WRITE. Known failure modes: - 400: Bad request - validation error or list not found
create_a_new_contact
ChatGPTCreate a new contact Create a new contact. If mergeWithExisting is true (default), the contact will merge into an existing record matched by normalized LinkedIn profile URL, or by exact first name + last name + company name. If the provided company already exists, the contact will also be associated with a company matched by normalized LinkedIn URL, domain, website, or exact name, and that company will be updated with the provided data. Set mergeWithExisting to false to always create a new contact and company. Responses include direct Enginy app URLs when available. The response includes appUrl for the contact and companyAppUrl when a company is associated. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CONTACTS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CONTACTS_WRITE. Known failure modes: - 400: Bad request - validation error or list not found
create_a_promptlibrary_ai_message_superadmin_only
ChatGPTCreate a prompt-library AI message (superadmin only) Create a prompt-library AI message draft. Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 409: Conflict - name already exists
create_a_promptlibrary_ai_research_superadmin_only
ChatGPTCreate a prompt-library AI research (superadmin only) Create a prompt-library AI research draft (an aiField row used as a predefined research template). Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 409: Conflict - name already exists
create_a_promptlibrary_ai_snippet_superadmin_only
ChatGPTCreate a prompt-library AI snippet (superadmin only) Create a prompt-library AI snippet draft. Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 409: Conflict - name already exists
create_a_saved_filter
ChatGPTCreate a saved filter Create a saved AI Finder filter for later reuse. Filters are provider-aware and can be loaded directly into preview creation via savedFilterId. > Required scope: ACTIONS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Bad request - validation error
create_ai_message_folder
ChatGPTCreate AI message folder Create a AI message folder. Folder names must be unique per entity. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
create_ai_snippet_folder
ChatGPTCreate AI snippet folder Create a AI snippet folder. Folder names must be unique per entity. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
create_an_ai_message
ChatGPTCreate an ai message Creates a non-prompt-library (workspace-owned) entry. Requires the AI variable split to be enabled for the workspace; otherwise returns 403 and the legacy POST /v1/ai-variables (aiField) endpoint must be used instead. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 409: Conflict - an entity with this name already exists
create_an_ai_snippet
ChatGPTCreate an ai snippet Creates a non-prompt-library (workspace-owned) entry. Requires the AI variable split to be enabled for the workspace; otherwise returns 403 and the legacy POST /v1/ai-variables (aiField) endpoint must be used instead. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 409: Conflict - an entity with this name already exists
create_an_ai_variable
ChatGPTCreate an AI variable Create a new AI variable (AI research): a research/enrichment value computed per contact or company, e.g. classifications, extracted facts, findings. Do NOT use this for outreach content — personalized outbound messages belong in POST /v1/ai-variables/ai-messages, reusable phrase fragments in POST /v1/ai-variables/ai-snippets, and literal (non-AI-generated) sequences in POST /v1/ai-variables/message-templates. Prompt placeholders must come from the relevant fields endpoint output for this workspace; generic conversation placeholders such as previousMessage are not supported here. Enginy automatically converts prompt into the internal editor format used by the platform. Use the contact/company fields endpoints as the source of truth for prompt placeholders. Do not assume campaign-only aliases like previousMessage are valid in manual/public AI-variable creation. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input, folder/entity mismatch, or unsupported placeholders such as previousMessage - 409: Conflict - AI variable name already exists for this entity
create_campaign
ChatGPTCreate campaign Create a draft campaign from the public simplified sequence model. Best for new campaigns or rewrites that fit the supported public step types; this endpoint does not preserve arbitrary internal editor-only graph wiring from an existing campaign. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the created campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. Create a draft campaign from the public steps format. How to structure the request: - Start steps with the first action that should happen. - Keep adding the next action in the order it should run. - Use condition when you want to branch on lead data. - Use linkedin_connection with waitForAcceptance when you want to branch on connection acceptance after sending a connection request. Omit waitForAcceptance for a fire-and-forget connection request. - Use linkedin_message with content, attachment, or both. Attachment-only messages are valid. - Use whatsapp_message only when the workspace and sending identity are configured for WhatsApp. - Put shared follow-up work after the branching step instead of duplicating the same steps inside both branches. AI-generated messages (message library): - email, linkedin_message, linkedin_inmail, and linkedin_connection steps accept aiMessageId instead of manual content — the linked AI message writes a personalized message per contact at send time. - To reuse a prompt-library ("message library") prompt, list entries with GET /v1/prompt-library/ai-messages and pass the entry id as the step aiMessageId. The step gets its own copy automatically. - To reuse or create a workspace AI message, use GET /v1/ai-variables/ai-messages or POST /v1/ai-variables/ai-messages (full control over prompt, toneId, model, outputLength, and splitMessages), then pass its id as aiMessageId. - The AI message channel must match the step type (EMAIL, LINKEDIN, LINKEDIN_INMAIL, or LINKEDIN_CONNECTION). - Never combine aiMessageId with manual content or subject on the same step — for email and linkedin_inmail the AI message generates the subject too. Before you send a request: - Send an ordered steps array that describes the campaign flow from first action to last action. - Use branch arrays on condition and linkedin_connection steps to describe branch-specific work. - Place shared follow-up steps after a branching step when both live branches should continue together. - waitForAcceptance.unit must be days and waitForAcceptance.value must be an integer greater than or equal to 1. - Use GET /v1/tasks/owners first when your campaign includes task steps. If owners are returned, every task step must include ownerId. - Validation errors use full paths like steps[0].onTrue[1].subject so nested input issues are easy to fix. - Personalization placeholders use Enginy single-brace syntax such as {firstName}, {companyName}, and {identity.name}. Do not send Handlebars-style placeholders like {{firstName}}. - Placeholders must reference real fields — discover them with GET /v1/contacts/fields. Unknown placeholders are rejected with a 422. The company aliases {company}, {companyName}, and {companyDomain} are accepted and stored as the canonical company columns. - To modify an existing DRAFT campaign in place, prefer PATCH /v1/campaign/{campaignId} over creating a new one. To rewrite into a new campaign, start from the steps returned by GET /v1/campaign/{campaignId}. Either way the read-only stepId, connectionId, nextConnectionId, and advanced fields are accepted and ignored, but fill in messages that come back empty (their content is AI-generated per contact — recreate them with aiMessageId where the step type supports it, or provide manual content). Supported condition.type values: - has_linkedin_profile: onTrue runs when the lead has a LinkedIn profile. - has_professional_email: onTrue runs when the lead has a profess…
create_campaign_folder
ChatGPTCreate campaign folder Create a campaign folder. Folder names must be unique within the same parent folder. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the folder in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE.
create_company_ai_variable_folder
ChatGPTCreate company AI variable folder Create a company AI variable folder. Folder names must be unique per entity. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
create_company_list_folder
ChatGPTCreate company list folder Create a company list folder. Folder names must be unique within the same parent folder. Responses include direct Enginy app URLs when available. The created folder response includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE.
create_contact_ai_variable_folder
ChatGPTCreate contact AI variable folder Create a contact AI variable folder. Folder names must be unique per entity. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
create_contact_list_folder
ChatGPTCreate contact list folder Create a contact list folder. Folder names must be unique within the same parent folder. Responses include direct Enginy app URLs when available. The created folder response includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE.
create_inbox_tag
ChatGPTCreate inbox tag Create a reusable inbox tag. Required body fields: - name: human-readable tag name. - color: color token or hex value stored with the tag. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute This tool requires a body payload matching the input schema. Required scopes: MESSAGING_WRITE.
create_message_template_folder
ChatGPTCreate message template folder Create a message template folder. Folder names must be unique per entity. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
create_or_update_an_identity_mailbox
ChatGPTCreate or update an identity mailbox Create or update an IMAP mailbox for a specific identity so mailbox setup can be automated over API. Programmatic setup currently supports IMAP credentials only. > Required scope: ALL > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: ALL. Known failure modes: - 404: Identity not found - 409: Mailbox already belongs to another active identity - 422: Mailbox credentials are invalid or the identity exceeded mailbox limits
create_task
ChatGPTCreate task Create a new task for a contact or company. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the created task in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
create_webhook_subscription
ChatGPTCreate webhook subscription Create a new webhook subscription. > Required scope: WEBHOOKS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: WEBHOOKS_WRITE. Known failure modes: - 400: Bad request - validation error
create_workflow
ChatGPTCreate workflow Creates a workflow from a plan (draft by default; publish:true to publish immediately). Call get_workflow_blocks + get_workflow_block_inputs first to discover valid blockIds/inputs. Workflows are a DAG in plan.nodes. Each node has an id and a next array of ids ("" = unwired). Node kinds: BLOCK (one step; blockId + inputs; one next slot, two for WAIT_FOR_APPROVAL), CONDITIONAL (conditions + next = one target per condition then the fallback last; a condition is { field, operator, value? } or a random A/B split { "type": "RANDOM_SPLIT", "percentage": 1-100 } with sibling percentages summing to ≤ 100), KING (groupBy/orderBy; next = [left, right]). Start with a selector/import block. Max 60 nodes, no cycles. Call get_workflow_blocks + get_workflow_block_inputs to discover valid blockIds/inputs and get_workflow_condition_fields for CONDITIONAL fields. Put configured values, never catalog metadata, in BLOCK inputs. Bind a declared non-entity WEBHOOK input as { "webhookInputKey": "<declared key>" } in the matching field; entity inputs use "__MANUAL_INPUT". This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: The plan is structurally invalid (malformed graph). The response lists the issues. - 422: The plan fails block/config validation (stricter when publish=true).
create_workflow_folder
ChatGPTCreate workflow folder Creates a workflow folder ({name, parentId?}). Names must be unique within the same parent. Assign a workflow to a folder with update_workflow_draft (folderId). This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: Invalid body or the parent folder does not exist. - 409: A folder with this name already exists at this level.
delete_a_blocklist_entry
ChatGPTDelete a blocklist entry Delete a single blocklist entry by ID. > Required scope: BLOCKLIST_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: BLOCKLIST_WRITE. Known failure modes: - 400: Bad request - invalid item ID - 404: Blocklist item not found
delete_a_company
ChatGPTDelete a company Soft delete a company by ID, remove it from company lists, and unassign its active contacts. > Required scope: COMPANIES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: COMPANIES_WRITE. Known failure modes: - 400: Bad request - invalid company ID - 404: Company not found
delete_a_contact
ChatGPTDelete a contact Soft delete a contact by ID and remove it from contact lists. > Required scope: CONTACTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: CONTACTS_WRITE. Known failure modes: - 400: Bad request - invalid contact ID - 404: Contact not found
delete_a_list
ChatGPTDelete a list Soft-delete a contact or company list. This is the cleanup counterpart of create_a_list: use it to remove destination lists once they are no longer needed (e.g. test or temporary prospecting lists). Requires the type query param (CONTACTS or COMPANIES) to disambiguate contact list IDs from company list IDs, which are independent sequences and can collide numerically. Only removes the list itself; contacts/companies that were members of the list are not deleted. If a contact list has an active recurring schedule, deletion stops that schedule first; if the schedule cannot be stopped, the delete is aborted (500) and the list is left intact rather than leaving a schedule running against a deleted list. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - invalid list ID, missing/invalid type, or list protected from deletion - 404: List not found
delete_a_message_template
ChatGPTDelete a message template Soft-deletes a workspace-owned message template. Fails with 409 when the entity is still referenced (active campaign steps, other AI entities embedding it). Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 404: Message template not found in this workspace - 409: Message template is in use and cannot be deleted
delete_a_saved_filter
ChatGPTDelete a saved filter Delete a saved AI Finder filter. This is the cleanup counterpart of create_a_saved_filter. provider is required — saved filter IDs are independent per-provider sequences and can collide numerically. Only the saved filter's creator can delete it: a filter shared with the team is still visible to teammates via get_saved_filters, but visibility does not grant delete access, so a saved filter that exists but was created by someone else returns 404 (same as a saved filter that does not exist). > Required scope: ACTIONS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Bad request - invalid saved filter ID or missing/invalid provider - 404: Saved filter not found, or found but not created by the caller
delete_ai_message_folder
ChatGPTDelete AI message folder Delete a AI message folder. Items inside are moved to the parent folder. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE.
delete_ai_snippet_folder
ChatGPTDelete AI snippet folder Delete a AI snippet folder. Items inside are moved to the parent folder. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE.
delete_an_ai_message
ChatGPTDelete an ai message Soft-deletes a workspace-owned ai message. Fails with 409 when the entity is still referenced (active campaign steps, other AI entities embedding it). Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 404: AI message not found in this workspace - 409: AI message is in use and cannot be deleted
delete_an_ai_snippet
ChatGPTDelete an ai snippet Soft-deletes a workspace-owned ai snippet. Fails with 409 when the entity is still referenced (active campaign steps, other AI entities embedding it). Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 404: AI snippet not found in this workspace - 409: AI snippet is in use and cannot be deleted
delete_an_ai_variable
ChatGPTDelete an AI variable Delete an AI variable (AI research) and its generated smart-field values. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid aiVariableId parameter - 404: AI variable not found
delete_blocklist_entries_in_bulk
ChatGPTDelete blocklist entries in bulk Delete multiple blocklist entries by ID in a single request. > Required scope: BLOCKLIST_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: BLOCKLIST_WRITE. Known failure modes: - 404: No matching blocklist items found
delete_campaign_folder
ChatGPTDelete campaign folder Delete a campaign folder. Descendant folders are deleted too. Campaigns inside the deleted folders are not deleted; they are unassigned from the folder hierarchy. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: CAMPAIGNS_WRITE.
delete_company_ai_variable_folder
ChatGPTDelete company AI variable folder Delete a company AI variable folder. Items inside are moved to the parent folder. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE.
delete_company_list_folder
ChatGPTDelete company list folder Delete a company list folder. Descendant folders are deleted too. Lists inside the deleted folders are not deleted; they are unassigned from the folder hierarchy. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: LISTS_WRITE.
delete_contact_ai_variable_folder
ChatGPTDelete contact AI variable folder Delete a contact AI variable folder. Items inside are moved to the parent folder. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE.
delete_contact_list_folder
ChatGPTDelete contact list folder Delete a contact list folder. Descendant folders are deleted too. Lists inside the deleted folders are not deleted; they are unassigned from the folder hierarchy. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: LISTS_WRITE.
delete_message_template_folder
ChatGPTDelete message template folder Delete a message template folder. Items inside are moved to the parent folder. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_WRITE.
delete_tasks
ChatGPTDelete tasks Delete tasks in bulk. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
delete_webhook_subscription
ChatGPTDelete webhook subscription Delete a webhook subscription. > Required scope: WEBHOOKS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: WEBHOOKS_WRITE. Known failure modes: - 404: Webhook not found
delete_workflow
ChatGPTDelete workflow Deletes a workflow and its run history. Returns 409 if other workflows route into it via Send-to-workflow steps or if it has running runs (cancel them first). Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: The workflow ID is not a positive integer. - 404: Workflow not found or not writable. - 409: The workflow is still referenced by another workflow, or has running runs — cancel them and retry once they reach a terminal status.
delete_workflow_folder
ChatGPTDelete workflow folder Deletes a workflow folder. Contained workflows and subfolders are reparented up one level (not deleted). Returns 409 when a subfolder name would collide at the target level. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: The folder ID is not a positive integer. - 404: Folder not found. - 409: A subfolder would collide with an existing folder name at the target level.
fetch_results_from_an_ai_finder_preview
ChatGPTFetch results from an AI Finder preview What it does. Returns a page of the actual matching records the provider search produced for a cached previewId — i.e. the contacts or companies the filters matched. This is what the web UI displays under the preview. No data is persisted; every call is a live provider API request. When to use. Call this after a preview has been created (or iterated) when you want to inspect the concrete records before committing to an import, or when you just need a quick lookup of a few results without the full import pipeline. Pagination. 1-indexed page (default 1, max 50) plus pageSize (default 10, max 25). Providers generally cap their per-request page size at 25, so pageSize is bounded accordingly. Where a provider only supports cursor-based pagination (Crunchbase), this endpoint walks forward from page 1 behind the scenes, so deep pages make several upstream calls — stay within the first 10 pages for Crunchbase or you will receive a 422. Provider support. - CRUNCHBASE_COMPANIES, CRUNCHBASE_CONTACTS, CRUNCHBASE_INVESTORS — paginated via Crunchbase after_id cursor walks. Capped at 10 pages. - STORELEADS — paginated via StoreLeads native page/page_size params. - LINKEDIN, CRM_CONTACTS, CRM_COMPANIES, GOOGLE_MAPS, THEIRSTACK_TECHNOLOGY, THEIRSTACK_JOBS — supported inline. Provider-specific page ceilings still apply, and some providers may omit totalCount when the upstream API does not expose it. What you get back. records is a normalized list with optional id, name, domain, linkedinUrl, title, location, and an extra bag of provider-specific fields. Which fields are populated depends on the provider (e.g. title is only set for contact/person providers). totalCount is populated when the provider exposes a total; otherwise rely on hasNextPage to know if another page is available. > Required scope: ACTIONS_WRITE > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Validation error (e.g. page out of range) - 404: Preview not found or expired - 422: Page is beyond the provider-supported range (e.g. Crunchbase caps inline pagination at 10 pages).
find_duplicate_companies
ChatGPTFind duplicate companies Find groups of duplicate companies: live companies of your workspace that share the same normalized value of ALL the fields you pick (1 to 5 of domain, companyLinkedInUrl, companyUrn, companyCRMId, name; AND: fields=name,domain groups only companies with the same name AND the same domain). A company with an empty value for any selected field never appears in a group. Returns { groups: [{ values, companyIds, size }], nextCursor } where values maps each field to the shared normalized value, companyIds lists at most the 100 oldest ids of the group and size is the full count (when a group is large, narrow it by adding more fields), 100 groups per page at most, ordered by the lowest company id of each group. Only ids are returned: read the companies with get_companies or get_a_single_company to decide which copy to keep. Pass listId to look only for groups that touch a list. Companies you cannot access, blocklisted, merge-locked or deleted companies never appear. A search that takes too long answers 408: the workspace is too large to scan right now, so retry later (listId only filters the groups, it does not make the scan cheaper). To remove duplicates, show the user which companies will go and get their confirmation first, then call delete_a_company once per company: deleting cannot be undone from the product. If two duplicates carry different CRM ids, the duplicate lives in the CRM itself: tell the user to merge the records there, or a later CRM import can recreate the company. > Required scope: COMPANIES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: COMPANIES_READ. Known failure modes: - 400: Bad request - no fields, an unknown or repeated field, more than 5 fields, or an invalid cursor or page size - 404: List not found
find_duplicate_contacts
ChatGPTFind duplicate contacts Find groups of duplicate contacts: live contacts of your workspace that share the same normalized value of ALL the fields you pick (1 to 7 of fullName, professionalEmail, linkedinUrl, linkedInProfileId, memberUrn, contactCRMId, leadCRMId; AND: fields=fullName,professionalEmail groups only contacts with the same full name AND the same email). A contact with an empty value for any selected field never appears in a group, and fullName needs both a first and a last name. fullName alone also groups different people who share a common name: pair it with another field or read the details before deciding. Returns { groups: [{ values, contactIds, size }], nextCursor } where values maps each field to the shared normalized value, contactIds lists at most the 100 oldest ids of the group and size is the full count (when a group is large, narrow it by adding more fields), 100 groups per page at most, ordered by the lowest contact id of each group. Only ids are returned: read the contacts with get_contacts or get_a_single_contact to decide which copy to keep. Pass listId to look only for groups that touch a contact list. Contacts you cannot access, merged, blocklisted, opted-out or deleted contacts never appear. Contacts that are in a campaign do appear. A search that takes too long answers 408: the workspace is too large to scan right now, so retry later (listId only filters the groups, it does not make the scan cheaper). To remove duplicates, show the user which contacts will go and get their confirmation first, then call delete_a_contact once per contact: deleting removes the contact from every contact list and from its campaigns (its conversations are marked deleted and its running workflows are cancelled), and it cannot be undone from the product. If two duplicates carry different CRM ids, the duplicate lives in the CRM itself: tell the user to merge the records there, or a later CRM import can recreate the contact. > Required scope: CONTACTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CONTACTS_READ. Known failure modes: - 400: Bad request - no fields, an unknown or repeated field, more than 7 fields, or an invalid cursor or page size - 404: List not found
get_a_message_template
ChatGPTGet a message template Returns a single workspace-owned message template by id. Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Message template not found in this workspace
get_a_promptlibrary_ai_message_entry_by_id_superadmin_only
ChatGPTGet a prompt-library AI message entry by id (superadmin only) Get a prompt-library AI message entry by id, including prompt content (prompt rich text, langfuse pointer, and custom prompt field values). Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Not found - prompt-library AI message does not exist
get_a_promptlibrary_ai_research_entry_by_id_superadmin_only
ChatGPTGet a prompt-library AI research entry by id (superadmin only) Get a prompt-library AI research entry by id, including prompt content (prompt text, TipTap doc, langfuse pointer, and custom prompt field values). Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Not found - prompt-library AI research does not exist
get_a_promptlibrary_ai_snippet_entry_by_id_superadmin_only
ChatGPTGet a prompt-library AI snippet entry by id (superadmin only) Get a prompt-library AI snippet entry by id, including prompt content (prompt rich text, langfuse pointer, and custom prompt field values). Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Not found - prompt-library AI snippet does not exist
get_a_single_campaign
ChatGPTGet a single campaign Retrieve a specific campaign as the public simplified sequence plus campaign settings. Use this when you need a readable campaign in the supported public step model, not the full internal editor graph. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the campaign overview in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: CAMPAIGNS_READ. Known failure modes: - 400: Bad request - invalid campaign ID - 404: Campaign not found - 422: Campaign sequence cannot be represented in the simplified format
get_a_single_company
ChatGPTGet a single company Retrieve a single company by ID. Responses include direct Enginy app URLs when available. The returned company includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: COMPANIES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: COMPANIES_READ. Known failure modes: - 400: Bad request - invalid company ID - 404: Company not found
get_a_single_contact
ChatGPTGet a single contact Retrieve a single contact by ID. Responses include direct Enginy app URLs when available. The returned contact includes an appUrl field, and the associated company includes appUrl when present. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CONTACTS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CONTACTS_READ. Known failure modes: - 400: Bad request - invalid contact ID - 404: Contact not found
get_a_single_workflow
ChatGPTGet a single workflow Gets a workflow with its draft plan, trigger, published version, runtimeInputContract, and a revision token. Read this before update_workflow_draft or publish_workflow to get the current revision. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_READ. Known failure modes: - 400: The workflow ID is not a positive integer. - 404: Workflow not found or not accessible.
get_a_social_selling_post
ChatGPTGet a Social Selling post Get one tracked Social Selling post with its latest metrics and engagement counters. > Required scope: SOCIAL_SELLING_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: SOCIAL_SELLING_READ. Known failure modes: - 404: Post not found in this workspace or outside the caller’s identity scope
get_actions_run_status
ChatGPTGet actions run status Check the status of an actions run. overallStatus collapses every underlying process into one of PENDING/PROCESSING/QUEUED (in progress), COMPLETED/FAILED/CANCELLED (uniformly terminal), or PARTIAL (mixed terminal outcomes). statusCounts breaks progress down per record (contacts or companies × actions): pending, processing, and queued are in-flight; completed, failed, and cancelled are terminal outcomes; alreadyUpToDate counts records the worker skipped because they were already current; blocklisted counts completed records whose target is on the workspace blocklist (already excluded from completed). Use lastUpdatedAt to detect staleness — a run stuck at PROCESSING/QUEUED with an old lastUpdatedAt may indicate a worker backlog rather than active progress. > Required scope: ACTIONS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: ACTIONS_READ. Known failure modes: - 400: Bad request - invalid actionsId parameter - 404: Actions group not found
get_ai_message_folder
ChatGPTGet AI message folder Get a AI message folder with its child folders, AI variables, and breadcrumb ancestors. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Folder not found
get_ai_playbook
ChatGPTGet AI playbook Retrieve the company AI playbook for the workspace, including company context, products, ICPs, competitors, testimonials, FAQs, and ideal companies. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Required scopes: WORKSPACE_READ. Known failure modes: - 404: Workspace not found
get_ai_snippet_folder
ChatGPTGet AI snippet folder Get a AI snippet folder with its child folders, AI variables, and breadcrumb ancestors. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Folder not found
get_an_ai_message
ChatGPTGet an ai message Returns a single workspace-owned ai message by id. Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: AI message not found in this workspace
get_an_ai_snippet
ChatGPTGet an ai snippet Returns a single workspace-owned ai snippet by id. Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: AI snippet not found in this workspace
get_an_ai_variable
ChatGPTGet an AI variable Retrieve a single AI variable (AI research) by ID. AI messages, AI snippets, and message templates are separate entities with their own endpoints. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 400: Bad request - invalid aiVariableId parameter - 404: AI variable not found
get_campaign_analytics
ChatGPTGet campaign analytics Retrieve overall and daily analytics for a specific campaign. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the campaign overview in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: ANALYTICS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: ANALYTICS_READ. Known failure modes: - 400: Bad request - invalid campaign ID or date range - 404: Campaign not found
get_campaign_folder
ChatGPTGet campaign folder Get a campaign folder with its child folders, campaigns, and breadcrumb ancestors. Responses include direct Enginy app URLs when available. Responses include appUrl values for the folder and nested campaigns or related folders when available. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: CAMPAIGNS_READ. Known failure modes: - 404: Folder not found
get_campaigns
ChatGPTGet campaigns Retrieve a paginated list of campaigns. Responses include direct Enginy app URLs when available. Each campaign response includes an appUrl that opens the campaign overview in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CAMPAIGNS_READ.
get_companies
ChatGPTGet companies Retrieve a paginated list of companies. Responses include direct Enginy app URLs when available. Each returned company includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: COMPANIES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: COMPANIES_READ.
get_company_ai_variable_folder
ChatGPTGet company AI variable folder Get a company AI variable folder with its child folders, AI variables, and breadcrumb ancestors. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Folder not found
get_company_field_metadata
ChatGPTGet company field metadata Retrieve the source-of-truth subset of company fields that can be referenced in AI-variable prompts and requested through the companies endpoints. This is not the full company field catalog; it only includes AI-variable-compatible fields for this workspace. Without query parameters this returns the full AI-variable-compatible company prompt-field catalog. For targeted lookups, pass search plus optional filters such as fieldType, matchMode, and limit to narrow the response and avoid oversized payloads; the older query parameter remains supported as an alias. Use this before manual or public AI-variable create/update calls instead of guessing placeholders; unsupported generic placeholders such as previousMessage are not valid here. This is narrower than the full editable/filterable company field catalog: search_companies_with_advanced_filters (include/exclude) and update_company_fields also accept relationship-style filters such as companyGroup and campaigns that never appear here because they cannot be used inside an AI-variable prompt. > Required scope: COMPANIES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: COMPANIES_READ.
get_company_list_folder
ChatGPTGet company list folder Get a company list folder with its child folders, lists, and breadcrumb ancestors. Responses include direct Enginy app URLs when available. The folder and embedded lists include direct Enginy app URLs. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: LISTS_READ. Known failure modes: - 404: Folder not found
get_contact_ai_variable_folder
ChatGPTGet contact AI variable folder Get a contact AI variable folder with its child folders, AI variables, and breadcrumb ancestors. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Folder not found
get_contact_field_metadata
ChatGPTGet contact field metadata Retrieve the source-of-truth subset of contact fields that can be referenced in AI-variable prompts and requested through the contacts endpoints. Create a literal text custom field with POST /v1/contacts/fields. This is not the full contact field catalog; it only includes AI-variable-compatible fields for this workspace. Without query parameters this returns the full AI-variable-compatible contact prompt-field catalog. For targeted lookups, pass search plus optional filters such as fieldType, matchMode, and limit to narrow the response and avoid oversized payloads; the older query parameter remains supported as an alias. Use this before manual or public AI-variable create/update calls instead of guessing placeholders; unsupported generic placeholders such as previousMessage are not valid here. This is narrower than the full editable/filterable contact field catalog: search_contacts_with_advanced_filters (include/exclude) and update_contact_fields also accept relationship-style filters such as leadsGroup, campaigns, companyGroup, and the campaign-scoped campaignLeadStatus (per-contact campaign engagement, e.g. linkedinConnectionRequestAccepted for contacts who accepted a LinkedIn connection request) that never appear here because they cannot be used inside an AI-variable prompt. > Required scope: CONTACTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CONTACTS_READ.
get_contact_list_folder
ChatGPTGet contact list folder Get a contact list folder with its child folders, lists, and breadcrumb ancestors. Responses include direct Enginy app URLs when available. The folder and embedded lists include direct Enginy app URLs. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: LISTS_READ. Known failure modes: - 404: Folder not found
get_contacts
ChatGPTGet contacts Retrieve a paginated list of contacts. Responses include direct Enginy app URLs when available. Each returned contact includes an appUrl field, and associated companies include appUrl when present. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CONTACTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CONTACTS_READ. Known failure modes: - 404: Actions run not found (when filtering by actionsId)
get_conversation_messages
ChatGPTGet conversation messages Retrieve all messages for a specific conversation. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: MESSAGING_READ. Known failure modes: - 400: Invalid conversation ID - 404: Conversation not found
get_conversations_analytics
ChatGPTGet conversations analytics Retrieve row conversation analytics data with contact and campaign information. > Required scope: ANALYTICS_READ > > Rate limit: 10 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: ANALYTICS_READ.
get_credit_balance
ChatGPTGet credit balance Retrieve current credit balance and plan information. balance is the balance spend checks compare against; spendableCredits additionally subtracts credits already reserved by in-flight workflows and is the number to check before starting new, billable work — spending requires spendableCredits >= cost (an exact match is sufficient). monthlyPlanCredits / monthlyAddonCredits are plan allowances that refill on renewal, not a measure of what is currently available to spend. When the requesting user has a personal monthly credit limit, all figures are THEIR personal allowance (remaining personal credits, personal cap) rather than the workspace totals — the same numbers the Enginy app shows them. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Required scopes: WORKSPACE_READ. Known failure modes: - 404: Client not found
get_credit_pricing
ChatGPTGet credit pricing Retrieve credit costs for all available actions. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Required scopes: WORKSPACE_READ.
get_identities
ChatGPTGet identities Retrieve a paginated list of identities. Each identity exposes linkedinAccess (LinkedIn capabilities such as salesNav) and linkedinSearchEnabled (whether it can run AI Finder LinkedIn searches). Use linkedinSearchEnabled=true to list the identities you can pass as identityId to POST /v1/ai-finder/previews to run an identity-scoped LinkedIn list. Responses include direct Enginy app URLs when available. Each identity response includes an appUrl that opens the identity in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: IDENTITIES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: IDENTITIES_READ.
get_identity_mailboxes
ChatGPTGet identity mailboxes Retrieve all configured mailboxes for a specific identity. > Required scope: IDENTITIES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: IDENTITIES_READ. Known failure modes: - 404: Identity not found
get_identity_performance_metrics
ChatGPTGet identity performance metrics Retrieve identity performance metrics for a date range. > Required scope: IDENTITIES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: IDENTITIES_READ. Known failure modes: - 400: Bad request - invalid query parameters
get_inbox_contact_messages
ChatGPTGet inbox contact messages Return the flattened inbox message history for a contact. Required parameters: - contactId: contact ID path parameter for the thread you want to inspect. Optional query parameters: - senderIdentityId: limit the returned history to conversations owned by one sender identity - archived: set to true to read an archived thread instead of an active one. Defaults to false. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: MESSAGING_READ. Known failure modes: - 400: Invalid contact ID - 404: Contact or sender identity not found
get_inbox_tag
ChatGPTGet inbox tag Retrieve one inbox tag by ID. Required parameters: - tagId: tag ID path parameter. Optional query parameters: - senderIdentityId: scope the returned count to one sender identity - archived: set to true to count archived threads instead of active ones. Defaults to false. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: MESSAGING_READ. Known failure modes: - 400: Invalid tag ID - 404: Inbox tag or sender identity not found
get_lists
ChatGPTGet lists Retrieve a paginated list of existing contact or company lists. Use this to find an existing list or destination list ID; do not use it as the answer when the user asks you to build a new prospecting list. Responses include direct Enginy app URLs when available. Each returned list includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: LISTS_READ.
get_message_template_folder
ChatGPTGet message template folder Get a message template folder with its child folders, AI variables, and breadcrumb ancestors. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: AI_VARIABLES_READ. Known failure modes: - 404: Folder not found
get_saved_filters
ChatGPTGet saved filters Retrieve a list of saved AI Finder filters. provider defaults to LINKEDIN for backward compatibility, but callers can opt into other providers as they gain saved-filter support. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKSPACE_READ.
get_saved_view
ChatGPTGet saved view Retrieve a single saved view by ID. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: WORKSPACE_READ. Known failure modes: - 404: Saved view not found
get_saved_views
ChatGPTGet saved views Retrieve a paginated list of saved table views (contacts and companies). > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKSPACE_READ.
get_task_ids
ChatGPTGet task IDs Retrieve task IDs that match the provided filters. > Required scope: TASKS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: TASKS_READ.
get_task_owners
ChatGPTGet task owners Retrieve CRM owners for task assignment in campaign task steps. Use this before creating task steps. If this endpoint returns one or more owners, ownerId becomes required on every task step in POST /v1/campaigns. > Required scope: OWNERS_READ > > Rate limit: 100 requests per minute Required scopes: OWNERS_READ. Known failure modes: - 400: CRM authentication expired or CRM owners could not be fetched
get_task_pending_count
ChatGPTGet task pending count Retrieve the current pending task count. > Required scope: TASKS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: TASKS_READ.
get_task_status_counts
ChatGPTGet task status counts Retrieve counts for key task status buckets. Returns counts for the due, skipped, and upcoming buckets. > Required scope: TASKS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: TASKS_READ.
get_tasks
ChatGPTGet tasks Retrieve a paginated list of tasks. Responses include direct Enginy app URLs when available. Task responses include an appUrl, and nested contact, company, and campaign objects include direct Enginy app URLs when available. MCP agents should return those URLs to users whenever they are present in the response. Use comma-separated values for taskIds, campaignIds, and companyIds when passing multiple IDs. > Required scope: TASKS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: TASKS_READ.
get_voices
ChatGPTGet voices Retrieve available voices for linkedin_voice_message campaign steps. Use this before creating linkedin_voice_message steps to discover valid voiceId values. Returns the built-in system voices plus any voices cloned from this client's identities. > Required scope: IDENTITIES_READ > > Rate limit: 100 requests per minute Required scopes: IDENTITIES_READ.
get_webhook_delivery_logs
ChatGPTGet webhook delivery logs Retrieve delivery logs for a webhook. > Required scope: WEBHOOKS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WEBHOOKS_READ. Known failure modes: - 404: Webhook not found
get_webhook_subscription
ChatGPTGet webhook subscription Retrieve a single webhook by ID. > Required scope: WEBHOOKS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: WEBHOOKS_READ. Known failure modes: - 404: Webhook not found
get_workflow_block_inputs
ChatGPTGet workflow block inputs Describes a block's inputs (key, required, default, value shape, and how to resolve each value). Call after get_workflow_blocks and before create/update. Put resolved values, never returned catalog metadata, in node inputs. Bind a declared non-entity WEBHOOK input as { "webhookInputKey": "<declared key>" } in the matching field. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_READ. Known failure modes: - 404: Unknown blockId. The response lists the valid block ids.
get_workflow_blocks
ChatGPTGet workflow blocks Lists the workflow block catalog (step types). Call this first when building or editing a workflow. Workflows are a DAG in plan.nodes. Each node has an id and a next array of ids ("" = unwired). Node kinds: BLOCK (one step; blockId + inputs; one next slot, two for WAIT_FOR_APPROVAL), CONDITIONAL (conditions + next = one target per condition then the fallback last; a condition is { field, operator, value? } or a random A/B split { "type": "RANDOM_SPLIT", "percentage": 1-100 } with sibling percentages summing to ≤ 100), KING (groupBy/orderBy; next = [left, right]). Start with a selector/import block. Max 60 nodes, no cycles. Call get_workflow_blocks + get_workflow_block_inputs to discover valid blockIds/inputs and get_workflow_condition_fields for CONDITIONAL fields. Put configured values, never catalog metadata, in BLOCK inputs. Bind a declared non-entity WEBHOOK input as { "webhookInputKey": "<declared key>" } in the matching field; entity inputs use "__MANUAL_INPUT". Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKFLOWS_READ.
get_workflow_condition_fields
ChatGPTGet workflow condition fields Lists condition operators and all built-in fields for CONDITIONAL nodes, including engagement, LinkedIn, CRM, platform, activity, and run-context fields. Each field reports compatible operator ids and fixed value options when applicable. Call before authoring a CONDITIONAL node. Fields can also be AI-variable/custom names; prefixes company./anyLead./webhookInput. reference related entities. For a random A/B split branch use { "type": "RANDOM_SPLIT", "percentage": 1-100 } as the condition instead of a field predicate (sibling percentages sum to ≤ 100; remainder goes to the fallback). Required scopes: WORKFLOWS_READ.
get_workflow_run_status
ChatGPTGet workflow run status Gets a single run's status, per-step status counts, and enrolled entity count. Use the runId returned by run_workflow or get_workflow_runs. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_READ. Known failure modes: - 404: Run not found or not accessible.
get_workflow_runs
ChatGPTGet workflow runs Lists a workflow's runs (most recent first, paginated) with runId, status, and version. Poll get_workflow_run_status with a runId for step-level detail. Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKFLOWS_READ. Known failure modes: - 400: The workflow ID is not a positive integer. - 404: Workflow not found or not accessible.
get_workflows
ChatGPTGet workflows Lists advanced (graph) workflows in the workspace, paginated. Filter by search, triggerType, or isPublished. Returns id, name, appUrl, and publish state for each. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKFLOWS_READ. Known failure modes: - 400: Invalid workflow list filter.
import_a_list_from_ai_finder
ChatGPTImport a list from AI Finder Use AI Finder to generate a new contact or company search, then import the results into a destination list. This is the right workflow when the user asks for a new prospecting list rather than existing records already stored in Enginy. Returns an actions ID that can be monitored via GET /v1/actions/{actionsId}/status and queried via the existing contacts/companies endpoints using the actionsId filter. This endpoint always runs a brand-new search from text and does not accept a previewId — if you already have one from POST /v1/ai-finder/previews (or its iterate endpoint), use POST /v1/ai-finder/previews/{previewId}/import instead so your refinements are preserved. > Required scope: ACTIONS_WRITE > > Rate limit: 10 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: Destination list not found - 422: AI Finder could not build a valid search or returned a different entity type
import_an_ai_finder_preview
ChatGPTImport an AI Finder preview What it does. Takes a cached previewId and starts the provider-specific import workflow into a destination list. This is the final step for new-list building after you create or identify the destination list. Returns an actionsId you can use to monitor progress. When to use. Call this as the final step of the preview → iterate → import flow, once you're happy with the filters. The preview must still be valid (24h TTL). Preconditions. - listId must be a list owned by this client. - The list type must match the preview's entity: pass a contact list for CONTACT-typed previews (LINKEDIN contacts, CRM_CONTACTS, CRUNCHBASE_CONTACTS, CRUNCHBASE_INVESTORS), and a company list for COMPANY-typed previews (LINKEDIN companies, CRM_COMPANIES, CRUNCHBASE_COMPANIES, STORELEADS, THEIRSTACK_TECHNOLOGY, THEIRSTACK_JOBS, GOOGLE_MAPS). Mismatch returns 422. - maxCount is an integer between 100 and 2500 in increments of 100. What you get back. An actionsId — use it with: - GET /v1/actions/{actionsId}/status to poll progress. - The actionsId filter on /v1/contacts and /v1/companies to fetch the imported records once they land. The preview is NOT evicted after import — you can re-import the same preview into a different list until its 24h TTL expires. Related tool. If you don't have a previewId yet (you haven't called the preview or iterate endpoints), use POST /v1/ai-finder/import instead — it runs a brand-new search and import in one step, but any refinements you'd otherwise apply via iterate are not available since there's no preview to refine. > Required scope: ACTIONS_WRITE > > Rate limit: 10 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Validation error - 404: Preview or destination list not found - 422: Preview cannot be imported (entity mismatch, unsupported provider, insufficient credits, etc.). When the cause is insufficient credits, details.code is INSUFFICIENT_CREDITS and details.upsellUrl links to the billing page.
list_ai_message_folders
ChatGPTList AI message folders List AI message folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_ai_message_tones
ChatGPTList AI message tones Lists the tones available to this workspace (workspace-owned plus Enginy defaults). Use a returned id as the required toneId when creating or updating AI messages and AI snippets. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Required scopes: AI_VARIABLES_READ.
list_ai_messages
ChatGPTList AI messages Lists the workspace-owned AI messages (paginated). Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_ai_snippet_folders
ChatGPTList AI snippet folders List AI snippet folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_ai_snippets
ChatGPTList AI snippets Lists the workspace-owned AI snippets (paginated). Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_ai_variables
ChatGPTList AI variables Retrieve a paginated list of AI variables (AI research). This covers AI research entities only — workspace AI messages, AI snippets, and message templates have their own list/get endpoints under /v1/ai-variables/ai-messages, /v1/ai-variables/ai-snippets, and /v1/ai-variables/message-templates. Use this endpoint to browse the AI variables that appear in the platform AI Variables page. By default archived variables are excluded. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_blocklist_entries
ChatGPTList blocklist entries Retrieve a paginated list of blocklist entries (blocked emails, LinkedIn URLs, domains, and company LinkedIn URLs). > Required scope: BLOCKLIST_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: BLOCKLIST_READ.
list_campaign_folders
ChatGPTList campaign folders List campaign folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. Responses include direct Enginy app URLs when available. Each folder response includes an appUrl that opens the folder in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: CAMPAIGNS_READ.
list_company_ai_variable_folders
ChatGPTList company AI variable folders List company AI variable folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_company_list_folders
ChatGPTList company list folders List company list folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. Responses include direct Enginy app URLs when available. Each returned folder includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: LISTS_READ.
list_contact_ai_variable_folders
ChatGPTList contact AI variable folders List contact AI variable folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_contact_list_folders
ChatGPTList contact list folders List contact list folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. Responses include direct Enginy app URLs when available. Each returned folder includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: LISTS_READ.
list_folders
ChatGPTList folders Retrieve a paginated list of list folders across both contacts and companies. This preserves the legacy contract and adds campaign-specific folder endpoints separately. Responses include direct Enginy app URLs when available. Each returned folder includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: LISTS_READ.
list_inbox_tags
ChatGPTList inbox tags List the tags that can be applied to inbox threads. Required parameters: - None Optional query parameters: - senderIdentityId: scope tag counts to the threads visible for one sender identity - archived: set to true to count archived threads instead of active ones. Defaults to false. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: MESSAGING_READ. Known failure modes: - 404: Sender identity not found
list_inbox_threads
ChatGPTList inbox threads List inbox threads grouped by contact. Required parameters: - None Optional query parameters: - page: 1-based page number. Defaults to 1. - pageSize: number of threads per page. Defaults to 25. - search: free-text search across contact name, company name, email, and recent message content. - senderIdentityId: scope the inbox to a single sender identity when the same contact appears in multiple sender mailboxes - tagId: return only threads tagged with this inbox tag ID. Look up tag IDs via GET /v1/inbox/tags - archived: set to true to return archived threads instead of active ones. Defaults to false. > Required scope: MESSAGING_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: MESSAGING_READ. Known failure modes: - 404: Sender identity or inbox tag not found
list_message_template_folders
ChatGPTList message template folders List message template folders. By default this returns only root folders. Use includeChildren=true to return nested folders too. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_message_templates
ChatGPTList message templates Lists the workspace-owned message templates (paginated). Read responses include the prompt both as rich text and as round-trippable plain text using the {token} / {aiResearch:...} / {aiSnippet:...} / {aiMessage:...} syntax. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: AI_VARIABLES_READ.
list_public_promptlibrary_ai_message_entries
ChatGPTList public prompt-library AI message entries List all published prompt-library AI message entries. Returns metadata for published prompt-library entries (id, name, description, category, model, library metadata). Prompt content (prompt text, TipTap doc, langfuse pointer, custom prompt field values) is intentionally omitted. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Required scopes: AI_VARIABLES_READ.
list_public_promptlibrary_ai_research_entries
ChatGPTList public prompt-library AI research entries List all published prompt-library AI research entries. Returns metadata for published prompt-library entries (id, name, description, category, model, library metadata). Prompt content (prompt text, TipTap doc, langfuse pointer, custom prompt field values) is intentionally omitted. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Required scopes: AI_VARIABLES_READ.
list_public_promptlibrary_ai_snippet_entries
ChatGPTList public prompt-library AI snippet entries List all published prompt-library AI snippet entries. Returns metadata for published prompt-library entries (id, name, description, category, model, library metadata). Prompt content (prompt text, TipTap doc, langfuse pointer, custom prompt field values) is intentionally omitted. > Required scope: AI_VARIABLES_READ > > Rate limit: 100 requests per minute Required scopes: AI_VARIABLES_READ.
list_social_selling_posts
ChatGPTList Social Selling posts List the LinkedIn posts Social Selling tracks for your identities, newest first, with their latest LinkedIn metrics (impressions, reactions by type, comments, reposts) and Enginy engagement counters (engaged accounts, new engagers). Filter by identity and publish date. Reposts are hidden unless includeReposts=true. Responses include direct Enginy app URLs when available. Each post includes an appUrl that opens it in Enginy once it has a publishing post. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: SOCIAL_SELLING_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: SOCIAL_SELLING_READ.
list_webhook_subscriptions
ChatGPTList webhook subscriptions Retrieve a paginated list of webhook subscriptions. > Required scope: WEBHOOKS_READ > > Rate limit: 100 requests per minute Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WEBHOOKS_READ.
list_workflow_folders
ChatGPTList workflow folders Lists workflow folders used to organize advanced workflows. Root folders by default; includeChildren=true for nested folders, includeRecursiveCounts=true for cumulative totals. Each folder includes id, name, parentId, and workflow/subfolder counts. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: WORKFLOWS_READ.
mark_inbox_contact_thread_as_read
ChatGPTMark inbox contact thread as read Mark one inbox contact thread as read. Required parameters: - contactId: contact ID path parameter. Optional query parameters: - senderIdentityId: target one sender-specific thread when the same contact appears under multiple sender identities - archived: set to true to mark an archived thread as read instead of an active one. Defaults to false Notes: - The endpoint marks all visible conversations for that contact as read and clears unread message state. - The endpoint is idempotent. If the thread is already read it still returns success with zero updated counts. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Query parameters can be passed inside query or through the top-level aliases shown in the input schema. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid contact ID or query parameter - 404: Contact, sender identity, or inbox thread not found
mcp_get_profile
ChatGPTReturns the connected Enginy account (stable profile id, name, email, workspace) so clients like ChatGPT can tell multiple connected Enginy accounts apart. It does not reflect a multi-account switch: use mcp_whoami for the workspace that writes will affect.
mcp_get_readonly_impersonation_status
ChatGPTReturns the current MCP readonly impersonation state for this connection.
mcp_get_usage_guide
ChatGPTReturns Enginy MCP workflow guidance for common agent tasks, including new list building, campaign reads, AI variable edits, enrichment/verification actions runs, app URLs, and troubleshooting.
mcp_search_admin_users_and_clients
ChatGPTSearches Enginy platform users and clients for SUPER_ADMIN MCP callers. Use this to find targetUserId values before starting readonly impersonation. Supports free-text queries, exact userId/userEmail/clientId filters, and capped pagination.
mcp_start_readonly_impersonation
ChatGPTEnables readonly MCP impersonation for a target user. Only SUPER_ADMIN users can use this tool.
mcp_stop_readonly_impersonation
ChatGPTDisables readonly MCP impersonation for the current MCP connection.
mcp_whoami
ChatGPTReturns the caller identity and granted MCP scopes.
move_companies_between_lists
ChatGPTMove companies between lists Move companies between lists. Responses include direct Enginy app URLs when available. The response includes sourceListAppUrl and destinationListAppUrl. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error or companies not found - 404: List not found
move_contacts_between_lists
ChatGPTMove contacts between lists Move contacts between lists. Responses include direct Enginy app URLs when available. The response includes sourceListAppUrl and destinationListAppUrl. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error or contacts not found - 404: List not found
pause_a_contact_in_a_campaign
ChatGPTPause a contact in a campaign Pauses an active conversation in a campaign. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 404: Conversation not found
preview_an_ai_finder_search
ChatGPTPreview an AI Finder search What it does. Takes either a natural-language query (e.g. "VP of Finance at Series B SaaS companies in California") or a saved filter ID and returns a previewId. Text queries run through AI Finder to generate provider-specific filters; saved filters are loaded directly into the preview cache without regenerating them. Use this as the first step when a user asks you to build a new prospecting list, find new companies, or find new contacts; do not answer those requests by only browsing existing CRM contacts or existing lists. No data is imported yet. When to use. Call this first when you want to start an AI-driven list-building flow. After you see what the AI produced, you can: - Refine the filters by calling the iterate endpoint with more instructions. - Commit the preview to a list by calling the import endpoint. Provider selection. Omit provider (or pass AUTO) to let the system pick the best provider for the query. Pass an explicit value to force one. Valid providers: - LINKEDIN — LinkedIn Sales Nav. AI infers contacts-vs-companies from the query. - CRM_CONTACTS / CRM_COMPANIES — the client's configured CRM (HubSpot, Salesforce, Dynamics, Zoho, TribeCRM, or Attio). The specific CRM is auto-detected from the client's integrations. Returns 422 if no CRM is configured. - STORELEADS — StoreLeads (ecommerce / DTC / Shopify brands). - CRUNCHBASE_COMPANIES / CRUNCHBASE_CONTACTS — Crunchbase organizations or people. - CRUNCHBASE_INVESTORS — Crunchbase investor search (VCs, angels, funds). - THEIRSTACK_TECHNOLOGY — companies using a given tech stack. - THEIRSTACK_JOBS — companies hiring for certain roles (based on job postings). - GOOGLE_MAPS — local businesses / places. Saved filters. Instead of text, you can send savedFilterId to create a preview from an existing saved filter. Saved-filter previews require a concrete provider; omit provider to default to LINKEDIN. Scope to a LinkedIn identity. Only pass identityId when the user explicitly asks for an identity-specific LinkedIn search, such as importing 2nd-degree connections for identity 123. For normal sourcing requests like "software engineers in Girona", do NOT infer or pass an identity — omit identityId so AI Finder can auto-pick an available Sales Navigator identity. identityId is only valid with provider: LINKEDIN, and the identity must have linkedinSearchEnabled: true (Sales Navigator + valid credentials). List eligible identities with GET /v1/identities?linkedinSearchEnabled=true. The chosen identityId carries through iterate and into import. What you get back. A previewId (valid for 24 hours) plus the result object with the AI-generated filters, a human-readable title and reasoning, the resolvedProvider (useful when you passed AUTO), and identityId echoed back when you scoped the search to one. What to do next. Pass the previewId to POST /v1/ai-finder/previews/{previewId}/iterate to refine, or to POST /v1/ai-finder/previews/{previewId}/import to commit. > Required scope: ACTIONS_WRITE > > Rate limit: 10 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Validation error - 422: AI could not build a valid search, or the requested provider is unavailable (e.g. CRM_CONTACTS/CRM_COMPANIES with no CRM configured).
publish_workflow
ChatGPTPublish workflow Publishes a workflow's draft as a new version so it can run. Call validate_workflow_draft first; returns 409 on a revision conflict and 422 on validation failure. Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: The workflow ID is not a positive integer. - 404: Workflow not found or not writable. - 409: A revision conflict (the draft changed since the provided revision — re-read the workflow and retry), the trigger is already being updated by another publish (retry shortly), or the workflow is open in the collaborative app editor (close it there and retry). - 422: The stored draft fails publish validation.
refine_an_ai_finder_preview
ChatGPTRefine an AI Finder preview What it does. Takes an existing previewId plus a natural-language feedback string (e.g. "exclude agencies", "only US companies", "narrow to 50–500 employees") and runs a NEW AI search that combines the original query with your refinement. Returns a brand-new previewId; the original preview is untouched and still valid. When to use. Call this after you've reviewed the result of a preview and want to tighten the filters before importing. You can chain iterations — each iterate call returns a new previewId you can iterate on again. Provider. The new preview uses the SAME provider as the one being refined — you don't re-pick the provider. If the original preview used AUTO, the refined one also uses AUTO (the AI may still route to the same or a different provider, based on the combined query). What you get back. Same shape as POST /v1/ai-finder/previews, plus a previousPreviewId field pointing at the preview you refined. Use this new previewId with the iterate or import endpoint. > Required scope: ACTIONS_WRITE > > Rate limit: 10 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Validation error - 404: Preview not found or expired - 422: AI could not build a valid refined search
remove_companies_from_a_list
ChatGPTRemove companies from a list Remove companies from a list. Responses include direct Enginy app URLs when available. The response includes listAppUrl for the target list. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: List not found
remove_contacts_from_a_list
ChatGPTRemove contacts from a list Remove contacts from a list. Responses include direct Enginy app URLs when available. The response includes listAppUrl for the target list. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE. Known failure modes: - 400: Bad request - validation error - 404: List not found
remove_inbox_tags_from_a_contact_thread
ChatGPTRemove inbox tags from a contact thread Remove one or more tags from a contact thread. Required parameters: - contactId: contact ID path parameter. - tagIds: array of tag IDs in the request body. Optional body fields: - senderIdentityId: target one sender-specific thread when the same contact appears under multiple sender identities. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool requires a body payload matching the input schema. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid contact ID - 404: Contact, thread, sender identity, or tags not found
run_workflow
ChatGPTRun workflow Starts a run of a PUBLISHED workflow. If it returns 409, publish the workflow first with publish_workflow. Pass input as a single-key object matching the workflow runtime input contract; omit it for workflows that take no input. Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: Invalid run input, or a webhook-with-declared-inputs workflow that cannot be run manually. - 404: Workflow not found or not accessible. - 409: Either the workflow is not published (publish it first with POST /v1/workflow/{workflowId}/publish) or its published version changed while the run was starting (re-read the workflow and retry).
search_companies_with_advanced_filters
ChatGPTSearch companies with advanced filters Search companies with advanced filtering options. Every key in include/exclude must be a recognized filter field (a static filter like id, companyGroup, or campaigns, or a company field id returned by the fields endpoint) — an unrecognized key returns a 400 listing the offending key(s) instead of being silently ignored. Responses include direct Enginy app URLs when available. Each returned company includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: COMPANIES_READ > > Rate limit: 100 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: COMPANIES_READ.
search_contacts_with_advanced_filters
ChatGPTSearch contacts with advanced filters Search contacts with advanced filtering options. Every key in include/exclude must be a recognized filter field (a static filter like id, leadsGroup, or campaigns, or a contact/company field id returned by the fields endpoints) — an unrecognized key returns a 400 listing the offending key(s) instead of being silently ignored. To filter contacts by the contact's own country, use leadCountry (this same field is returned in responses as contactCountry and accepted as a write alias on update/create). The country filter key matches the associated company's country instead, not the contact's own. Responses include direct Enginy app URLs when available. Each returned contact includes an appUrl field, and associated companies include appUrl when present. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CONTACTS_READ > > Rate limit: 100 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: CONTACTS_READ. Known failure modes: - 404: Actions run not found (when filtering by actionsId)
send_feedback
ChatGPTSend MCP feedback to Slack channel C0ATQ6B905S (#enginy-mcp-feedback). Only SUPER_ADMIN users can use this tool. Use it when the agent wants to do something Enginy MCP does not have tools for, an existing tool lacks required options or parameters, a tool behaves unexpectedly or fails, docs are unclear, or another MCP issue blocks progress. Include what you tried, what was missing or broken, and the expected behavior.
send_inbox_message
ChatGPTSend inbox message Send a manual inbox reply through Enginy conversation routing. Required body fields: - contactId: contact whose thread should receive the reply. - senderIdentityId: sender identity that owns the target thread. - message: plain-text body of the manual reply. Optional body fields: - type: channel used to select the matching conversation. Allowed values are EMAIL and LINKEDIN. If omitted, Enginy falls back to the latest replyable message channel on the matched thread. - attachment: one attachment with url, name, and MIME type. - requestId: idempotency suffix for safely retrying the same manual reply. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute This tool requires a body payload matching the input schema. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid payload or the message service was unavailable - 404: Contact, sender identity, or matching conversation not found
set_skipped_tasks
ChatGPTSet skipped tasks Set or clear the skipped state for tasks. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
start_an_actions_run
ChatGPTStart an actions run Starts an actions run that executes one or more actions on contacts, companies, or lists — the tool for enrichment, verification, LinkedIn scraping, and sourcing. Available action types: VERIFY_LEAD_EMAIL, VERIFY_LEAD_PHONE, SCRAPE_LEAD_FROM_LINKEDIN, LINKEDIN_FROM_NAME_LASTNAME_COMPANY, SCRAPE_COMPANY_FROM_LINKEDIN, COMPANY_LINKEDIN_FROM_NAME, SCRAPE_COMPANY_ACCOUNTIQ_FROM_LINKEDIN, ENRICH_COMPANY_WITH_STORELEADS, ENRICH_WITH_EMAIL, ENRICH_WITH_PHONE, FILL_LEAD_WITH_SMART_FIELDS, FILL_COMPANY_WITH_SMART_FIELDS, SEARCH_LEADS_FROM_LINKEDIN_COMPANY, EXPORT_TO_CRM, SYNC_LEAD_WITH_CRM, SYNC_COMPANY_WITH_CRM. Provide exactly one target selector (contactIds, companyIds, contactGroupIds, or companyGroupIds); each action's options are documented in the body schema. Poll progress with the actions run status tool and check workspace credit costs with the credit pricing tool before running billable actions. This tool accepts an optional body payload when shown in the input schema. Required scopes: ACTIONS_WRITE. Known failure modes: - 400: Bad request - validation error or no entities to process
test_webhook_subscription
ChatGPTTest webhook subscription Send a test event to a webhook. > Required scope: WEBHOOKS_WRITE > > Rate limit: 10 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: WEBHOOKS_WRITE. Known failure modes: - 400: Failed to send test webhook - 404: Webhook not found
unarchive_inbox_contact_thread
ChatGPTUnarchive inbox contact thread Unarchive one inbox contact thread. Required parameters: - contactId: contact ID path parameter. Notes: - Unarchiving is lead-level, so all visible threads for that contact move back into the active inbox. - The endpoint is idempotent. If the contact is already active it still returns success. > Required scope: MESSAGING_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: MESSAGING_WRITE. Known failure modes: - 400: Invalid contact ID - 404: Contact or inbox thread not found
update_a_blocklist_entry
ChatGPTUpdate a blocklist entry Update an existing blocklist entry. Updates to LinkedIn URL values are normalized before persisting. DOMAIN entries cannot be updated to a shared link-shortener host (e.g. linktr.ee, bit.ly). > Required scope: BLOCKLIST_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: BLOCKLIST_WRITE. Known failure modes: - 400: Bad request - invalid input - 404: Blocklist item not found
update_a_draft_campaign
ChatGPTUpdate a draft campaign Update a DRAFT campaign in place: campaign settings and/or the full step sequence. steps uses the same simplified step model as POST /v1/campaigns and, when provided, replaces the whole stored sequence — fetch the current steps with GET /v1/campaign/{campaignId}, modify them, and resubmit. Rich-text formatting of steps whose text you did not change is preserved automatically. Campaigns that are not in DRAFT status cannot be updated; clone them instead. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the updated campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 400: Bad request - the campaign payload does not match the public simplified schema. Common causes: - Referenced identity (identityId) does not exist in this workspace. - Unrecognized field on a step or branch (e.g. delay is not a valid key on conditional onAccepted/onTrue/onFalse branches — use a dedicated wait/delay node inside the branch instead). - Required field missing (the response errors[].path indicates which body location failed validation). - 404: Campaign not found - 409: Conflict - the campaign is not editable in its current status. Only campaigns in DRAFT status can be updated through this endpoint. To modify a launched campaign, clone it (POST /v1/campaign/{campaignId}/clone) and edit the clone. A launched campaign cannot be returned to DRAFT, because DRAFT does not stop conversations that are already running. To stop it sending, PATCH /v1/campaign/{campaignId}/status with {"status": "PENDING"}. Conflict - the campaign has send history from a previous launch, so its steps cannot be replaced. Clone the campaign (POST /v1/campaign/{campaignId}/clone) and edit the clone instead. - 422: Unprocessable entity - the campaign steps are structurally invalid. Common causes the agent should fix before retrying: - EMAIL_OPENED / NOT_EMAIL_OPENED conditions may only appear after an EMAIL node in the same branch. Add the EMAIL node first or remove the condition. - Every conditional branch (onAccepted/onNotAccepted/onTrue/onFalse) must contain at least one node. Use [{ "type": "end" }] to terminate a branch explicitly instead of leaving it empty. - Templated fields (e.g. {firstName}, {companyName}) must reference AI variables or standard fields that exist for the campaign's entity. Use GET /v1/contacts/fields or GET /v1/companies/fields to discover valid placeholders before composing message bodies. - Reply emails inside the same thread may omit subject, but the first email in any thread must have a non-empty subject. - aiMessageId must reference a workspace AI message (GET /v1/ai-variables/ai-messages) or a prompt-library entry (GET /v1/prompt-library/ai-messages) whose channel matches the step type, and cannot be combined with manual content/subject.
update_a_message_template
ChatGPTUpdate a message template Updates a workspace-owned message template. All fields are optional (at least one required); prompt text is re-validated and re-converted with the same strict token rules as create. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 404: Message template not found in this workspace - 409: Conflict - an entity with this name already exists
update_a_promptlibrary_ai_message_superadmin_only
ChatGPTUpdate a prompt-library AI message (superadmin only) Update an existing prompt-library AI message draft. Only the fields included in the request body are updated; omitted fields are left unchanged. Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 404: Not found - prompt-library AI message does not exist - 409: Conflict - name already exists
update_a_promptlibrary_ai_research_superadmin_only
ChatGPTUpdate a prompt-library AI research (superadmin only) Update an existing prompt-library AI research draft. Only the fields included in the request body are updated; omitted fields are left unchanged. Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 404: Not found - prompt-library AI research does not exist - 409: Conflict - name already exists
update_a_promptlibrary_ai_snippet_superadmin_only
ChatGPTUpdate a prompt-library AI snippet (superadmin only) Update an existing prompt-library AI snippet draft. Only the fields included in the request body are updated; omitted fields are left unchanged. Superadmin only. This endpoint requires a SUPER_ADMIN user and is not part of the public customer-facing API. Newly created entries are always unpublished drafts; publishing is handled in a separate step. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input - 404: Not found - prompt-library AI snippet does not exist - 409: Conflict - name already exists
update_ai_message_folder
ChatGPTUpdate AI message folder Update a AI message folder name or parent. Moving a folder into one of its descendants is not allowed. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
update_ai_playbook
ChatGPTUpdate AI playbook Update the workspace AI playbook (company info, products & services, ICPs, competitors, testimonials, FAQs). Omitted sections and omitted items are left untouched — nothing is ever deleted unless its id is explicitly listed in a section's deleteIds. Items are matched by name: matching names update the existing item, new names create items. Call get_ai_playbook first to see current ids and values. idealCompanies and ICP linkedInFilters are managed automatically and cannot be written. This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKSPACE_WRITE. Known failure modes: - 400: The request referenced ids or items that could not be applied. Nothing was written. - 404: Workspace not found
update_ai_snippet_folder
ChatGPTUpdate AI snippet folder Update a AI snippet folder name or parent. Moving a folder into one of its descendants is not allowed. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
update_an_ai_message
ChatGPTUpdate an ai message Updates a workspace-owned ai message. All fields are optional (at least one required); prompt text is re-validated and re-converted with the same strict token rules as create. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 404: AI message not found in this workspace - 409: Conflict - an entity with this name already exists
update_an_ai_snippet
ChatGPTUpdate an ai snippet Updates a workspace-owned ai snippet. All fields are optional (at least one required); prompt text is re-validated and re-converted with the same strict token rules as create. Requires the AI variable split to be enabled for the workspace; otherwise returns 403. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Invalid prompt tokens (unknown, ambiguous name, or reference type not allowed for this entity) — details.issues lists each problem and details.validTokenSample shows valid tokens; or folderId is not a folder of this entity type / workspace - 404: AI snippet not found in this workspace - 409: Conflict - an entity with this name already exists
update_an_ai_variable
ChatGPTUpdate an AI variable Update an existing AI variable (AI research). Prompt placeholders must come from the relevant fields endpoint output for this workspace; generic conversation placeholders such as previousMessage are not supported here. When prompt is updated, Enginy regenerates the internal editor format from the new prompt text. Use the contact/company fields endpoints as the source of truth for prompt placeholders. Do not assume campaign-only aliases like previousMessage are valid in manual/public AI-variable updates. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE. Known failure modes: - 400: Bad request - invalid input, folder/entity mismatch, or unsupported placeholders such as previousMessage - 404: AI variable not found - 409: Conflict - AI variable name already exists for this entity
update_campaign_folder
ChatGPTUpdate campaign folder Update a campaign folder name or parent. Moving a folder into one of its descendants is not allowed. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the folder in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE.
update_campaign_status
ChatGPTUpdate campaign status Update campaign status to DRAFT, PENDING, ACTIVE, COMPLETED, or DELETED. There is no PAUSED status. Setting status to ACTIVE launches the campaign: it assigns identities and emails to conversations and starts sending. Setting status to DRAFT does not immediately stop outreach — it is a soft, best-effort pause: conversations that are already running keep progressing and in-flight messages can still go out until each conversation next re-evaluates campaign status, so it should not be relied on to instantly halt sends. To reliably stop outreach to one contact right now, use pause_a_contact_in_a_campaign instead, which pauses only that contact's conversation rather than the whole campaign. Setting status to COMPLETED or DELETED is terminal: conversations are marked completed or deleted and the campaign cannot move back to DRAFT, PENDING, or ACTIVE afterward (a COMPLETED campaign can only move to DELETED). Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the updated campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: CAMPAIGNS_WRITE. Known failure modes: - 400: Bad request - validation error or invalid status transition - 404: Campaign not found
update_company_ai_variable_folder
ChatGPTUpdate company AI variable folder Update a company AI variable folder name or parent. Moving a folder into one of its descendants is not allowed. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
update_company_fields
ChatGPTUpdate company fields Update company fields (standard and custom/AI fields by name). > Required scope: COMPANIES_WRITE > > Rate limit: 30 requests per minute Accepted standard fields (auto-updated): - name - companyUrn - companyLinkedInUrl - website - domain - industry - rangeOfEmployees - numberOfEmployees - yearfounded - description - country - city - streetAddress - hiringOnLinkedIn - phoneNumber - companyEmail - openJobPositions - revenueRange - sixMonthsHeadcountGrowth - twoYearsHeadcountGrowth - yearlyHeadcountGrowth - legalCode - legalName - globalUltimateCode - lastLinkedInPost - googleMapsOpeningHours - taxId Custom/AI fields are also allowed by name and are client-specific. Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: COMPANIES_WRITE. Known failure modes: - 400: Bad request - invalid fields or values - 404: Company not found
update_company_list_folder
ChatGPTUpdate company list folder Update a company list folder name or parent. Moving a folder into one of its descendants is not allowed. Responses include direct Enginy app URLs when available. The updated folder response includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE.
update_contact_ai_variable_folder
ChatGPTUpdate contact AI variable folder Update a contact AI variable folder name or parent. Moving a folder into one of its descendants is not allowed. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
update_contact_fields
ChatGPTUpdate contact fields Update contact fields (standard and custom/AI fields by name). You can also set companyId to associate the contact with an existing company, or null to clear the current association. The contact's own country is stored as leadCountry; responses expose it as contactCountry, and contactCountry is also accepted here as a write alias for leadCountry. linkedInProfileId accepts either the bare LinkedIn profile id or a URL: a LinkedIn profile URL is converted to its id automatically, and a URL with no extractable id (e.g. a vanity /in/<slug> URL, or a non-LinkedIn link) is rejected as an invalid value (400) rather than stored as given. Surrounding whitespace is trimmed. > Required scope: CONTACTS_WRITE > > Rate limit: 30 requests per minute Accepted standard fields (auto-updated): - linkedInProfileId - firstName - jobTitle - lastName - linkedinProfileUrl - personalEmails - phones - professionalEmail - mobilePhone - geoRegion - leadCountry - profileBio - yearsInCompany - yearsInRole - lastLinkedInPost - jobChange - mentionedInNews - promotion - leadCRMId - previousPositions - languages - linkedInHeadline - companyId (special association field; use an existing company ID or null) Custom/AI fields are also allowed by name and are client-specific. Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: CONTACTS_WRITE. Known failure modes: - 400: Bad request - invalid fields or values - 404: Contact not found
update_contact_list_folder
ChatGPTUpdate contact list folder Update a contact list folder name or parent. Moving a folder into one of its descendants is not allowed. Responses include direct Enginy app URLs when available. The updated folder response includes an appUrl field. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: LISTS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: LISTS_WRITE.
update_identity
ChatGPTUpdate identity Update public identity profile fields and email signature HTML. Writable fields: name, firstName, lastName, jobTitle, email, phoneNumber, linkedInUrl, scheduleMeetingUrl, timezone, profileOverview, keyResponsibilities, interests, languages, gender, seniorityLevel, educations, previousPositions, countryCode, and signature. Send signature as HTML. Enginy stores that HTML in signature and uses it when appending signatures to outbound emails. Send signature: null to clear the signature. > Required scope: ALL > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: ALL. Known failure modes: - 400: Bad request - invalid identity ID or request body - 404: Identity not found
update_message_template_folder
ChatGPTUpdate message template folder Update a message template folder name or parent. Moving a folder into one of its descendants is not allowed. > Required scope: AI_VARIABLES_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: AI_VARIABLES_WRITE.
update_task
ChatGPTUpdate task Update an existing task. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the updated task in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: TASKS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: TASKS_WRITE.
update_webhook_subscription
ChatGPTUpdate webhook subscription Update a webhook subscription. > Required scope: WEBHOOKS_WRITE > > Rate limit: 30 requests per minute Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: WEBHOOKS_WRITE. Known failure modes: - 404: Webhook not found
update_workflow_draft
ChatGPTUpdate workflow draft Updates a workflow draft with a full plan or an ordered ops array (not both). Read get_workflow first for the current revision. Workflows are a DAG in plan.nodes. Each node has an id and a next array of ids ("" = unwired). Node kinds: BLOCK (one step; blockId + inputs; one next slot, two for WAIT_FOR_APPROVAL), CONDITIONAL (conditions + next = one target per condition then the fallback last; a condition is { field, operator, value? } or a random A/B split { "type": "RANDOM_SPLIT", "percentage": 1-100 } with sibling percentages summing to ≤ 100), KING (groupBy/orderBy; next = [left, right]). Start with a selector/import block. Max 60 nodes, no cycles. Call get_workflow_blocks + get_workflow_block_inputs to discover valid blockIds/inputs and get_workflow_condition_fields for CONDITIONAL fields. Put configured values, never catalog metadata, in BLOCK inputs. Bind a declared non-entity WEBHOOK input as { "webhookInputKey": "<declared key>" } in the matching field; entity inputs use "__MANUAL_INPUT". Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: Invalid body, invalid edit op, or a structurally invalid resulting plan. - 404: Workflow not found or not writable. - 409: Either a revision conflict (the draft changed since the provided revision) or the workflow is open in the collaborative app editor (close it there and retry). - 422: The resulting plan fails block/config validation.
update_workflow_folder
ChatGPTUpdate workflow folder Updates a workflow folder name or parent ({name?, parentId?}; parentId null moves it to root). Cannot move a folder into its own descendant. Use pathParams when the input schema includes path parameters. This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: Invalid body, a missing parent folder, or an illegal move (self/descendant). - 404: Folder not found. - 409: A folder with this name already exists at the target level.
validate_api_key
ChatGPTValidate API key Validate API key authentication. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Required scopes: WORKSPACE_READ.
validate_campaign
ChatGPTValidate campaign Validate a simplified public campaign payload against the public step schema without creating a campaign. Use this before POST /v1/campaigns when you already have a proposed request body. This validates only the submitted payload and does not read or inspect an existing saved campaign. This endpoint validates only the submitted request body. It does not load, inspect, or verify an already-saved campaign in Enginy. Create a draft campaign from the public steps format. How to structure the request: - Start steps with the first action that should happen. - Keep adding the next action in the order it should run. - Use condition when you want to branch on lead data. - Use linkedin_connection with waitForAcceptance when you want to branch on connection acceptance after sending a connection request. Omit waitForAcceptance for a fire-and-forget connection request. - Use linkedin_message with content, attachment, or both. Attachment-only messages are valid. - Use whatsapp_message only when the workspace and sending identity are configured for WhatsApp. - Put shared follow-up work after the branching step instead of duplicating the same steps inside both branches. AI-generated messages (message library): - email, linkedin_message, linkedin_inmail, and linkedin_connection steps accept aiMessageId instead of manual content — the linked AI message writes a personalized message per contact at send time. - To reuse a prompt-library ("message library") prompt, list entries with GET /v1/prompt-library/ai-messages and pass the entry id as the step aiMessageId. The step gets its own copy automatically. - To reuse or create a workspace AI message, use GET /v1/ai-variables/ai-messages or POST /v1/ai-variables/ai-messages (full control over prompt, toneId, model, outputLength, and splitMessages), then pass its id as aiMessageId. - The AI message channel must match the step type (EMAIL, LINKEDIN, LINKEDIN_INMAIL, or LINKEDIN_CONNECTION). - Never combine aiMessageId with manual content or subject on the same step — for email and linkedin_inmail the AI message generates the subject too. Before you send a request: - Send an ordered steps array that describes the campaign flow from first action to last action. - Use branch arrays on condition and linkedin_connection steps to describe branch-specific work. - Place shared follow-up steps after a branching step when both live branches should continue together. - waitForAcceptance.unit must be days and waitForAcceptance.value must be an integer greater than or equal to 1. - Use GET /v1/tasks/owners first when your campaign includes task steps. If owners are returned, every task step must include ownerId. - Validation errors use full paths like steps[0].onTrue[1].subject so nested input issues are easy to fix. - Personalization placeholders use Enginy single-brace syntax such as {firstName}, {companyName}, and {identity.name}. Do not send Handlebars-style placeholders like {{firstName}}. - Placeholders must reference real fields — discover them with GET /v1/contacts/fields. Unknown placeholders are rejected with a 422. The company aliases {company}, {companyName}, and {companyDomain} are accepted and stored as the canonical company columns. - To modify an existing DRAFT campaign in place, prefer PATCH /v1/campaign/{campaignId} over creating a new one. To rewrite into a new campaign, start from the steps returned by GET /v1/campaign/{campaignId}. Either way the read-only stepId, connectionId, nextConnectionId, and advanced fields are accepted and ignored, but fill in messages that come back empty (their content is AI-generated per contact — recreate them with aiMessageId where the step type supports it, or provide manual content). Supported condition.type values: - has_linkedin_profile: onTrue runs when the lead has a LinkedIn profile. - has_professional_email: onTrue runs when the lead has a professional email. - is_already_connected: `onT…
validate_campaign_draft
ChatGPTValidate campaign draft Validate the stored editor draft graph for an already-created campaign by campaignId and return blocking errors plus non-blocking warnings. Use this to inspect an existing saved draft, including incomplete or complex internal drafts. This does not validate an arbitrary request payload. This endpoint validates a campaign that already exists in Enginy. It reconstructs the stored draft graph for the requested campaignId and does not validate a newly submitted campaign payload. Responses include direct Enginy app URLs when available. Responses include an appUrl that opens the campaign in Enginy. MCP agents should return those URLs to users whenever they are present in the response. > Required scope: CAMPAIGNS_READ > > Rate limit: 100 requests per minute Use pathParams when the input schema includes path parameters. Required scopes: CAMPAIGNS_READ. Known failure modes: - 400: Bad request - invalid campaign ID - 404: Campaign not found
validate_workflow
ChatGPTValidate workflow Validates a workflow plan payload (strict) without creating it. Call before create_workflow with publish:true. Workflows are a DAG in plan.nodes. Each node has an id and a next array of ids ("" = unwired). Node kinds: BLOCK (one step; blockId + inputs; one next slot, two for WAIT_FOR_APPROVAL [approved, rejected] and CHECK_LEAD_FOR_CHANGES [changed, unchanged]), CONDITIONAL (conditions + next = one target per condition then the fallback last; a condition is { field, operator, value? } or a random A/B split { "type": "RANDOM_SPLIT", "percentage": 1-100 } with sibling percentages summing to ≤ 100), KING (shown as Prioritize by group; groupBy/orderBy/limit; next = [prioritized, remaining]). Start with a selector/import block. Max 60 nodes, no cycles. Call get_workflow_blocks + get_workflow_block_inputs to discover valid blockIds/inputs and get_workflow_condition_fields for CONDITIONAL fields. For import sources, resolve audience filters with preview_an_ai_finder_search, then get_workflow_import_inputs to obtain blockId and its short source reference. Use the blockId with empty inputs and pass { nodeId, ...source } in importSources to validate/create/update; the server fills exact source values. Do not copy encoded URLs. LinkedIn search URLs are generated, not required from the user. Put configured values, never catalog metadata, in BLOCK inputs. Bind a declared non-entity WEBHOOK input as { "webhookInputKey": "<declared key>" } in the matching field; entity inputs use "__MANUAL_INPUT". This tool accepts an optional body payload when shown in the input schema. Required scopes: WORKFLOWS_WRITE. Known failure modes: - 400: The plan is structurally invalid (malformed graph). - 404: An import source preview is unavailable, expired, or inaccessible. - 422: The plan or import source fails block/config validation.
validate_workflow_draft
ChatGPTValidate workflow draft Validates the stored draft of a workflow as if publishing. Call before publish_workflow to see blocking errors and warnings. Use pathParams when the input schema includes path parameters. Required scopes: WORKFLOWS_READ. Known failure modes: - 400: The workflow ID is not a positive integer. - 404: Workflow not found or not accessible.