Enginy API

Enginy API as documented publicly: 39 operations. Contract generated from the documentation by API Evangelist (2026-11-06); not the provider's own document.

GitHub OpenAPI

Operations 39

GET /health Health check #
POST /tasks POST /tasks #
GET /tasks/{taskid} Retrieves a single task by ID. #
PATCH /tasks/{taskid} Updates a task, typically to mark it as completed. #
POST /tasks/batch POST /tasks/batch #
GET /users Get Users #
POST /v1/actions How to chain enrichments and other actions on contacts and companies through POST /v1/actions #
POST /v1/add-contact-group-to-campaign POST /v1/add-contact-group-to-campaign adds every contact in a contact group to an existing campaign. #
POST /v1/add-contact-to-campaign POST /v1/add-contact-to-campaign adds one contact to an existing campaign. #
POST /v1/ai-finder/previews Call `POST /v1/ai-finder/previews` (`preview_an_ai_finder_search`) with the audience and provider, or reuse the latest matching preview. #
GET /v1/ai-playbook Read the playbook: GET /v1/ai-playbook — scope WORKSPACE_READ #
PUT /v1/ai-playbook Update the playbook: PUT /v1/ai-playbook — scope WORKSPACE_WRITE #
GET /v1/ai-variables/ai-message-tones Tones for AI messages are available via `GET /v1/ai-variables/ai-message-tones`. #
GET /v1/ai-variables/ai-messages Reuse a workspace AI message: list them with `GET /v1/ai-variables/ai-messages`. #
POST /v1/ai-variables/ai-messages Create a new AI message with full control over `prompt`, `toneId`, `model`, `outputLength`, and `splitMessages`. #
GET /v1/campaign/{campaignid} GET /v1/campaign/{campaignId} returns `thread` on every email step that has an explicit choice. #
PATCH /v1/campaign/{campaignid} Use `PATCH /v1/campaign/{campaignId}` to modify a campaign that is still in `DRAFT` status. #
GET /v1/campaign/{campaignid}/analytics GET /v1/campaign/{campaignId}/analytics maps stored status to user‑facing status, returning status: "PAUSED" with isPaused: true. #
POST /v1/campaign/{campaignid}/clone A launched campaign cannot be edited; clone it with `POST /v1/campaign/{campaignId}/clone` and edit the clone. #
PATCH /v1/campaign/{campaignid}/status To stop a campaign sending, use PATCH /v1/campaign/{campaignId}/status with status: "PENDING". #
GET /v1/campaigns GET /v1/campaigns lists campaigns after creation. #
POST /v1/campaigns Use `POST /v1/campaigns` to create a draft campaign from the public `steps` format. #
GET /v1/contacts/fields Manual `content`/`subject` placeholders must reference real fields — discover them with `GET /v1/contacts/fields`. #
GET /v1/identities A campaign sends from one or more sender identities. Find their IDs with `GET /v1/identities`. #
GET /v1/identities/{identityid}/mailboxes Inspect the mailboxes attached to an identity. #
POST /v1/identities/{identityid}/mailboxes Configure sending mailboxes for an identity. #
POST /v1/inbox/messages POST /v1/inbox/messages supports attachment only when the selected channel is LINKEDIN. #
POST /v1/pause-contact-in-campaign To stop outreach to a single contact rather than the whole campaign, use POST /v1/pause-contact-in-campaign. #
GET /v1/prompt-library/ai-messages Reuse a public prompt‑library entry: list them with `GET /v1/prompt-library/ai-messages`. #
GET /v1/tasks/owners Allows reading CRM owners for task assignment workflows through GET /v1/tasks/owners. #
GET /v1/voices Use `GET /v1/voices` to discover valid `voiceId` values for LinkedIn voice messages. #
PATCH /v1/workflow/{workflowId}/draft `PATCH /v1/workflow/4021/draft` with "revision": "2026-07-19T10:15:30.000Z". #
POST /v1/workflow/{id}/run `MANUAL` trigger runs via `POST /v1/workflow/{id}/run`. #
GET /v1/workflow/{workflowid} Every `GET /v1/workflow/{workflowId}` returns a **`revision`** token. #
GET /v1/workflow/{workflowid}/validate-draft Validate before you publish with `GET /v1/workflow/{workflowId}/validate-draft`. #
GET /v1/workflows/blocks `blockId` comes from `GET /v1/workflows/blocks`. #
GET /v1/workflows/blocks/{blockid} `inputs` are the block's configured inputs — discover them with `GET /v1/workflows/blocks/{blockId}`. #
GET /v1/workflows/condition-fields Discover fields and operators with `GET /v1/workflows/condition-fields`. #
GET /v1/workflows/import-inputs Call `GET /v1/workflows/import-inputs?previewId=&maxCount=100` (`get_workflow_import_inputs`, scope `WORKFLOWS_READ`). #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/enginy-ai:enginy-ai-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

enginy-ai-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Enginy API
  version: '2026-11-06'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-11-06: 39 operation(s) read from 11 public documentation page(s) (each
    operation names its page in x-source). This is not the provider''s published contract; Enginy has published no machine-readable contract that
    the pipeline could find. Engine: local.'
  x-evidence-tiers:
    code-example: 4
    documentation: 35
    pages-with-code: 2
    pages-read: 11
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-11-06'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://docs.enginy.ai/api-reference/custom-crm/endpoints/health.md
  - https://docs.enginy.ai/api-reference/custom-crm/endpoints/tasks/get.md
  - https://docs.enginy.ai/api-reference/custom-crm/endpoints/users/get.md
  - https://docs.enginy.ai/api-reference/introduction
  - https://docs.enginy.ai/api-reference/introduction.md
  - https://docs.enginy.ai/api-reference/actions-guide.md
  - https://docs.enginy.ai/api-reference/campaigns-guide.md
  - https://docs.enginy.ai/api-reference/workflows-guide.md
  - https://docs.enginy.ai/api-reference/custom-crm/tasks.md
  - https://docs.enginy.ai/api-reference/identities-guide.md
  - https://docs.enginy.ai/api-reference/ai-playbook-guide.md
servers:
- url: https://openapi.enginy.ai
paths:
  /health:
    get:
      operationId: get_health
      tags:
      - Health
      summary: Health check
      x-source: https://docs.enginy.ai/api-reference/custom-crm/endpoints/health.md
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetHealthResponse'
      x-evidence:
        kind: documentation
  /tasks:
    post:
      operationId: post_tasks
      tags:
      - Tasks
      summary: POST /tasks
      x-source: https://docs.enginy.ai/api-reference/custom-crm/tasks.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostTasksRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: 'curl -X POST https://your-api.com/tasks  -H "X-API-Key: your-secret-key"  -H "Content-Type: application/json"  -d ''{"subject":
          "Test task", "description": "Testing integration"}''

          ```'
  /tasks/{taskid}:
    get:
      operationId: get_tasks_taskid
      tags:
      - Tasks
      summary: Retrieves a single task by ID.
      x-source: https://docs.enginy.ai/api-reference/custom-crm/tasks.md
      parameters:
      - name: taskid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetTasksTaskidResponse'
      x-evidence:
        kind: documentation
    patch:
      operationId: patch_tasks_taskid
      tags:
      - Tasks
      summary: Updates a task, typically to mark it as completed.
      x-source: https://docs.enginy.ai/api-reference/custom-crm/tasks.md
      parameters:
      - name: taskid
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchTasksTaskidRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PatchTasksTaskidResponse'
      x-evidence:
        kind: documentation
  /tasks/batch:
    post:
      operationId: post_tasks_batch
      tags:
      - Tasks
      summary: POST /tasks/batch
      x-source: https://docs.enginy.ai/api-reference/custom-crm/tasks.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostTasksBatchRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: 'curl -X POST https://your-api.com/tasks/batch  -H "X-API-Key: your-secret-key"  -H "Content-Type: application/json"  -d ''{"ids":
          ["task-id-1", "task-id-2"]}''

          ```'
  /users:
    get:
      operationId: get_users
      tags:
      - Users
      summary: Get Users
      x-source: https://docs.enginy.ai/api-reference/custom-crm/endpoints/users/get.md
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetUsersResponse'
      x-evidence:
        kind: documentation
  /v1/actions:
    post:
      operationId: post_v1_actions
      tags:
      - Actions
      summary: How to chain enrichments and other actions on contacts and companies through POST /v1/actions
      x-source: https://docs.enginy.ai/api-reference/actions-guide.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1ActionsRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/add-contact-group-to-campaign:
    post:
      operationId: post_v1_add_contact_group_to_campaign
      tags:
      - Add Contact Group To Campaign
      summary: POST /v1/add-contact-group-to-campaign adds every contact in a contact group to an existing campaign.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1AddContactGroupToCampaignRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1AddContactGroupToCampaignResponse'
      x-evidence:
        kind: documentation
  /v1/add-contact-to-campaign:
    post:
      operationId: post_v1_add_contact_to_campaign
      tags:
      - Add Contact To Campaign
      summary: POST /v1/add-contact-to-campaign adds one contact to an existing campaign.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1AddContactToCampaignRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/ai-finder/previews:
    post:
      operationId: post_v1_ai_finder_previews
      tags:
      - Ai Finder
      summary: Call `POST /v1/ai-finder/previews` (`preview_an_ai_finder_search`) with the audience and provider, or reuse the latest matching
        preview.
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/ai-playbook:
    get:
      operationId: get_v1_ai_playbook
      tags:
      - Ai Playbook
      summary: 'Read the playbook: GET /v1/ai-playbook — scope WORKSPACE_READ'
      x-source: https://docs.enginy.ai/api-reference/ai-playbook-guide.md
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1AiPlaybookResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_v1_ai_playbook
      tags:
      - Ai Playbook
      summary: 'Update the playbook: PUT /v1/ai-playbook — scope WORKSPACE_WRITE'
      x-source: https://docs.enginy.ai/api-reference/ai-playbook-guide.md
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutV1AiPlaybookRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutV1AiPlaybookResponse'
      x-evidence:
        kind: documentation
  /v1/ai-variables/ai-message-tones:
    get:
      operationId: get_v1_ai_variables_ai_message_tones
      tags:
      - Ai Variables
      summary: Tones for AI messages are available via `GET /v1/ai-variables/ai-message-tones`.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/ai-variables/ai-messages:
    get:
      operationId: get_v1_ai_variables_ai_messages
      tags:
      - Ai Variables
      summary: 'Reuse a workspace AI message: list them with `GET /v1/ai-variables/ai-messages`.'
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_ai_variables_ai_messages
      tags:
      - Ai Variables
      summary: Create a new AI message with full control over `prompt`, `toneId`, `model`, `outputLength`, and `splitMessages`.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1AiVariablesAiMessagesRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/campaign/{campaignid}:
    get:
      operationId: get_v1_campaign_campaignid
      tags:
      - Campaign
      summary: GET /v1/campaign/{campaignId} returns `thread` on every email step that has an explicit choice.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      parameters:
      - name: campaignid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1CampaignCampaignidResponse'
      x-evidence:
        kind: documentation
    patch:
      operationId: patch_v1_campaign_campaignid
      tags:
      - Campaign
      summary: Use `PATCH /v1/campaign/{campaignId}` to modify a campaign that is still in `DRAFT` status.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      parameters:
      - name: campaignid
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchV1CampaignCampaignidRequest'
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/campaign/{campaignid}/analytics:
    get:
      operationId: get_v1_campaign_campaignid_analytics
      tags:
      - Campaign
      summary: 'GET /v1/campaign/{campaignId}/analytics maps stored status to user‑facing status, returning status: "PAUSED" with isPaused: true.'
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      parameters:
      - name: campaignid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1CampaignCampaignidAnalyticsResponse'
      x-evidence:
        kind: documentation
  /v1/campaign/{campaignid}/clone:
    post:
      operationId: post_v1_campaign_campaignid_clone
      tags:
      - Campaign
      summary: A launched campaign cannot be edited; clone it with `POST /v1/campaign/{campaignId}/clone` and edit the clone.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      parameters:
      - name: campaignid
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/campaign/{campaignid}/status:
    patch:
      operationId: patch_v1_campaign_campaignid_status
      tags:
      - Campaign
      summary: 'To stop a campaign sending, use PATCH /v1/campaign/{campaignId}/status with status: "PENDING".'
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      parameters:
      - name: campaignid
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchV1CampaignCampaignidStatusRequest'
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/campaigns:
    get:
      operationId: get_v1_campaigns
      tags:
      - Campaigns
      summary: GET /v1/campaigns lists campaigns after creation.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_campaigns
      tags:
      - Campaigns
      summary: Use `POST /v1/campaigns` to create a draft campaign from the public `steps` format.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1CampaignsRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/contacts/fields:
    get:
      operationId: get_v1_contacts_fields
      tags:
      - Contacts
      summary: Manual `content`/`subject` placeholders must reference real fields — discover them with `GET /v1/contacts/fields`.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/identities:
    get:
      operationId: get_v1_identities
      tags:
      - Identities
      summary: A campaign sends from one or more sender identities. Find their IDs with `GET /v1/identities`.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/identities/{identityid}/mailboxes:
    get:
      operationId: get_v1_identities_identityid_mailboxes
      tags:
      - Identities
      summary: Inspect the mailboxes attached to an identity.
      x-source: https://docs.enginy.ai/api-reference/identities-guide.md
      parameters:
      - name: identityid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    post:
      operationId: post_v1_identities_identityid_mailboxes
      tags:
      - Identities
      summary: Configure sending mailboxes for an identity.
      x-source: https://docs.enginy.ai/api-reference/identities-guide.md
      parameters:
      - name: identityid
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/inbox/messages:
    post:
      operationId: post_v1_inbox_messages
      tags:
      - Inbox
      summary: POST /v1/inbox/messages supports attachment only when the selected channel is LINKEDIN.
      x-source: https://docs.enginy.ai/api-reference/introduction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostV1InboxMessagesRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostV1InboxMessagesResponse'
      x-evidence:
        kind: documentation
  /v1/pause-contact-in-campaign:
    post:
      operationId: post_v1_pause_contact_in_campaign
      tags:
      - Pause Contact In Campaign
      summary: To stop outreach to a single contact rather than the whole campaign, use POST /v1/pause-contact-in-campaign.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/prompt-library/ai-messages:
    get:
      operationId: get_v1_prompt_library_ai_messages
      tags:
      - Prompt Library
      summary: 'Reuse a public prompt‑library entry: list them with `GET /v1/prompt-library/ai-messages`.'
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/tasks/owners:
    get:
      operationId: get_v1_tasks_owners
      tags:
      - Tasks
      summary: Allows reading CRM owners for task assignment workflows through GET /v1/tasks/owners.
      x-source: https://docs.enginy.ai/api-reference/introduction
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/voices:
    get:
      operationId: get_v1_voices
      tags:
      - Voices
      summary: Use `GET /v1/voices` to discover valid `voiceId` values for LinkedIn voice messages.
      x-source: https://docs.enginy.ai/api-reference/campaigns-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflow/{workflowId}/draft:
    patch:
      operationId: patch_v1_workflow_workflowId_draft
      tags:
      - Workflow
      summary: '`PATCH /v1/workflow/4021/draft` with "revision": "2026-07-19T10:15:30.000Z".'
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: workflowId
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchV1WorkflowWorkflowidDraftRequest'
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflow/{id}/run:
    post:
      operationId: post_v1_workflow_id_run
      tags:
      - Workflow
      summary: '`MANUAL` trigger runs via `POST /v1/workflow/{id}/run`.'
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflow/{workflowid}:
    get:
      operationId: get_v1_workflow_workflowid
      tags:
      - Workflow
      summary: Every `GET /v1/workflow/{workflowId}` returns a **`revision`** token.
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: workflowid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetV1WorkflowWorkflowidResponse'
      x-evidence:
        kind: documentation
  /v1/workflow/{workflowid}/validate-draft:
    get:
      operationId: get_v1_workflow_workflowid_validate_draft
      tags:
      - Workflow
      summary: Validate before you publish with `GET /v1/workflow/{workflowId}/validate-draft`.
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: workflowid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflows/blocks:
    get:
      operationId: get_v1_workflows_blocks
      tags:
      - Workflows
      summary: '`blockId` comes from `GET /v1/workflows/blocks`.'
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflows/blocks/{blockid}:
    get:
      operationId: get_v1_workflows_blocks_blockid
      tags:
      - Workflows
      summary: '`inputs` are the block''s configured inputs — discover them with `GET /v1/workflows/blocks/{blockId}`.'
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: blockid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflows/condition-fields:
    get:
      operationId: get_v1_workflows_condition_fields
      tags:
      - Workflows
      summary: Discover fields and operators with `GET /v1/workflows/condition-fields`.
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /v1/workflows/import-inputs:
    get:
      operationId: get_v1_workflows_import_inputs
      tags:
      - Workflows
      summary: Call `GET /v1/workflows/import-inputs?previewId=<previewId>&maxCount=100` (`get_workflow_import_inputs`, scope `WORKFLOWS_READ`).
      x-source: https://docs.enginy.ai/api-reference/workflows-guide.md
      parameters:
      - name: previewId
        in: query
        required: true
        schema:
          type: string
      - name: maxCount
        in: query
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
components:
  schemas:
    GetHealthResponse:
      type: object
      properties:
        status:
          type: string
          description: Status indicator (e.g., "ok")
    PostTasksRequest:
      type: object
      properties:
        subject:
          type: string
        description:
          type: string
    GetTasksTaskidResponse:
      type: object
      properties:
        id:
          type: string
        subject:
          type: string
        description:
          type: string
        type:
          type: string
        ownerId:
          type: string
        dueDate:
          type: string
        contactId:
          type: string
        companyId:
          type: string
        completed:
          type: boolean
        completedAt:
          type: string
          description: null if not completed
    PatchTasksTaskidRequest:
      type: object
      properties:
        completed:
          type: boolean
          description: Set to `true` to mark the task as completed
    PatchTasksTaskidResponse:
      type: object
      properties:
        id:
          type: string
        subject:
          type: string
        completed:
          type: boolean
        completedAt:
          type: string
    PostTasksBatchRequest:
      type: object
      properties:
        ids:
          type: array
          items:
            type: string
    GetUsersResponse:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the user in your CRM
        name:
          type: string
          description: Display name of the user
        email:
          type: string
          description: Email address of the user (optional, used for display)
    PostV1ActionsRequest:
      type: object
      properties:
        actions:
          type: array
          description: Array of action objects to execute
        contactIds:
          type: number
          description: Array of contact IDs to process
        companyIds:
          type: number
          description: Array of company IDs to process
        contactGroupIds:
          type: number
          description: Array of contact list IDs to process
        companyGroupIds:
          type: number
          description: Array of company list IDs to process
        type:
          type: string
          description: The type of action to execute (see Available actions below)
        options:
          type: object
          description: Configuration options specific to the action type
      required:
      - actions
      - type
    PostV1AddContactGroupToCampaignRequest:
      type: object
      properties:
        campaignId:
          type: string
          description: The campaign to add contacts to.
        contactGroupId:
          type: string
          description: Identifier of the contact group.
      required:
      - campaignId
      - contactGroupId
    PostV1AddContactGroupToCampaignResponse:
      type: object
      properties:
        newlyAdded:
          type: string
          description: Count of contacts newly added.
        reactivated:
          type: string
          description: Count of contacts reactivated.
        alreadyPresent:
          type: string
          description: Count of contacts already present.
        skipped:
          type: string
          description: Count of contacts skipped.
    PostV1AddContactToCampaignRequest:
      type: object
      properties:
        campaignId:
          type: string
          description: The campaign to add the contact to.
        contactId:
          type: string
          description: Identifier of the contact to add.
      required:
      - campaignId
      - contactId
    GetV1AiPlaybookResponse:
      type: object
      properties:
        status:
          type: string
          description: e.g., "success"
        message:
          type: string
          description: Human‑readable result message
        data:
          type: object
          description: Full AI playbook structure as returned by GET
    PutV1AiPlaybookRequest:
      type: object
      properties:
        company:
          type: object
          description: Company‑level fields to update
        productsServices:
          type: object
          description: Contains optional "upsert" array of product/service items and optional "deleteIds" array
        idealCustomerProfiles:
          type: object
          description: Contains optional "upsert" array of ICP items and optional "deleteIds" array
        competitors:
          type: object
          description: Contains optional "upsert" array of competitor items and optional "deleteIds" array
        testimonials:
          type: object
          description: Contains optional "upsert" array of testimonial items and optional "deleteIds" array
        faqs:
          type: object
          description: Contains optional "upsert" array of FAQ items and optional "deleteIds" array
    PutV1AiPlaybookResponse:
      type: object
      properties:
        status:
          type: string
          description: e.g., "success"
        message:
          type: string
          description: Human‑readable result message
        data:
          type: object
          description: Full AI playbook after the update, plus a "changes" object
    PostV1AiVariablesAiMessagesRequest:
      type: object
      properties:
        name:
          type: string
        identityId:
          type: integer
        prompt:
          type: string
        toneId:
          type: string
        model:
          type: string
        outputLength:
          type: string
        splitMessages:
          type: boolean
      required:
      - name
      - identityId
      - prompt
    GetV1CampaignCampaignidResponse:
      type: object
      properties:
        thread:
          type: string
    PatchV1CampaignCampaignidRequest:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        identityId:
          type: integer
        identityIds:
          type: array
        steps:
          type: array
    GetV1CampaignCampaignidAnalyticsResponse:
      type: object
      properties:
        status:
          type: string
          description: User‑facing status, e.g., "PAUSED".
        isPaused:
          type: string
          description: Boolean indicating if the campaign is paused.
    PatchV1CampaignCampaignidStatusRequest:
      type: object
      properties:
        status:
          type: string
          description: The new status, e.g., "PENDING" to pause.
      required:
      - status
    PostV1CampaignsRequest:
      type: object
      properties:
        name:
          type: string
        identityId:
          type: integer
        identityIds:
          type: array
        steps:
          type: array
      required:
      - steps
    PostV1InboxMessagesRequest:
      type: object
      properties:
        contactId:
          type: integer
        senderIdentityId:
          type: integer
        type:
          type: string
          description: Message channel type, e.g., EMAIL or LINKEDIN.
        message:
          type: string
          description: Message body; for EMAIL include file URL if needed.
      required:
      - contactId
      - senderIdentityId
      - type
      - message
    PostV1InboxMessagesResponse:
      type: object
      properties:
        status:
          type: string
          description: Result status, e.g., "error".
        message:
          type: string
          description: Error message when attachments are not supported.
    PatchV1WorkflowWorkflowidDraftRequest:
      type: object
      properties:
        revision:
          type: string
          description: The revision token from GET.
      required:
      - revision
    GetV1WorkflowWorkflowidResponse:
      type: object
      properties:
        revision:
          type: string
          description: The workflow's `updatedAt`, ISO-8601.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: X-API-Key
security:
- apiKey: []
tags:
- name: Actions
- name: Add Contact Group To Campaign
- name: Add Contact To Campaign
- name: Ai Finder
- name: Ai Playbook
- name: Ai Variables
- name: Campaign
- name: Campaigns
- name: Contacts
- name: Health
- name: Identities
- name: Inbox
- name: Pause Contact In Campaign
- name: Prompt Library
- name: Tasks
- name: Users
- name: Voices
- name: Workflow
- name: Workflows