Enginy
Find and reach B2B contacts
- Category
- Sales & CRM
- Primary Subcategory
- B2B Prospecting & Contact Data
Integration details
Description
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.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- B2B Prospecting & Contact Data
- Secondary Subcategories
- None listed
- Brand
- Enginy
- Access
- Account required
- First tracked
- 2026-08-14
- Tool count
- 181
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Get alerts for Enginy
Get updates when Enginy’s Discoverability Score or category rank changes.
ChatGPT Plugin Discovery Score
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Competing in ChatGPT B2B Prospecting & Contact Data
View Category181 tools agents can invoke
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_group_to_a_campaign
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_a_contact_to_a_campaign
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. > **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_blocklist_entries_by_value
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_companies_to_a_list
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
add_contacts_to_a_list
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
archive_inbox_contact_thread
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
attach_inbox_tags_to_a_contact_thread
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. > **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
block_contacts_or_companies_by_id
Build inbox link Build a deep-link URL into the user's /inbox view with the given filters applied. Use when the user asks to be sent to / shown / opened an inbox view, or when a reply benefits from a clickable link to actionable inbox state ("here are the 3 unread WhatsApp threads — open them: <link>"). Do NOT call this to FETCH messages — use list_inbox_threads or get_inbox_contact_messages for data. Notes: - All fields are optional; omitting filters returns the default inbox URL. - folder defaults to 'received'. Common alternatives: 'unread', 'ai_draft', 'tags'. - leadId opens a SINGLE contact thread; leadIds filters the LIST view to those contacts. Almost always prefer leadIds. - Resolve names to numeric IDs first via get_identities / get_campaigns / get_companies / list_inbox_tags when the user gives names. - Pure URL construction — no DB read, no side effects. > **Required scope:** `MESSAGING_READ` > > **Rate limit:** 100 requests per minute This tool accepts an optional `body` payload when shown in the input schema. Required scopes: MESSAGING_READ.
build_inbox_link
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_companies
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)
bulk_create_contacts
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.
cancel_workflow_run
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
clone_a_campaign
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_task
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.
complete_tasks_batch
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_list
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 - 409: Conflict - an entity with this name already exists
create_a_message_template
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_company
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_new_contact
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_message_superadmin_only
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_research_superadmin_only
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_promptlibrary_ai_snippet_superadmin_only
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_a_saved_filter
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_an_ai_variable
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 - 409: Conflict - an entity with this name already exists
create_an_ai_message
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 - 409: Conflict - an entity with this name already exists
create_an_ai_snippet
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. 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`: `onTrue` runs when the lead is already a LinkedIn connection. - `has_been_contacted`: `onTrue` runs when the lead has already been contacted. - `has_whatsapp_account`: `onTrue` runs when the lead has a WhatsApp account. - `email_opened`: `onTrue` runs when the lead opens the preceding email within `waitFor`. Must follow an `email` step. Requires `waitFor` (`value`, `unit`). - `email_clicked`: `onTrue` runs when the lead clicks a link in the preceding email within `waitFor`. Must follow an `email` step. Requires `waitFor` (`value`, `unit`). - `task_completed`: `onTrue` runs when the preceding `task` step is marked complete within `waitFor`. Must follow a `task` step. Requires `waitFor` (`value`, `unit`). - `connection_accepted`: `onTrue` runs when the lead accepts a previous LinkedIn connection request within `waitFor`. Requires `waitFor` (`value`, `unit`). - `lead_field`: `onTrue` runs when the contact `field` matches the `operator` (and `value`, where applicable). Use this to branch on any built-in column or custom field. Requires `field` and `operator`. `value` is required for every operator except `IS_EMPTY` and `IS_NOT_EMPTY`. Supported operators: `EQUALS`, `NOT_EQUALS`, `CONTAINS`, `NOT_CONTAINS`, `GREATER_THAN`, `LESS_THAN`, `GREATER_THAN_OR_EQUALS`, `LESS_THAN_OR_EQUALS`, `IS_EMPTY`, `IS_NOT_EMPTY`. Branch fields: - `condition` uses `onTrue` and `onFalse`. - `linkedin_connection` uses `onAccepted` and `onNotAccepted` only when `waitForAcceptance` is set. - Use `[{ "type": "end" }]` when a branch should stop explicitly. Routing into another campaign: - Use `add_to_another_campaign` with a `campaignId` to route the lead into an existing campaign in the same workspace. - The referenced `campaignId` must belong to the same client as the API key. If you are cloning campaigns across workspaces, remap each `campaignId` to the equivalent campaign in the destination workspace before posting. - Can be followed by additional steps in the same branch. For examples and a full step-by-step guide, see `/api-reference/campaigns-guide` in the docs site. > **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 - 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). - 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`.
create_campaign
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_campaign_folder
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_ai_variable_folder
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_company_list_folder
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_ai_variable_folder
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_contact_list_folder
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_inbox_tag
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_or_update_an_identity_mailbox
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_task
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_webhook_subscription
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
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.
create_workflow_folder
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_blocklist_entry
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_company
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_contact
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_list
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_message_template
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_a_saved_filter
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_an_ai_variable
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_message
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_snippet
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_blocklist_entries_in_bulk
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_campaign_folder
Delete company AI variable folder Delete a company AI variable folder. Child folders are moved to the deleted folder's parent, and AI variables inside the deleted folder are reassigned to that same parent instead of being deleted. > **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_ai_variable_folder
How do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Enginy alternatives on ChatGPT?
As of 2026-09-28, Enginy competes with AI Leads Scout, AI Vibe Prospecting, Apollo.io, Canonical Company Search, Clay, Crustdata, Data247, DataForB2B, DataLayer, DayOneLead, Demandbase, eCore Enrichment Email Phone, Enrow, EventMatch, Firmable, FullEnrich, Gojiberry, Grata, Happenstance, HG Insights - RGI, Hunter, Icebreaker, InsightSignal, Lusha, Meticulate, Moody's Growth and Strategy, Onsa, Pipecorn, Popl, Resolve Recipients, Reverse Contact, RocketReach, SalesNow, SciLeads, Seamless, SignalHire, SigParser, Sixtyfour Intelligence, Sprouts Data Intelligence, StoreInspect, Sumble, Super Carl, The Org, Unify, Village, ZoomInfo in ChatGPT B2B Prospecting & Contact Data, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.