# Enginy API Docs > Developer docs for Enginy, the B2B prospecting platform: REST API, hosted MCP server, Advanced Workflows reference, and custom CRM integration. - [Introduction](https://docs.enginy.ai/index.md): Integrate, automate, and build on Enginy — API, MCP, Workflows, and CRM connections - [Enginy MCP](https://docs.enginy.ai/essentials/mcp.md): Connect Claude, ChatGPT, or another MCP client to Enginy through the hosted remote MCP server. - [Make](https://docs.enginy.ai/essentials/make.md): Learn how to integrate Enginy with Make - [Zapier](https://docs.enginy.ai/essentials/zapier.md): Connect Enginy to Zapier today using Webhooks by Zapier — no native app required - [n8n](https://docs.enginy.ai/essentials/n8n.md): Connect Enginy to n8n today using the HTTP Request and Webhook nodes — no community node required - [HTTP](https://docs.enginy.ai/essentials/http.md): Learn how to integrate with Enginy API using direct HTTP requests - [Custom CRM](https://docs.enginy.ai/essentials/custom-crm.md): Connect your custom CRM or internal system to Enginy - [White-label branding](https://docs.enginy.ai/essentials/white-label.md): Run Enginy under your own brand and domain for your customers - [Introduction](https://docs.enginy.ai/api-reference/introduction.md): Overview of Enginy public API authentication, scopes, and available endpoint groups - [Searching Contacts And Companies](https://docs.enginy.ai/api-reference/searching-contacts-companies.md): How to use `/v1/contacts/search` and `/v1/companies/search`, which filter keys matter most, and how to use the fields endpoints as the schema source of truth - [Contact and Company Tags](https://docs.enginy.ai/api-reference/contact-company-tags-guide.md): How to create tags, apply them to contacts and companies in bulk, and filter searches by tag - [Campaign Creation Guide](https://docs.enginy.ai/api-reference/campaigns-guide.md): How to structure POST /v1/campaigns requests with steps, branches, and task owners - [Identities Guide](https://docs.enginy.ai/api-reference/identities-guide.md): How to list identities and update identity profile fields and email signatures - [Rate Limits](https://docs.enginy.ai/api-reference/rate-limits.md): Understanding API rate limits and best practices for managing your requests - [Actions guide](https://docs.enginy.ai/api-reference/actions-guide.md): How to chain enrichments and other actions on contacts and companies through POST /v1/actions - [AI Variables](https://docs.enginy.ai/api-reference/ai-variables-guide.md): How to create, update, delete, and reference AI Variables through the Enginy OpenAPI - [AI Playbook](https://docs.enginy.ai/api-reference/ai-playbook-guide.md): Read and update the workspace AI Playbook through the Enginy OpenAPI, with additive write semantics that never remove anything you did not ask to remove - [Webhooks guide](https://docs.enginy.ai/api-reference/webhooks-guide.md): How to subscribe to real-time event notifications from your Enginy campaigns - [Workflows API Overview](https://docs.enginy.ai/api-reference/workflows-guide.md): The graph model behind the Workflows API — nodes, wiring, plans, triggers, drafts, runs, and limits. - [Workflows API Cookbook](https://docs.enginy.ai/api-reference/workflows-cookbook.md): Four complete, copy-pasteable workflow builds — linear, branching, webhook-triggered, and scheduled. - [Social Selling](https://docs.enginy.ai/api-reference/social-selling-guide.md): Find and measure the LinkedIn posts of your identities, inspect their media and comments, draft, preview and publish new posts, answer comments, and work the people who engage. - [List contact AI variable folders](https://docs.enginy.ai/api-reference/ai-variables/list-contact-ai-variable-folders.md): List contact AI variable folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create contact AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/create-contact-ai-variable-folder.md): Create a contact AI variable folder. Folder names must be unique per entity. - [Get contact AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/get-contact-ai-variable-folder.md): Get a contact AI variable folder with its child folders, AI variables, and breadcrumb ancestors. - [Delete contact AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/delete-contact-ai-variable-folder.md): Delete a contact AI variable folder. Items inside are moved to the parent folder. - [Update contact AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/update-contact-ai-variable-folder.md): Update a contact AI variable folder name or parent. Moving a folder into one of its descendants is not allowed. - [List company AI variable folders](https://docs.enginy.ai/api-reference/ai-variables/list-company-ai-variable-folders.md): List company AI variable folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create company AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/create-company-ai-variable-folder.md): Create a company AI variable folder. Folder names must be unique per entity. - [Get company AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/get-company-ai-variable-folder.md): Get a company AI variable folder with its child folders, AI variables, and breadcrumb ancestors. - [Delete company AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/delete-company-ai-variable-folder.md): Delete a company AI variable folder. Items inside are moved to the parent folder. - [Update company AI variable folder](https://docs.enginy.ai/api-reference/ai-variables/update-company-ai-variable-folder.md): Update a company AI variable folder name or parent. Moving a folder into one of its descendants is not allowed. - [List AI message folders](https://docs.enginy.ai/api-reference/ai-variables/list-ai-message-folders.md): List AI message folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create AI message folder](https://docs.enginy.ai/api-reference/ai-variables/create-ai-message-folder.md): Create a AI message folder. Folder names must be unique per entity. - [Get AI message folder](https://docs.enginy.ai/api-reference/ai-variables/get-ai-message-folder.md): Get a AI message folder with its child folders, AI variables, and breadcrumb ancestors. - [Delete AI message folder](https://docs.enginy.ai/api-reference/ai-variables/delete-ai-message-folder.md): Delete a AI message folder. Items inside are moved to the parent folder. - [Update AI message folder](https://docs.enginy.ai/api-reference/ai-variables/update-ai-message-folder.md): Update a AI message folder name or parent. Moving a folder into one of its descendants is not allowed. - [List AI snippet folders](https://docs.enginy.ai/api-reference/ai-variables/list-ai-snippet-folders.md): List AI snippet folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create AI snippet folder](https://docs.enginy.ai/api-reference/ai-variables/create-ai-snippet-folder.md): Create a AI snippet folder. Folder names must be unique per entity. - [Get AI snippet folder](https://docs.enginy.ai/api-reference/ai-variables/get-ai-snippet-folder.md): Get a AI snippet folder with its child folders, AI variables, and breadcrumb ancestors. - [Delete AI snippet folder](https://docs.enginy.ai/api-reference/ai-variables/delete-ai-snippet-folder.md): Delete a AI snippet folder. Items inside are moved to the parent folder. - [Update AI snippet folder](https://docs.enginy.ai/api-reference/ai-variables/update-ai-snippet-folder.md): Update a AI snippet folder name or parent. Moving a folder into one of its descendants is not allowed. - [List message template folders](https://docs.enginy.ai/api-reference/ai-variables/list-message-template-folders.md): List message template folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create message template folder](https://docs.enginy.ai/api-reference/ai-variables/create-message-template-folder.md): Create a message template folder. Folder names must be unique per entity. - [Get message template folder](https://docs.enginy.ai/api-reference/ai-variables/get-message-template-folder.md): Get a message template folder with its child folders, AI variables, and breadcrumb ancestors. - [Delete message template folder](https://docs.enginy.ai/api-reference/ai-variables/delete-message-template-folder.md): Delete a message template folder. Items inside are moved to the parent folder. - [Update message template folder](https://docs.enginy.ai/api-reference/ai-variables/update-message-template-folder.md): Update a message template folder name or parent. Moving a folder into one of its descendants is not allowed. - [List AI messages](https://docs.enginy.ai/api-reference/ai-variables/list-ai-messages.md): 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… - [Create an ai message](https://docs.enginy.ai/api-reference/ai-variables/create-an-ai-message.md): 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. - [List AI snippets](https://docs.enginy.ai/api-reference/ai-variables/list-ai-snippets.md): 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… - [Create an ai snippet](https://docs.enginy.ai/api-reference/ai-variables/create-an-ai-snippet.md): 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. - [List message templates](https://docs.enginy.ai/api-reference/ai-variables/list-message-templates.md): 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; othe… - [Create a message template](https://docs.enginy.ai/api-reference/ai-variables/create-a-message-template.md): 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. - [Get an ai message](https://docs.enginy.ai/api-reference/ai-variables/get-an-ai-message.md): 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… - [Delete an ai message](https://docs.enginy.ai/api-reference/ai-variables/delete-an-ai-message.md): 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. - [Update an ai message](https://docs.enginy.ai/api-reference/ai-variables/update-an-ai-message.md): 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. - [Get an ai snippet](https://docs.enginy.ai/api-reference/ai-variables/get-an-ai-snippet.md): 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… - [Delete an ai snippet](https://docs.enginy.ai/api-reference/ai-variables/delete-an-ai-snippet.md): 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. - [Update an ai snippet](https://docs.enginy.ai/api-reference/ai-variables/update-an-ai-snippet.md): 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. - [Get a message template](https://docs.enginy.ai/api-reference/ai-variables/get-a-message-template.md): 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; othe… - [Delete a message template](https://docs.enginy.ai/api-reference/ai-variables/delete-a-message-template.md): 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. - [Update a message template](https://docs.enginy.ai/api-reference/ai-variables/update-a-message-template.md): 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. - [List AI message tones](https://docs.enginy.ai/api-reference/ai-variables/list-ai-message-tones.md): 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. - [List AI variables](https://docs.enginy.ai/api-reference/ai-variables/list-ai-variables.md): 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`. - [Create an AI variable](https://docs.enginy.ai/api-reference/ai-variables/create-an-ai-variable.md): 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 `POS… - [Get an AI variable](https://docs.enginy.ai/api-reference/ai-variables/get-an-ai-variable.md): Retrieve a single AI variable (AI research) by ID. AI messages, AI snippets, and message templates are separate entities with their own endpoints. - [Delete an AI variable](https://docs.enginy.ai/api-reference/ai-variables/delete-an-ai-variable.md): Delete an AI variable (AI research) and its generated smart-field values. - [Update an AI variable](https://docs.enginy.ai/api-reference/ai-variables/update-an-ai-variable.md): 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. - [Get contact field metadata](https://docs.enginy.ai/api-reference/contacts/get-contact-field-metadata.md): 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 fi… - [Create a contact custom field](https://docs.enginy.ai/api-reference/contacts/create-a-contact-custom-field.md): 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. - [Get contacts](https://docs.enginy.ai/api-reference/contacts/get-contacts.md): Retrieve a paginated list of contacts. - [Search contacts with advanced filters](https://docs.enginy.ai/api-reference/contacts/search-contacts-with-advanced-filters.md): 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(… - [Get a single contact](https://docs.enginy.ai/api-reference/contacts/get-a-single-contact.md): Retrieve a single contact by ID. - [Delete a contact](https://docs.enginy.ai/api-reference/contacts/delete-a-contact.md): Soft delete a contact by ID and remove it from contact lists. - [Update contact fields](https://docs.enginy.ai/api-reference/contacts/update-contact-fields.md): 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 `contactCountr… - [Create a new contact](https://docs.enginy.ai/api-reference/contacts/create-a-new-contact.md): 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 mat… - [Bulk create contacts](https://docs.enginy.ai/api-reference/contacts/bulk-create-contacts.md): 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 `summa… - [Get contact tags](https://docs.enginy.ai/api-reference/contacts/get-contact-tags.md): List the workspace's contact tags (id, name, colour), ordered by name. Contact tags and company tags are separate pools. Use these ids with `POST /v1/contacts/tags/add`, `POST /v1/contacts/tags/remove` and the `contactTags` filter of `POST /v1/contacts/search`; every contact response also carries it… - [Create a contact tag](https://docs.enginy.ai/api-reference/contacts/create-a-contact-tag.md): 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 contac… - [Delete a contact tag](https://docs.enginy.ai/api-reference/contacts/delete-a-contact-tag.md): Delete a contact tag and remove it from every contact that carries it. This cannot be undone. 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. - [Update a contact tag](https://docs.enginy.ai/api-reference/contacts/update-a-contact-tag.md): Rename and/or recolour a contact tag; every contact carrying it shows the change. Renaming onto another tag's name returns 409. 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 retr… - [Add tags to contacts](https://docs.enginy.ai/api-reference/contacts/add-tags-to-contacts.md): 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 ca… - [Remove tags from contacts](https://docs.enginy.ai/api-reference/contacts/remove-tags-from-contacts.md): Remove tags from contacts in bulk: exactly the (contact, tag) pairs named by `contactIds` × `tagIds`; their other tags stay. Any contact or tag id outside the workspace rejects the whole call with 404. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 wi… - [Find duplicate contacts](https://docs.enginy.ai/api-reference/contacts/find-duplicate-contacts.md): 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` grou… - [Get company field metadata](https://docs.enginy.ai/api-reference/companies/get-company-field-metadata.md): 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… - [Create a new company](https://docs.enginy.ai/api-reference/companies/create-a-new-company.md): 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. - [Bulk create companies](https://docs.enginy.ai/api-reference/companies/bulk-create-companies.md): 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… - [Get companies](https://docs.enginy.ai/api-reference/companies/get-companies.md): Retrieve a paginated list of companies. - [Search companies with advanced filters](https://docs.enginy.ai/api-reference/companies/search-companies-with-advanced-filters.md): 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) ins… - [Get a single company](https://docs.enginy.ai/api-reference/companies/get-a-single-company.md): Retrieve a single company by ID. - [Delete a company](https://docs.enginy.ai/api-reference/companies/delete-a-company.md): Soft delete a company by ID, remove it from company lists, and unassign its active contacts. - [Update company fields](https://docs.enginy.ai/api-reference/companies/update-company-fields.md): Update company fields (standard and custom/AI fields by name). - [Get company tags](https://docs.enginy.ai/api-reference/companies/get-company-tags.md): List the workspace's company tags (id, name, colour), ordered by name. Company tags and contact tags are separate pools. Use these ids with `POST /v1/companies/tags/add`, `POST /v1/companies/tags/remove` and the `companyTags` filter of `POST /v1/companies/search`; every company response also carries… - [Create a company tag](https://docs.enginy.ai/api-reference/companies/create-a-company-tag.md): 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 conta… - [Delete a company tag](https://docs.enginy.ai/api-reference/companies/delete-a-company-tag.md): Delete a company tag and remove it from every company that carries it. This cannot be undone. 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. - [Update a company tag](https://docs.enginy.ai/api-reference/companies/update-a-company-tag.md): Rename and/or recolour a company tag; every company carrying it shows the change. Renaming onto another tag's name returns 409. 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 retr… - [Add tags to companies](https://docs.enginy.ai/api-reference/companies/add-tags-to-companies.md): 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… - [Remove tags from companies](https://docs.enginy.ai/api-reference/companies/remove-tags-from-companies.md): Remove tags from companies in bulk: exactly the (company, tag) pairs named by `companyIds` × `tagIds`; their other tags stay. Any company or tag id outside the workspace rejects the whole call with 404. Requires contact and company tags on the workspace: without them every tag endpoint answers 400 w… - [Find duplicate companies](https://docs.enginy.ai/api-reference/companies/find-duplicate-companies.md): Find groups of duplicate companies: live companies of your workspace that share the same normalized value of ALL the `fields` you pick (1 to 6 of `domain`, `website`, `companyLinkedInUrl`, `companyUrn`, `companyCRMId`, `name`; AND: `fields=name,domain` groups only companies with the same name AND th… - [Preview an AI Finder search](https://docs.enginy.ai/api-reference/ai-finder/preview-an-ai-finder-search.md): **What it does.** Takes either a natural-language query (e.g. *"VP of Finance at Series B SaaS companies in California"*) or a saved filter ID and returns a `previewId`. Text queries run through AI Finder to generate provider-specific filters; saved filters are loaded directly into the preview cache… - [Refine an AI Finder preview](https://docs.enginy.ai/api-reference/ai-finder/refine-an-ai-finder-preview.md): **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 p… - [Import an AI Finder preview](https://docs.enginy.ai/api-reference/ai-finder/import-an-ai-finder-preview.md): **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. - [Fetch results from an AI Finder preview](https://docs.enginy.ai/api-reference/ai-finder/fetch-results-from-an-ai-finder-preview.md): **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. - [Get AI playbook](https://docs.enginy.ai/api-reference/ai-playbook/get-ai-playbook.md): Retrieve the company AI playbook for the workspace, including company context, products, ICPs, competitors, testimonials, FAQs, and ideal companies. - [Update AI playbook](https://docs.enginy.ai/api-reference/ai-playbook/update-ai-playbook.md): Update the company AI playbook for the workspace. - [Get identities](https://docs.enginy.ai/api-reference/identities/get-identities.md): Retrieve a paginated list of the active identities, the ones that can send. 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… - [Get identity performance metrics](https://docs.enginy.ai/api-reference/identities/get-identity-performance-metrics.md): Retrieve identity performance metrics for a date range. - [Update identity](https://docs.enginy.ai/api-reference/identities/update-identity.md): Update public identity profile fields and email signature HTML. - [Get identity mailboxes](https://docs.enginy.ai/api-reference/identities/get-identity-mailboxes.md): Retrieve all configured mailboxes for a specific identity. - [Create or update an identity mailbox](https://docs.enginy.ai/api-reference/identities/create-or-update-an-identity-mailbox.md): 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. - [List campaign folders](https://docs.enginy.ai/api-reference/campaigns/list-campaign-folders.md): List campaign folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create campaign folder](https://docs.enginy.ai/api-reference/campaigns/create-campaign-folder.md): Create a campaign folder. Folder names must be unique within the same parent folder. - [Get campaign folder](https://docs.enginy.ai/api-reference/campaigns/get-campaign-folder.md): Get a campaign folder with its child folders, campaigns, and breadcrumb ancestors. - [Delete campaign folder](https://docs.enginy.ai/api-reference/campaigns/delete-campaign-folder.md): Delete a campaign folder. Descendant folders are deleted too. Campaigns inside the deleted folders are not deleted; they are unassigned from the folder hierarchy. - [Update campaign folder](https://docs.enginy.ai/api-reference/campaigns/update-campaign-folder.md): Update a campaign folder name or parent. Moving a folder into one of its descendants is not allowed. - [Get campaigns](https://docs.enginy.ai/api-reference/campaigns/get-campaigns.md): Retrieve a paginated list of campaigns. - [Create campaign](https://docs.enginy.ai/api-reference/campaigns/create-campaign.md): 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. - [Validate campaign](https://docs.enginy.ai/api-reference/campaigns/validate-campaign.md): 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. - [Get a single campaign](https://docs.enginy.ai/api-reference/campaigns/get-a-single-campaign.md): 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. - [Update a draft campaign](https://docs.enginy.ai/api-reference/campaigns/update-a-draft-campaign.md): 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. Ric… - [Validate campaign draft](https://docs.enginy.ai/api-reference/campaigns/validate-campaign-draft.md): 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. - [Get campaign analytics](https://docs.enginy.ai/api-reference/campaigns/get-campaign-analytics.md): Retrieve overall and daily analytics for a specific campaign. - [Clone a campaign](https://docs.enginy.ai/api-reference/campaigns/clone-a-campaign.md): 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 sende… - [Update campaign status](https://docs.enginy.ai/api-reference/campaigns/update-campaign-status.md): Update campaign status to DRAFT, PENDING, ACTIVE, COMPLETED, or DELETED. Setting status to ACTIVE launches the campaign: it assigns identities and emails to conversations and starts sending. To stop a campaign sending, set status to PENDING. GET /v1/campaign/{campaignId} and GET /v1/campaigns report… - [Add a contact to a campaign](https://docs.enginy.ai/api-reference/campaigns/add-a-contact-to-a-campaign.md): Creates a new conversation by adding a contact to a campaign. - [Add a contact group to a campaign](https://docs.enginy.ai/api-reference/campaigns/add-a-contact-group-to-a-campaign.md): Creates new conversations by adding every contact in a contact group to a campaign. - [Pause a contact in a campaign](https://docs.enginy.ai/api-reference/campaigns/pause-a-contact-in-a-campaign.md): Pauses an active conversation in a campaign. - [Get conversations analytics](https://docs.enginy.ai/api-reference/campaigns/get-conversations-analytics.md): Retrieve row conversation analytics data with contact and campaign information. - [Get conversation messages](https://docs.enginy.ai/api-reference/campaigns/get-conversation-messages.md): Retrieve all messages for a specific conversation. - [Get task owners](https://docs.enginy.ai/api-reference/tasks/get-task-owners.md): Retrieve CRM owners for task assignment in campaign task steps. - [Get tasks](https://docs.enginy.ai/api-reference/tasks/get-tasks.md): Retrieve a paginated list of tasks. The task text is in `description`; `notes` is legacy and holds call notes, or the text of older tasks whose `description` is empty. - [Create task](https://docs.enginy.ai/api-reference/tasks/create-task.md): 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. - [Delete tasks](https://docs.enginy.ai/api-reference/tasks/delete-tasks.md): Delete tasks in bulk. - [Get task IDs](https://docs.enginy.ai/api-reference/tasks/get-task-ids.md): Retrieve task IDs that match the provided filters. - [Get task status counts](https://docs.enginy.ai/api-reference/tasks/get-task-status-counts.md): Retrieve counts for key task status buckets. - [Get task pending count](https://docs.enginy.ai/api-reference/tasks/get-task-pending-count.md): Retrieve the current pending task count. - [Update task](https://docs.enginy.ai/api-reference/tasks/update-task.md): Update an existing task. 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, and a notes-only update never replaces an existing descript… - [Complete task](https://docs.enginy.ai/api-reference/tasks/complete-task.md): Mark a task as completed. - [Complete tasks batch](https://docs.enginy.ai/api-reference/tasks/complete-tasks-batch.md): Mark multiple tasks as completed. - [Set skipped tasks](https://docs.enginy.ai/api-reference/tasks/set-skipped-tasks.md): Set or clear the skipped state for tasks. - [Get voices](https://docs.enginy.ai/api-reference/voices/get-voices.md): Retrieve available voices for `linkedin_voice_message` campaign steps. - [List folders](https://docs.enginy.ai/api-reference/lists/list-folders.md): Retrieve a paginated list of list folders across both contacts and companies. This preserves the legacy contract and adds campaign-specific folder endpoints separately. - [List contact list folders](https://docs.enginy.ai/api-reference/lists/list-contact-list-folders.md): List contact list folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create contact list folder](https://docs.enginy.ai/api-reference/lists/create-contact-list-folder.md): Create a contact list folder. Folder names must be unique within the same parent folder. - [Get contact list folder](https://docs.enginy.ai/api-reference/lists/get-contact-list-folder.md): Get a contact list folder with its child folders, lists, and breadcrumb ancestors. - [Delete contact list folder](https://docs.enginy.ai/api-reference/lists/delete-contact-list-folder.md): 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. - [Update contact list folder](https://docs.enginy.ai/api-reference/lists/update-contact-list-folder.md): Update a contact list folder name or parent. Moving a folder into one of its descendants is not allowed. - [List company list folders](https://docs.enginy.ai/api-reference/lists/list-company-list-folders.md): List company list folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too. - [Create company list folder](https://docs.enginy.ai/api-reference/lists/create-company-list-folder.md): Create a company list folder. Folder names must be unique within the same parent folder. - [Get company list folder](https://docs.enginy.ai/api-reference/lists/get-company-list-folder.md): Get a company list folder with its child folders, lists, and breadcrumb ancestors. - [Delete company list folder](https://docs.enginy.ai/api-reference/lists/delete-company-list-folder.md): 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. - [Update company list folder](https://docs.enginy.ai/api-reference/lists/update-company-list-folder.md): Update a company list folder name or parent. Moving a folder into one of its descendants is not allowed. - [Get lists](https://docs.enginy.ai/api-reference/lists/get-lists.md): 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. - [Create a list](https://docs.enginy.ai/api-reference/lists/create-a-list.md): 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. - [Delete a list](https://docs.enginy.ai/api-reference/lists/delete-a-list.md): 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… - [Import a list from AI Finder](https://docs.enginy.ai/api-reference/lists/import-a-list-from-ai-finder.md): 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/… - [Add contacts to a list](https://docs.enginy.ai/api-reference/lists/add-contacts-to-a-list.md): Add contacts to a list. - [Remove contacts from a list](https://docs.enginy.ai/api-reference/lists/remove-contacts-from-a-list.md): Remove contacts from a list. - [Move contacts between lists](https://docs.enginy.ai/api-reference/lists/move-contacts-between-lists.md): Move contacts between lists. - [Add companies to a list](https://docs.enginy.ai/api-reference/lists/add-companies-to-a-list.md): Add companies to a list. - [Remove companies from a list](https://docs.enginy.ai/api-reference/lists/remove-companies-from-a-list.md): Remove companies from a list. - [Move companies between lists](https://docs.enginy.ai/api-reference/lists/move-companies-between-lists.md): Move companies between lists. - [Get saved filters](https://docs.enginy.ai/api-reference/saved-filters/get-saved-filters.md): 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. - [Create a saved filter](https://docs.enginy.ai/api-reference/saved-filters/create-a-saved-filter.md): Create a saved AI Finder filter for later reuse. Filters are provider-aware and can be loaded directly into preview creation via `savedFilterId`. - [Delete a saved filter](https://docs.enginy.ai/api-reference/saved-filters/delete-a-saved-filter.md): 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 te… - [Get saved views](https://docs.enginy.ai/api-reference/saved-views/get-saved-views.md): Retrieve a paginated list of saved table views (contacts and companies). - [Get saved view](https://docs.enginy.ai/api-reference/saved-views/get-saved-view.md): Retrieve a single saved view by ID. - [Get credit balance](https://docs.enginy.ai/api-reference/credits/get-credit-balance.md): 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 >… - [Get credit pricing](https://docs.enginy.ai/api-reference/credits/get-credit-pricing.md): Retrieve credit costs for all available actions. - [Get credit statement](https://docs.enginy.ai/api-reference/credits/get-credit-statement.md): The Credits page statement: one line per spend context inside a date window — an enrichment or import activity (`process`), an advanced-workflow run (`run`), the AI messages of a campaign (`campaign`), a top-up or plan movement (`topup`) or a charge with no linkable context (`single`) — with its sig… - [Get credit transactions](https://docs.enginy.ai/api-reference/credits/get-credit-transactions.md): The credit transaction log: every ledger transaction in a date window, or of one statement line (`groupKey`), newest first, with its signed amount, credit type, timestamp, the user who triggered it, the contact or company it was for and the statement context it belongs to (activity, advanced-workflo… - [Start an actions run](https://docs.enginy.ai/api-reference/actions/start-an-actions-run.md): Creates an actions run to execute one or more workflow actions on contacts, companies, or lists. Supports optional webhook notifications when actions complete. See the "Actions Completed Webhook" in the Webhooks section for the webhook payload structure and implementation details. - [Get actions run status](https://docs.enginy.ai/api-reference/actions/get-actions-run-status.md): 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 × a… - [List inbox threads](https://docs.enginy.ai/api-reference/inbox/list-inbox-threads.md): List inbox threads grouped by contact. - [Get inbox contact messages](https://docs.enginy.ai/api-reference/inbox/get-inbox-contact-messages.md): Return the flattened inbox message history for a contact. - [Build inbox link](https://docs.enginy.ai/api-reference/inbox/build-inbox-link.md): Build a deep-link URL into the user's /inbox view with the given filters applied. - [List inbox tags](https://docs.enginy.ai/api-reference/inbox/list-inbox-tags.md): List the tags that can be applied to inbox threads. - [Create inbox tag](https://docs.enginy.ai/api-reference/inbox/create-inbox-tag.md): Create a reusable inbox tag. - [Get inbox tag](https://docs.enginy.ai/api-reference/inbox/get-inbox-tag.md): Retrieve one inbox tag by ID. - [Attach inbox tags to a contact thread](https://docs.enginy.ai/api-reference/inbox/attach-inbox-tags-to-a-contact-thread.md): Attach one or more tags to a contact thread. - [Remove inbox tags from a contact thread](https://docs.enginy.ai/api-reference/inbox/remove-inbox-tags-from-a-contact-thread.md): Remove one or more tags from a contact thread. - [Archive inbox contact thread](https://docs.enginy.ai/api-reference/inbox/archive-inbox-contact-thread.md): Archive one inbox contact thread. - [Unarchive inbox contact thread](https://docs.enginy.ai/api-reference/inbox/unarchive-inbox-contact-thread.md): Unarchive one inbox contact thread. - [Mark inbox contact thread as read](https://docs.enginy.ai/api-reference/inbox/mark-inbox-contact-thread-as-read.md): Mark one inbox contact thread as read. - [Send inbox message](https://docs.enginy.ai/api-reference/inbox/send-inbox-message.md): Send a manual inbox reply through Enginy conversation routing. - [List webhook subscriptions](https://docs.enginy.ai/api-reference/webhooks/list-webhook-subscriptions.md): Retrieve a paginated list of webhook subscriptions. - [Create webhook subscription](https://docs.enginy.ai/api-reference/webhooks/create-webhook-subscription.md): Create a new webhook subscription. - [Get webhook subscription](https://docs.enginy.ai/api-reference/webhooks/get-webhook-subscription.md): Retrieve a single webhook by ID. - [Delete webhook subscription](https://docs.enginy.ai/api-reference/webhooks/delete-webhook-subscription.md): Delete a webhook subscription. - [Update webhook subscription](https://docs.enginy.ai/api-reference/webhooks/update-webhook-subscription.md): Update a webhook subscription. - [Get webhook delivery logs](https://docs.enginy.ai/api-reference/webhooks/get-webhook-delivery-logs.md): Retrieve delivery logs for a webhook. - [Test webhook subscription](https://docs.enginy.ai/api-reference/webhooks/test-webhook-subscription.md): Send a test event to a webhook. - [Actions completed webhook](https://docs.enginy.ai/api-reference/webhooks/actions-completed-webhook.md): This webhook is triggered when an action run completes. You can provide your webhook URL when creating an actions run via the `/v1/actions` endpoint. - [Conversation events webhook](https://docs.enginy.ai/api-reference/webhooks/conversation-events-webhook.md): This webhook is triggered when subscribed conversation events occur. You can create webhook subscriptions via the `/v1/webhooks` endpoint to receive these events. - [List blocklist entries](https://docs.enginy.ai/api-reference/blocklist/list-blocklist-entries.md): Retrieve a paginated list of blocklist entries (blocked emails, LinkedIn URLs, domains, and company LinkedIn URLs). - [Add blocklist entries by value](https://docs.enginy.ai/api-reference/blocklist/add-blocklist-entries-by-value.md): 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 co… - [Block contacts or companies by ID](https://docs.enginy.ai/api-reference/blocklist/block-contacts-or-companies-by-id.md): 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.… - [Delete a blocklist entry](https://docs.enginy.ai/api-reference/blocklist/delete-a-blocklist-entry.md): Delete a single blocklist entry by ID. - [Update a blocklist entry](https://docs.enginy.ai/api-reference/blocklist/update-a-blocklist-entry.md): 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`). - [Delete blocklist entries in bulk](https://docs.enginy.ai/api-reference/blocklist/delete-blocklist-entries-in-bulk.md): Delete multiple blocklist entries by ID in a single request. - [List Social Selling posts](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-posts.md): Search and rank the LinkedIn posts Social Selling tracks for your identities (the whole workspace by default, within the identities you may see), with their latest LinkedIn metrics (impressions, reactions by type, comments, reposts) and Enginy engagement counters (engaged accounts, new engagers). Fi… - [Track a Social Selling post](https://docs.enginy.ai/api-reference/social-selling/track-a-social-selling-post.md): Start tracking a published LinkedIn post in Enginy by its URL (`linkedin.com/posts/…`, `lnkd.in/…` or `linkedin.com/feed/update/urn:li:activity:`). Idempotent per post: any URL of a post Enginy already knows returns that same post. Answers `publishingPostId`, the id the comment and comment-sugge… - [Get a Social Selling post](https://docs.enginy.ai/api-reference/social-selling/get-a-social-selling-post.md): Get one tracked Social Selling post with its latest metrics and engagement counters. - [Add reactions to a Social Selling post](https://docs.enginy.ai/api-reference/social-selling/add-reactions-to-a-social-selling-post.md): Schedule automatic reactions on a tracked post from your connected LinkedIn identities. Pass `amount` to draw from the identities allowed to react in this workspace, or `identityIds` to react from specific identities. Reactions are spread over time and never come from the post author unless `skipAut… - [Get Social Selling best publishing times](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-best-publishing-times.md): Find the best weekday and hour to publish on LinkedIn, learned from the caller’s own tracked Social Selling posts. Each post counts in the weekday/hour it was published in `timeZone`, and slots are ranked by the average `metric` per measured post (`engagement` = reactions + comments by default). Ret… - [Get Social Selling overview](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-overview.md): Summarize LinkedIn performance of the caller’s Social Selling identities over a date range: posts published, impressions, reactions, comments, people reached and new people reached, compared with the previous period of the same length (`previousPeriod`, `changePct`), plus per-identity impressions, r… - [List Social Selling identity performance](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-identity-performance.md): Rank the caller’s Social Selling identities (LinkedIn profiles) by performance over a date range: posts, impressions, reactions, comments, people reached and new people reached per identity, highest `sort` metric first. Same rows as the identities table of the Social Selling Overview page. Defaults… - [List Social Selling engagers](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-engagers.md): List the people (engagers) who reacted to or commented on LinkedIn posts the caller’s Social Selling identities published in a date range — the Prospects page of Social Selling. Each row has the engager’s profile, whether they are already an Enginy contact (`contactStatus`: NEW, IN_CRM, CONTACTED; `… - [List Social Selling post engagers](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-post-engagers.md): List who engaged with one tracked LinkedIn post: one row per person with whether they reacted (and how), whether they commented (with the comment text) and whether they are already an Enginy contact (`contactStatus`, `contactId`). `postId` is the tracked post id from `list_social_selling_posts` (not… - [Preview Social Selling engager export](https://docs.enginy.ai/api-reference/social-selling/preview-social-selling-engager-export.md): Preview exporting Social Selling engagers (people who reacted to or commented on the caller’s tracked LinkedIn posts) to a contacts list, without creating anything. Select engagers with `prospectIds` (from the engagers lists), with `postId` (a tracked post id, not `publishingPostId`), or with `dateF… - [Export Social Selling engagers to a list](https://docs.enginy.ai/api-reference/social-selling/export-social-selling-engagers-to-a-list.md): Export Social Selling engagers (people who reacted to or commented on the caller’s tracked LinkedIn posts) into a contacts list: a new one (`target.listName`) or an existing one (`target.listId`). Select engagers with `prospectIds` (from the engagers lists), with `postId` (a tracked post id, not `pu… - [Add a comment to a Social Selling post](https://docs.enginy.ai/api-reference/social-selling/add-a-comment-to-a-social-selling-post.md): Post a LinkedIn comment on a Social Selling post from one of your connected identities. Name the post with exactly one of `postId` (tracked post id, the `id` of `list_social_selling_posts`) or `publishingPostId` (its `publishingPostId`, or a scheduled post’s id). The post must already be published o… - [Generate Social Selling comment suggestions](https://docs.enginy.ai/api-reference/social-selling/generate-social-selling-comment-suggestions.md): Write AI comment suggestions for a LinkedIn post, each one from a different identity of your team, in that identity’s voice (job title, seniority, interests) and in the language of the post. Pass exactly one post source: `postId` (a tracked post id from the Social Selling posts list), `publishingPos… - [List scheduled Social Selling posts](https://docs.enginy.ai/api-reference/social-selling/list-scheduled-social-selling-posts.md): List the Social Selling posts waiting to be published from the caller’s identities, soonest first, in a publish-time window (default: now to 90 days ahead). Each row has the post text, the publishing identity, the live publish time (`scheduledAt`; null when its schedule is gone and it will not publi… - [Schedule a Social Selling post](https://docs.enginy.ai/api-reference/social-selling/schedule-a-social-selling-post.md): Schedule a plain-text LinkedIn post: Enginy publishes it at `scheduledAt` from the LinkedIn account of `identityId` (an identity the caller may use), optionally followed by `reactionsAmount` reactions from the workspace’s identity pool. The identity’s owner receives a confirmation email. Text only:… - [Cancel a scheduled Social Selling post](https://docs.enginy.ai/api-reference/social-selling/cancel-a-scheduled-social-selling-post.md): 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… - [List Social Selling post comments](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-post-comments.md): List the comment threads of a tracked Social Selling post: top-level comments oldest first with their replies nested (LinkedIn threads are one level deep), each with stable ids (`commentId`, LinkedIn `commentUrn`, `parentCommentId`), the author (profile link, whether they are one of your identities… - [Sync Social Selling post comments](https://docs.enginy.ai/api-reference/social-selling/sync-social-selling-post-comments.md): Read a tracked post’s metrics and comment threads from LinkedIn now, through the identity that owns the post, and wait for it (up to about a minute). Comments are read at most once every 10 minutes per post: `commentsRead: false` means they were not read this time, because the last read is that rece… - [Reply to a Social Selling comment](https://docs.enginy.ai/api-reference/social-selling/reply-to-a-social-selling-comment.md): Reply on LinkedIn to one comment of a tracked post, from one of your identities (usually the post author). The reply is posted under the comment’s thread (a reply to a reply goes under the same top-level comment, as on LinkedIn) and never as a separate top-level comment. Same rules as any comment: t… - [Get Social Selling comment status](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-comment-status.md): Where a comment or reply made through Enginy stands, by the `scheduledCommentId` the comment and reply tools return: `QUEUED` (dispatched, not confirmed yet), `PENDING_APPROVAL` (waits for the identity owner), `POSTED` (live on LinkedIn, with `commentUrn` and `threadUrl`), `REJECTED` (the owner refu… - [Delete a Social Selling comment](https://docs.enginy.ai/api-reference/social-selling/delete-a-social-selling-comment.md): Delete on LinkedIn a comment or reply that Enginy posted (`status: POSTED`), as in the identity activity audit: only the identity owner or a workspace admin may, and Enginy waits for LinkedIn before recording it. Comments written outside Enginy cannot be deleted here, and editing a posted comment is… - [List Social Selling reply queue](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-reply-queue.md): The workspace reply queue: top-level comments that other people (not your identities, not blocklisted people) left on your identities’ posts and that the post’s identity has not answered, newest first, each with its post. A comment leaves the queue when the author’s reply appears in a later read of… - [Claim a Social Selling comment](https://docs.enginy.ai/api-reference/social-selling/claim-a-social-selling-comment.md): 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, ne… - [Resolve a Social Selling comment](https://docs.enginy.ai/api-reference/social-selling/resolve-a-social-selling-comment.md): Close or release a reply queue comment: `REPLIED` / `HANDLED_ELSEWHERE` → RESOLVED, `DISMISSED` → DISMISSED (needs no answer), `RELEASE` → OPEN again (gives back your claim). Idempotent: closing an already closed comment answers its current state. 409 COMMENT_CLAIMED when someone else holds it. Only… - [Get Social Selling post performance](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-post-performance.md): Measure one tracked LinkedIn post: its recorded daily history (lifetime counters and daily changes, with baseline imports flagged and never counted as growth), its first-day and first-week totals when a daily snapshot really answers them (`availability` says why otherwise; no hourly data is collecte… - [Get Social Selling post outcomes](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-post-outcomes.md): What happened with the people who engaged with one tracked post: for each external engager (blocklisted people excluded from rows and counts, teammates counted apart), whether they are an Enginy contact you may see, and the touchpoints that followed their first interaction within `windowDays` — firs… - [Get Social Selling capabilities](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-capabilities.md): What you can do in Social Selling and why not when you cannot. Per identity you may see: LinkedIn connection health (expired session, LinkedIn restriction, sync state, creator analytics), the owner’s consent to colleagues commenting, reposting, saving or reacting, and each action’s status — AVAILABL… - [Get Social Selling post content](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-post-content.md): Everything a tracked post shows, to inspect or reuse it: the text and its links, structured mentions (posts published through Enginy), the reposted original, the author’s first comment (where a "link in the first comment" lives) and every image, video or document in post order. Each media item has a… - [Get a Social Selling media asset](https://docs.enginy.ai/api-reference/social-selling/get-a-social-selling-media-asset.md): One media asset by `assetId` (a post’s media or an upload) with a probed download URL, size, type and dimensions. Access is re-checked on every call against the caller’s workspace and identities. Read-only. - [Refresh Social Selling media access](https://docs.enginy.ai/api-reference/social-selling/refresh-social-selling-media-access.md): Makes a media asset’s download URL durable: a LinkedIn URL that is still valid is copied to Enginy’s storage and the post points at the copy (`COPIED`); an expired one starts a LinkedIn re-read of the author’s posts (`POST_REFRESH_REQUESTED`, call again in a few minutes); a durable URL or an upload… - [Create a Social Selling media upload](https://docs.enginy.ai/api-reference/social-selling/create-a-social-selling-media-upload.md): 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,… - [Complete a Social Selling media upload](https://docs.enginy.ai/api-reference/social-selling/complete-a-social-selling-media-upload.md): 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. - [List Social Selling drafts](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-drafts.md): Lists the workspace’s drafts (newest change first) for the identities the caller may use, filterable by identity, status, series, pillar and source post. Archived drafts are hidden unless asked for. Read-only. - [Create a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/create-a-social-selling-draft.md): 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… - [Get a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/get-a-social-selling-draft.md): One draft with its current version, media, lineage, planning and schedule. Read-only. - [Archive a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/archive-a-social-selling-draft.md): Archives a draft that is not scheduled (hidden from lists and the calendar). Idempotent. Nothing on LinkedIn is touched. - [Update a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/update-a-social-selling-draft.md): Edits a draft: send `expectedVersion` (the version you read) and only the fields to change; the version is bumped. Never overwrites a newer version (409 `VERSION_CONFLICT` with `currentVersion`) or a scheduled draft (409: unschedule it first). Editing a FAILED or CANCELLED draft makes it a DRAFT aga… - [Duplicate a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/duplicate-a-social-selling-draft.md): Copies a draft into a new DRAFT (version 1) for the same or another identity the caller may use, keeping the content, media assets, planning fields and lineage (`sourceDraftId`). Never schedules or publishes anything. - [Reuse a Social Selling post as a draft](https://docs.enginy.ai/api-reference/social-selling/reuse-a-social-selling-post-as-a-draft.md): Starts a draft for an identity from a tracked post (yours or a teammate’s): its text (or your adapted `text`), its media copied into the workspace (each copy keeps the source post and credit), and an attribution (default: the source author and URL). The source post is never modified and nothing is p… - [Preview a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/preview-a-social-selling-draft.md): Exactly what would be published for the draft’s current `version`: who it posts as (person or page), the text as readers see it (mentions as @Label, links, the "see more" fold), each media file with a probed download URL, the first comment and whether the identity’s owner must approve it, visibility… - [Schedule a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/schedule-a-social-selling-draft.md): Schedules exactly the approved `version` of a draft at `scheduledAt` (ISO instant), at `localDateTime` in `timezone` (IANA, daylight-saving aware), or with `publishNow` (about a minute from now). The draft is locked to that version first (a concurrent edit or second schedule answers 409), then publi… - [Reschedule a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/reschedule-a-social-selling-draft.md): Moves a scheduled draft to a new time: unschedules it and schedules its current version again (a new `publishingPostId`). Refused once publishing has started. If the new schedule fails, the draft stays an unscheduled DRAFT and the error says so (`details.draftUnscheduled`). - [Unschedule a Social Selling draft](https://docs.enginy.ai/api-reference/social-selling/unschedule-a-social-selling-draft.md): Stops a scheduled draft’s publication and makes it a DRAFT again (same version). Refused (409 `PUBLICATION_STARTED`, with the publication) once publishing started or finished: nothing on LinkedIn is touched. - [Get Social Selling publication status](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-publication-status.md): The recorded outcome of a scheduled or published post: SCHEDULED, PUBLISHING, PUBLISHED (with the live LinkedIn URL and URN), FAILED (with the error), UNCERTAIN (the provider call ended without a readable answer, or the publish time passed with no outcome: check the identity’s feed before any retry)… - [Get Social Selling content calendar](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-content-calendar.md): The shared content calendar for a window of up to 92 days: scheduled and published posts and drafts of the identities the caller may use, with conflicts worth a human look — CADENCE (one identity posting twice within `minGapHours`, default 20), DUPLICATE_SOURCE (one source post reused by several ide… - [List Social Selling events](https://docs.enginy.ai/api-reference/social-selling/list-social-selling-events.md): The Social Selling event log, oldest first after a cursor: PUBLICATION_SUCCEEDED / PUBLICATION_FAILED (a scheduled post’s outcome), COMMENT_RECEIVED / REPLY_RECEIVED / MENTION_RECEIVED (new comments seen by a sync), METRICS_REFRESHED. Store `nextCursor` and pass it as `after` next time: each event c… - [Get Social Selling sync status](https://docs.enginy.ai/api-reference/social-selling/get-social-selling-sync-status.md): How fresh each identity’s Social Selling data is: the daily sync cadence and next run, and per identity its status (READY, QUEUED, SYNCING, SYNCED, FAILED, NEEDS_ATTENTION, PAUSED), the issue that needs attention, the last attempt and last success, and whether it can be synced now. Use it to know ho… - [Sync a Social Selling identity](https://docs.enginy.ai/api-reference/social-selling/sync-a-social-selling-identity.md): Starts a LinkedIn re-read of one identity’s posts now: new posts become tracked posts (with their media, metrics, engagers and comment threads), so a post just published through Enginy gets its `trackedPostId`. Asynchronous (minutes); answers `alreadyRunning` when a sync is already queued or running… - [Get workflow blocks](https://docs.enginy.ai/api-reference/workflows/get-workflow-blocks.md): List the block types this workspace can use to build a workflow `plan`, the same steps the workflow builder's step picker offers. Each block is a workflow step; use its `id` as a plan node's `blockId` and configure its inputs (discover them with `GET /v1/workflows/blocks/{blockId}`). Blocks the work… - [Get workflow block inputs](https://docs.enginy.ai/api-reference/workflows/get-workflow-block-inputs.md): Describe a block's configurable inputs — key, required, default, description, value shape, and how to resolve the value. `resolution.tools` lists the public tools/endpoints that can source an input's value; tools with no public equivalent are flagged. Put resolved values in a plan node's `inputs`; d… - [Get workflow condition fields](https://docs.enginy.ai/api-reference/workflows/get-workflow-condition-fields.md): List the operators and built-in lead/company fields available for CONDITIONAL plan nodes, including engagement, LinkedIn, CRM, platform, activity, and run-context fields. Each field includes its compatible operator ids and fixed value options when applicable. A condition `field` may also be an AI-va… - [Get workflow import inputs](https://docs.enginy.ai/api-reference/workflows/get-workflow-import-inputs.md): Convert an AI Finder preview into the exact blockId and inputs for a workflow import source. First call preview_an_ai_finder_search with the target audience and provider, or reuse its latest previewId. Pass the number to import on each workflow run as maxCount. LinkedIn people/company searches retur… - [Get workflows](https://docs.enginy.ai/api-reference/workflows/get-workflows.md): List advanced (graph) workflows the API key can access, paginated. Filter by name search, trigger type, or published state. - [Create workflow](https://docs.enginy.ai/api-reference/workflows/create-workflow.md): Create a workflow from a `plan`. Creates a draft by default; set `publish: true` to publish immediately (strict validation applies). - [List workflow folders](https://docs.enginy.ai/api-reference/workflows/list-workflow-folders.md): List workflow folders. By default this returns only root folders. Use `includeChildren=true` to return nested folders too, and `includeRecursiveCounts=true` for cumulative subfolder/workflow totals. - [Create workflow folder](https://docs.enginy.ai/api-reference/workflows/create-workflow-folder.md): Create a workflow folder. Folder names must be unique within the same parent folder. - [Delete workflow folder](https://docs.enginy.ai/api-reference/workflows/delete-workflow-folder.md): Delete a workflow folder. Workflows inside it and any subfolders are NOT deleted — they are moved up to the deleted folder’s parent (or to the top level if it was a root folder). Rejected (409) when a subfolder would collide with an existing folder name at the target level; rename or move it first. - [Update workflow folder](https://docs.enginy.ai/api-reference/workflows/update-workflow-folder.md): Update a workflow folder name or parent. Moving a folder into one of its own descendants is not allowed. - [Validate workflow](https://docs.enginy.ai/api-reference/workflows/validate-workflow.md): Validate a workflow `plan` payload without creating anything. Strict validation (as if publishing). Returns `isValid` with warnings, or errors. - [Get a single workflow](https://docs.enginy.ai/api-reference/workflows/get-a-single-workflow.md): Get a workflow: its current draft `plan`, trigger, published version, runtime input contract, and a `revision` token for optimistic concurrency on PATCH/publish. For WEBHOOK-triggered workflows the delivery credentials (`webhookUrl`, and `webhookSecret` for write-scoped keys) are issued on publish —… - [Delete workflow](https://docs.enginy.ai/api-reference/workflows/delete-workflow.md): Delete a workflow and its run history. Rejected (409) when another workflow still routes into it via a "Send to workflow" step — remove those steps first. - [Update workflow draft](https://docs.enginy.ai/api-reference/workflows/update-workflow-draft.md): Update a workflow draft. Provide either a full `plan` OR an ordered `ops` array (edit operations applied to the current draft plan) — not both. Optionally change `name`, `trigger`, or `maxCreditsPerRun`. Pass `revision` (from `GET /v1/workflow/{workflowId}`) for optimistic concurrency. - [Validate workflow draft](https://docs.enginy.ai/api-reference/workflows/validate-workflow-draft.md): Publish-grade validation of the STORED draft of a workflow (does not validate a submitted payload). Returns blocking errors and non-blocking warnings. - [Publish workflow](https://docs.enginy.ai/api-reference/workflows/publish-workflow.md): Publish a workflow's current draft as a new version. Pass an optional `revision` (from `GET /v1/workflow/{workflowId}`) for optimistic concurrency. - [Run workflow](https://docs.enginy.ai/api-reference/workflows/run-workflow.md): Start a run of a published workflow. The workflow must be published first. Provide `input` only when the workflow declares a runtime input (see `runtimeInputContract` on `GET /v1/workflow/{workflowId}`). - [Get workflow runs](https://docs.enginy.ai/api-reference/workflows/get-workflow-runs.md): List the runs of a workflow, most recent first, paginated. - [Get workflow run status](https://docs.enginy.ai/api-reference/workflows/get-workflow-run-status.md): Get the status of a workflow run plus a per-step summary (status counts per workflow step) and the number of distinct entities enrolled. - [Cancel workflow run](https://docs.enginy.ai/api-reference/workflows/cancel-workflow-run.md): Cancel a running workflow run. Only runs that are still RUNNING can be cancelled. - [Validate API key](https://docs.enginy.ai/api-reference/authentication/validate-api-key.md): Validate API key authentication. - [Overview](https://docs.enginy.ai/mcp/overview.md): Understand how Enginy MCP works, how tools are generated, and how OAuth and policy enforcement fit together. - [Client Support Matrix](https://docs.enginy.ai/mcp/client-support-matrix.md): Compare how Claude, ChatGPT, Claude Code, Codex, Cursor, VS Code, Gemini CLI, Microsoft 365 Copilot, and other MCP clients connect to Enginy MCP. - [Claude & Claude Code](https://docs.enginy.ai/mcp/claude-code.md): Connect Enginy to Claude — claude.ai web, desktop, Team, and Enterprise, the way most teams use Enginy MCP day to day — plus Claude Code for developers who prefer the CLI. - [ChatGPT & Codex](https://docs.enginy.ai/mcp/codex.md): Connect Enginy to ChatGPT — including Developer Mode custom connectors, now in beta on every paid plan — plus Codex for developers who prefer the CLI. - [Connect Cursor](https://docs.enginy.ai/mcp/cursor.md): Register the hosted Enginy MCP server in Cursor via mcp.json. - [Connect VS Code](https://docs.enginy.ai/mcp/vscode.md): Register the hosted Enginy MCP server in VS Code and GitHub Copilot Agent mode via mcp.json. - [Connect Gemini CLI](https://docs.enginy.ai/mcp/gemini-cli.md): Register the hosted Enginy MCP server in Gemini CLI. - [Connect Microsoft 365 Copilot](https://docs.enginy.ai/mcp/microsoft-365-copilot.md): Deploy the hosted Enginy MCP server as a Federated Copilot Connector for your whole tenant. - [Custom & Other MCP Clients](https://docs.enginy.ai/mcp/custom-clients.md): Connect a Claude surface, a bridge, or a homegrown MCP client to Enginy, and the technical details behind every client integration. - [Server-to-Server (API key)](https://docs.enginy.ai/mcp/api-key-auth.md): Connect MuleSoft or another server-side MCP client to Enginy MCP with a static workspace API key — no browser OAuth flow required. - [Supported Tools](https://docs.enginy.ai/mcp/supported-tools.md): See what Enginy MCP can do today, how its tools are generated, and which capability families are currently exposed. - [Example Prompts](https://docs.enginy.ai/mcp/example-prompts.md): Practical prompts and workflows for using Enginy MCP in Claude Code, Codex, Cursor, Gemini CLI, Microsoft 365 Copilot, ChatGPT developer mode, and other remote MCP clients. - [Events (automations)](https://docs.enginy.ai/mcp/events.md): Let ChatGPT and other MCP clients react to replies, accepted connection requests and other campaign activity through MCP Events. - [Scopes](https://docs.enginy.ai/mcp/scopes.md): Understand the Enginy MCP scope model, how scope ceilings work, and which endpoint families each scope unlock. - [Security & Troubleshooting](https://docs.enginy.ai/mcp/security-troubleshooting.md): Use Enginy MCP safely and debug the most common authorization, scope, and client-compatibility issues. - [FAQ / Known Limitations](https://docs.enginy.ai/mcp/faq-known-limitations.md): Quick answers to the most common MCP questions, plus the current limitations you should plan around. - [Overview](https://docs.enginy.ai/workflows/overview.md): What Advanced Workflows are, how steps fit together, and how to read the step reference. - [Create your first workflow](https://docs.enginy.ai/workflows/building.md): Build, save, and publish a workflow: trigger, steps, drafts, and the publish checks. - [Building Workflows with an Agent](https://docs.enginy.ai/workflows/building-with-agent.md): The recommended MCP tool flow for creating, publishing, and running Advanced Workflows. - [Manage workflows](https://docs.enginy.ai/workflows/managing.md): The workflows list, runs, version history, settings, permissions, and templates. - [Troubleshooting & credits](https://docs.enginy.ai/workflows/troubleshooting.md): How to read a failed run, what retries automatically, and how workflow runs spend credits. - [Triggers](https://docs.enginy.ai/workflows/triggers.md): Choose how a workflow starts: run it manually, on a schedule, from a webhook, or when something happens in Enginy. - [LinkedIn imports](https://docs.enginy.ai/workflows/imports/linkedin.md): Import contacts and companies by searching LinkedIn, Sales Navigator, posts, events, polls, connections, and followers. - [Fundraising data imports](https://docs.enginy.ai/workflows/imports/crunchbase.md): Import companies, people, and investors by searching fundraising data. - [CRM imports](https://docs.enginy.ai/workflows/imports/crm.md): Import contacts and companies already stored in HubSpot, Salesforce, Microsoft Dynamics, Zoho, Attio, TribeCRM, Pipedrive, or Odoo. - [Other data sources](https://docs.enginy.ai/workflows/imports/other-sources.md): Import companies from Google Maps, TheirStack, StoreLeads, and website visitor tracking. - [Lists & manual selection](https://docs.enginy.ai/workflows/imports/lists-and-manual.md): Start a workflow from a saved list, a manual pick, or a payload delivered by a webhook trigger. - [Contact enrichment](https://docs.enginy.ai/workflows/enrich/contacts.md): Blocks that fill in, verify, or refresh data on the contacts already in your workflow - [Company enrichment](https://docs.enginy.ai/workflows/enrich/companies.md): Blocks that fill in, refresh, or add background data on the companies already in your workflow - [AI & formula steps](https://docs.enginy.ai/workflows/enrich/ai.md): Blocks that use AI or your own formulas to compute fields, and steps that run an autonomous AI agent - [Lists, campaigns & blocklist](https://docs.enginy.ai/workflows/actions/lists-and-campaigns.md): Steps that add or remove contacts and companies from lists, enroll them in campaigns, or block them - [Messaging & notifications](https://docs.enginy.ai/workflows/actions/messaging.md): Steps that call external systems or notify your team about contacts and companies in a workflow - [CRM actions](https://docs.enginy.ai/workflows/actions/crm.md): Steps that export contacts and companies to your connected CRM, or create tasks there - [Flow utilities](https://docs.enginy.ai/workflows/actions/utilities.md): Steps that control workflow flow itself — handing off to other workflows, pausing, waiting for approval, editing properties, and deleting records - [Conditions & branching](https://docs.enginy.ai/workflows/conditions.md): The two canvas nodes that split a workflow into multiple paths: Condition and Prioritize by group - [Overview](https://docs.enginy.ai/api-reference/custom-crm/overview.md): API specification for endpoints you must implement in your CRM - [Health check](https://docs.enginy.ai/api-reference/custom-crm/endpoints/health.md): Validate the CRM connection - [Overview](https://docs.enginy.ai/api-reference/custom-crm/contacts.md): Endpoint specification for receiving contacts from Enginy - [Sync & Update Guide](https://docs.enginy.ai/api-reference/custom-crm/contacts-sync.md): Sync contacts and receive updates from your CRM - [Create contacts](https://docs.enginy.ai/api-reference/custom-crm/endpoints/contacts/create.md): Create new contacts in your CRM - [Sync contacts](https://docs.enginy.ai/api-reference/custom-crm/endpoints/contacts/sync.md): Find existing contacts in your CRM and return their IDs - [Update contacts](https://docs.enginy.ai/api-reference/custom-crm/endpoints/contacts/update.md): Update existing contacts in your CRM - [Overview](https://docs.enginy.ai/api-reference/custom-crm/companies.md): Endpoint specification for receiving companies from Enginy - [Sync & Update Guide](https://docs.enginy.ai/api-reference/custom-crm/companies-sync.md): Sync companies and receive updates from your CRM - [Create companies](https://docs.enginy.ai/api-reference/custom-crm/endpoints/companies/create.md): Create new companies in your CRM - [Sync companies](https://docs.enginy.ai/api-reference/custom-crm/endpoints/companies/sync.md): Find existing companies in your CRM and return their IDs - [Update companies](https://docs.enginy.ai/api-reference/custom-crm/endpoints/companies/update.md): Update existing companies in your CRM - [Overview](https://docs.enginy.ai/api-reference/custom-crm/associations.md): Endpoint specification for linking contacts to companies - [Create associations](https://docs.enginy.ai/api-reference/custom-crm/endpoints/associations-create.md): Link contacts to companies in your CRM - [Overview](https://docs.enginy.ai/api-reference/custom-crm/tasks.md): Task management endpoints for your Custom CRM - [Create task](https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/create.md): Create a new task in your CRM - [Get task](https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/get.md): Retrieve a single task by ID - [Update task](https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/update.md): Update or complete a task - [Get tasks batch](https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/batch-get.md): Retrieve multiple tasks by their IDs - [Complete tasks batch](https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/batch-complete.md): Complete multiple tasks at once - [Overview](https://docs.enginy.ai/api-reference/custom-crm/activities.md): Log LinkedIn and email conversation activity to your CRM - [Create activity](https://docs.enginy.ai/api-reference/custom-crm/endpoints/activities/create.md): Log conversation activity (LinkedIn, email, etc.) - [Get Users](https://docs.enginy.ai/api-reference/custom-crm/endpoints/users/get.md): Fetch users/owners for assignment (optional endpoint) - [Examples](https://docs.enginy.ai/api-reference/custom-crm/examples.md): Complete implementation examples for Custom CRM integration ## OpenAPI Specs - [definitions](https://openapi.enginy.ai/definitions.json) ## Optional - [Help Center](https://help.enginy.ai/) - [API Dashboard](https://app.enginy.ai/api-access) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.