- Brand
- Enginy
- 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
- 256
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Enginy
Get updates when Enginy’s Discoverability Score or category rank changes.
Competing in ChatGPT B2B Prospecting & Contact Data
View Category256 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. `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_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
Add tags to companies Apply tags to companies in bulk: every tag in `tagIds` to every company in `companyIds` (up to 10000 companies and 50 tags per call; split larger selections). Idempotent: pairs that already exist are skipped. Any company or tag id outside the workspace (including a contact tag id) rejects the whole call with 404 before anything is written. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 with `details.code` `ENTITY_TAGS_NOT_ENABLED`; tell the user instead of retrying. > **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: Tags are not enabled for this workspace (`details.code` `ENTITY_TAGS_NOT_ENABLED`), or the body is invalid. - 404: A company or tag id is not in this workspace; nothing was written
add_tags_to_companies
Add tags to contacts Apply tags to contacts in bulk: every tag in `tagIds` to every contact in `contactIds` (up to 10000 contacts and 50 tags per call; split larger selections). Idempotent: pairs that already exist are skipped. Any contact or tag id outside the workspace (including a company tag id) rejects the whole call with 404 before anything is written. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 with `details.code` `ENTITY_TAGS_NOT_ENABLED`; tell the user instead of retrying. > **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: Tags are not enabled for this workspace (`details.code` `ENTITY_TAGS_NOT_ENABLED`), or the body is invalid. - 404: A contact or tag id is not in this workspace; nothing was written
add_tags_to_contacts
Archive a Social Selling draft Archives a draft that is not scheduled (hidden from lists and the calendar). Idempotent. Nothing on LinkedIn is touched. > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute Use `pathParams` when the input schema includes path parameters. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 404: Draft not found in this workspace or outside the caller’s identity scope - 409: `VERSION_CONFLICT` (the draft changed: re-read it), `DRAFT_NOT_EDITABLE` / `ALREADY_SCHEDULED` (unschedule first), `IDEMPOTENCY_KEY_REUSED`, `PUBLICATION_STARTED` — `details` carries the current version or publication
archive_a_social_selling_draft
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. 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
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 a scheduled Social Selling post Cancel a scheduled Social Selling post before it is published: its schedule is stopped and the post, with its scheduled reactions and comments, is deleted from Enginy. Refused (409) once its publish time has come or for a post that was not scheduled, and (503, post kept) when the schedule cannot be stopped right now — retry later. Nothing is removed from LinkedIn. > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute Use `pathParams` when the input schema includes path parameters. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 400: Non-numeric `publishingPostId` - 404: Post not found in this workspace, or outside the caller’s identity scope - 409: The post is already published or publishing, or it was not scheduled
cancel_a_scheduled_social_selling_post
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
Claim a Social Selling comment Claim a reply queue comment for 30 minutes so no one else answers it (claiming again renews your claim). Atomic: 409 COMMENT_CLAIMED (with `claimedByUserId` and `claimExpiresAt`) when someone else holds it, 409 COMMENT_CLOSED when it was already resolved or dismissed. Only changes Enginy’s queue, never LinkedIn. > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute Use `pathParams` when the input schema includes path parameters. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 404: Comment not found in this workspace or outside the caller’s identity scope - 409: Claimed by someone else (COMMENT_CLAIMED) or already closed (COMMENT_CLOSED)
claim_a_social_selling_comment
Clone a campaign Clone a campaign onto new sender identities (`identityId`, or `identityIds` for several senders, primary first), preserving workflow, messages, tasks, tags, and folder. The clone keeps the source's selected sending emails (`allowedEmails`) when it keeps the source's single sender; on any other sender set it starts with none selected, so it sends from every mailbox of its senders. 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, no `identityId`/`identityIds`, `identityId` not equal to `identityIds[0]`, or more than one sender identity while the multi-identity campaigns beta is off for the workspace (`details.code` `MULTI_IDENTITY_CAMPAIGNS_NOT_ENABLED`). - 404: Campaign or identity not found
clone_a_campaign
Complete a Social Selling media upload Confirms an upload: the stored file must match the declared size and type (else 400 `UPLOAD_MISMATCH` and the asset is FAILED; 400 `UPLOAD_MISSING` when nothing was uploaded yet). Reads image dimensions and marks the asset AVAILABLE, ready to attach to drafts. Idempotent. > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute Use `pathParams` when the input schema includes path parameters. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 400: `UPLOAD_MISSING` (nothing uploaded yet) or `UPLOAD_MISMATCH` (size or type differs) - 404: Asset not found in this workspace or outside the caller’s identity scope (also for a malformed id)
complete_a_social_selling_media_upload
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 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_message_folder
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_ai_snippet_folder
Create a Social Selling draft Creates a draft LinkedIn post for one identity: text, structured mentions, ordered media (`assetId`s: uploads, or a tracked post’s media which is copied into the workspace), an optional first comment, visibility, company page, and planning fields (series, pillar, objective, audience, factual sources, notes, attribution). Nothing is published: preview it, then schedule its `version`. All content rules are checked at once (400 `INVALID_DRAFT` with `details.problems`). > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute This tool accepts an optional `body` payload when shown in the input schema. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 400: `INVALID_DRAFT` with every problem in `details.problems`, or an asset that cannot be attached - 404: Identity or media asset not found in this workspace or outside the caller’s scope
create_a_social_selling_draft
Create a Social Selling media upload Starts a media upload for a draft: answers an `assetId` and a presigned `upload.url`. PUT the file there with exactly `upload.headers` (the signature covers the size and type), then call `complete_a_social_selling_media_upload`. Images (JPEG, PNG, GIF, WebP; up to 8 MB, 20 per post), one video (MP4, MOV, …; 3 s to 15 min, up to 5 GB) or one document (PDF, DOC(X), PPT(X); up to 100 MB). To reuse a post’s media, attach its `spm_` asset id to a draft directly instead. > **Required scope:** `SOCIAL_SELLING_WRITE` > > **Rate limit:** 30 requests per minute This tool accepts an optional `body` payload when shown in the input schema. Required scopes: SOCIAL_SELLING_WRITE. Known failure modes: - 400: Unsupported type, extension/MIME mismatch or file too large (`INVALID_UPLOAD`)
create_a_social_selling_media_upload
Create a company tag Create a company tag, or get the existing one: names are unique per pool ignoring case, so creating "evento 1" when "Evento 1" exists returns that tag (200, `created: false`) instead of a twin (201, `created: true`). Creating a tag does not apply it; use `POST /v1/companies/tags/add`. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 with `details.code` `ENTITY_TAGS_NOT_ENABLED`; tell the user instead of retrying. > **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: Tags are not enabled for this workspace (`details.code` `ENTITY_TAGS_NOT_ENABLED`), or a tag rule was broken (`details.code` `ENTITY_TAG_INVALID`, `details.reason` one of `nameEmpty`, `nameTooLong`, `colorInvalid`, `emptyUpdate`, `tooManyEntityIds`, `tooManyTagIds`).
create_a_company_tag
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_contact_custom_field
Create a contact tag Create a contact tag, or get the existing one: names are unique per pool ignoring case, so creating "evento 1" when "Evento 1" exists returns that tag (200, `created: false`) instead of a twin (201, `created: true`). Creating a tag does not apply it; use `POST /v1/contacts/tags/add`. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 with `details.code` `ENTITY_TAGS_NOT_ENABLED`; tell the user instead of retrying. > **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: Tags are not enabled for this workspace (`details.code` `ENTITY_TAGS_NOT_ENABLED`), or a tag rule was broken (`details.code` `ENTITY_TAG_INVALID`, `details.reason` one of `nameEmpty`, `nameTooLong`, `colorInvalid`, `emptyUpdate`, `tooManyEntityIds`, `tooManyTagIds`).
create_a_contact_tag
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; or `folderId` is not a folder of this entity type / workspace - 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; or `folderId` is not a folder of this entity type / workspace - 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; or `folderId` is not a folder of this entity type / workspace - 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. Senders: - Pass `identityIds` (primary first) to send from several identities; the campaign spreads its contacts across them. `identityId` is the single-sender shorthand. - More than one sender requires the multi-identity campaigns beta on the workspace; without it the request is rejected with `details.code` `MULTI_IDENTITY_CAMPAIGNS_NOT_ENABLED`. - Use `GET /v1/identities` to find identity IDs. `allowedEmails` only applies to single-sender campaigns. 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. Email threading (Reply / New thread): - Set `thread` on an `email` step to pick how it is sent. `reply` sends it in the thread of the previous email, like the editor's Reply option, and needs no `subject`. `new_thread` starts a separate thread under the step's own `subject`. - When `thread` is omitted, a follow-up email without `subject` replies and one with `subject` is sent under that subject. Set `thread` explicitly whenever the choice matters, especially for `aiMessageId` follow-ups, which otherwise go out under their generated subject. 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. GET resolves saved manual templates and returns HTML email bodies. Steps PATCH rejects template emails whose original or replacement bodies contain dynamic references with 422 before replacement. Settings-only PATCH remains available. AI-generated steps retain their `aiMessageId` binding. 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`). - `linkedin_message_viewed`: `onTrue` runs when the lead views the preceding LinkedIn message within `waitFor`. Must follow a LinkedIn message step (`linkedin_message`, `linkedin_message_bundle`, `linkedin_voice_message`, or `linkedin_inmail`). 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: - A referenced identity (`identityId` / `identityIds`) does not exist in this workspace, is deleted, or is not one you may send as. - `identityId` and `identityIds` were both sent but `identityId` is not `identityIds[0]`. - More than one sender identity while the multi-identity campaigns beta is off for the workspace (`details.code` `MULTI_IDENTITY_CAMPAIGNS_NOT_ENABLED`): send a single identity, or ask a workspace admin to enable the beta. - `allowedEmails` sent for a campaign with more than one sender identity. - 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. - An `email` step with `thread: "new_thread"` must have a non-empty `subject` unless it uses `aiMessageId`. - `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 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_message_template_folder
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. Send the task text in `description`; `notes` is legacy, for call notes on call tasks. In workspaces that sync tasks with their CRM, `notes` sent without `description` on a non-call task is stored as its description. 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
Enginy ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Enginy's ChatGPT Plugin 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-11-02, Enginy competes with Add to CRM, AdvPulse, AgentData, AgentSource, AI Leads Scout, AI Vibe Prospecting, anVendor, Apollo.io and 71 more 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.