MCP App Store
by KeenEthics

Overview

Enginy helps B2B sales and prospecting teams build lead lists, enrich contacts, and run outreach campaigns from ChatGPT. Search for companies and people that match your ideal customer profile, then verify emails and phone numbers, find LinkedIn profiles, and organize the results into lists. Draft and launch multi-step email and LinkedIn sequences, review replies from your inbox, and check campaign and conversation analytics. Enginy connects to your existing workspace, so you can work with the contacts, companies, lists, and campaigns your team already has, and keep everything in sync with your CRM. An Enginy account is required.

Tools

add_a_contact_group_to_a_campaign

ChatGPT
Add 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

ChatGPT
Add 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

ChatGPT
Add 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

ChatGPT
Add 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

ChatGPT
Add 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

ChatGPT
Archive 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

ChatGPT
Attach 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

ChatGPT
Block 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

bulk_create_companies

ChatGPT
Bulk 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

ChatGPT
Bulk 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

ChatGPT
Cancel 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

ChatGPT
Clone 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

ChatGPT
Complete 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

ChatGPT
Complete 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Delete 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

ChatGPT
Fetch 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

ChatGPT
Find 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

ChatGPT
Find 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Get 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

ChatGPT
Import 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

ChatGPT
Import 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
List 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

ChatGPT
Mark 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

ChatGPT
Returns 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

ChatGPT
Returns the current MCP readonly impersonation state for this connection.

mcp_get_usage_guide

ChatGPT
Returns 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

ChatGPT
Searches 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

ChatGPT
Enables readonly MCP impersonation for a target user. Only SUPER_ADMIN users can use this tool.

mcp_stop_readonly_impersonation

ChatGPT
Disables readonly MCP impersonation for the current MCP connection.

mcp_whoami

ChatGPT
Returns the caller identity and granted MCP scopes.

move_companies_between_lists

ChatGPT
Move 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

ChatGPT
Move 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

ChatGPT
Pause 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

publish_workflow

ChatGPT
Publish 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

ChatGPT
Refine 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

ChatGPT
Remove 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

ChatGPT
Remove 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

ChatGPT
Remove 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

ChatGPT
Run 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

ChatGPT
Search 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

ChatGPT
Search 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

ChatGPT
Send 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

ChatGPT
Send 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

ChatGPT
Set 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

ChatGPT
Start 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

ChatGPT
Test 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

ChatGPT
Unarchive 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Update 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

ChatGPT
Validate API key Validate API key authentication. > Required scope: WORKSPACE_READ > > Rate limit: 100 requests per minute Required scopes: WORKSPACE_READ.

validate_campaign

ChatGPT
Validate 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

ChatGPT
Validate 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

ChatGPT
Validate 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

ChatGPT
Validate 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.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

204

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily