> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Zigpoll

The Zigpoll connector lets your AI agent act in each user's Zigpoll account. Each user connects their own Zigpoll access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 27 tools.

**Authentication:** Bearer Token
**Categories:** Marketing
**Tools:** 27: 19 read, 8 write, 0 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=ZIGPOLL)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Zigpoll connection

   In **AgentKit > Connections**, create a Zigpoll connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'zigpoll'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Zigpoll:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'zigpoll_get_current_user',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "zigpoll"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Zigpoll:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="zigpoll_get_current_user",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Zigpoll credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'zigpoll_get_account',
  toolInput: {
    accountId: '<accountId>',
  },
  connector: 'zigpoll',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="zigpoll_get_account",
    tool_input={
        "accountId": "<accountId>",
    },
    connection_name="zigpoll",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `zigpoll_get_account`

Get Account · Read-only

Get one Zigpoll account by id.
Returns the account's title, plan, owner and admin, poll ids, isShopify flag and usage counters.
Use zigpoll_list_accounts to find the id first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, required): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts).

Example input: `{"accountId":"<accountId>"}`

### `zigpoll_get_current_user`

Get Current User · Read-only

Get the user that owns the API key.
Returns the user id, name, email and the list of account ids the key can reach.
Use it to confirm the connection works; use zigpoll_list_accounts for account details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `zigpoll_get_poll`

Get Poll · Read-only

Get one poll (survey) by id.
Returns the poll's title, status, visibility, page rules, slide ids, settings and engagement counters.
Use zigpoll_list_polls to find the id; use zigpoll_list_slides for the question content.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_get_poll_action_logic`

Get Poll Action Logic · Read-only

Get a survey's Action Logic rules and the actions available for writing new ones.
Returns the current rules plus the actions this account can use now and those available once an integration is connected.
Use it to inspect rules that run after a response.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_get_poll_attribution`

Get Poll Attribution · Read-only

Get the attributed revenue report for one 'How did you hear about us?' question.
Returns per-answer orders, revenue, average order value and share, a byPeriod series and a comparison with the previous window.
Use it to see which marketing channels drive orders; use zigpoll_get_poll_metadata for non-revenue metadata breakdowns.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide the account that owns the survey.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `granularity` (`string`, optional): Period size for the byPeriod series: day, week (default) or month; weeks start on Monday. One of: `day`, `week`, `month`.
- `groupBy` (`string`, optional): Response-metadata field to cross-tab answers against (default `source`), for example utm_source, utm_medium, utm_campaign or landing-page. One of: `attribution_channel`, `attribution_source`, `source`, `utm_source`, `utm_medium`, `utm_campaign`, `original-referrer`, `landing-page`, `sourceType`, `utm_content`, `utm_term`, `campaign_name`, `adset_name`, `ad_name`, `placement`, `site_source_name`, `gad_source`, `utm_source_platform`, `utm_creative_format`, `utm_marketing_tactic`, `landingPage`, `referrerUrl`, `shopify_order_discount_codes`.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. The attribution question to report on.
- `timezoneOffset` (`string`, optional): Minutes offset from UTC used for day bucketing (for example -300 for UTC-5).

Example input: `{}`

### `zigpoll_get_poll_devices`

Get Poll Devices · Read-only

Get the device type, browser and operating system breakdown of respondents.
Returns totalParticipants and distributions for deviceTypes, browsers and operatingSystems, with a truncated flag.
Use zigpoll_get_poll_locations for geography.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide one of accountId, pollId or slideId.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide one of accountId, pollId or slideId.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide one of accountId, pollId or slideId.

Example input: `{}`

### `zigpoll_get_poll_locations`

Get Poll Locations · Read-only

Get the geographic breakdown of respondents.
Returns totalParticipants and the top 25 countries, regions and cities, with a truncated flag.
Use zigpoll_get_poll_devices for device and browser data.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide one of accountId, pollId or slideId.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide one of accountId, pollId or slideId.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide one of accountId, pollId or slideId.

Example input: `{}`

### `zigpoll_get_poll_metadata`

Get Poll Metadata · Read-only

Get an aggregated breakdown of response metadata such as utm_source, referrer, landing page or custom keys.
Returns the available metadata keys when key is omitted, or the value distribution for one key.
Call it without key first to discover keys; use zigpoll_get_poll_attribution for revenue by channel.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide one of accountId, pollId or slideId.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `key` (`string`, optional): Metadata key to break down, for example utm_source. Omit to list the available keys.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide one of accountId, pollId or slideId.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide one of accountId, pollId or slideId.

Example input: `{}`

### `zigpoll_get_poll_patterns`

Get Poll Patterns · Read-only

Get the statistically tested patterns Zigpoll has precomputed for a survey.
Returns patterns strongest first (links between answers and who respondents are, where they came from or what they bought), plus the run record per survey.
Use zigpoll_list_insights for AI-written summaries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide one of accountId, pollId or slideId.
- `limit` (`integer`, optional): Number of patterns to return. Default 50, maximum 200.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide one of accountId, pollId or slideId.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide one of accountId, pollId or slideId.

Example input: `{}`

### `zigpoll_get_poll_translations`

Get Poll Translations · Read-only

Get the translation state of a poll.
Returns the languages it is translated into with coverage counts, the translatable CTA keys and the source content; with language set it also returns that language's current translations.
Use it to inspect translations before editing a survey.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `language` (`string`, optional): ISO 639 language code, optionally region-qualified (for example de or pt-BR), or `default`. When set, the response includes that language's current translations.

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_get_poll_trends`

Get Poll Trends · Read-only

Get response volume over time, bucketed by day.
Returns the unit and a trends series; with slideId the buckets are per answer option, with only pollId the unit is whole survey responses.
Use it to chart response volume; use zigpoll_get_poll_attribution for revenue by answer.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide one of accountId, pollId or slideId.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide one of accountId, pollId or slideId.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide one of accountId, pollId or slideId.
- `timezoneOffset` (`string`, optional): Minutes offset from UTC used for day bucketing; only applies when slideId is given (for example -300 for UTC-5).

Example input: `{}`

### `zigpoll_get_slide`

Get Slide · Read-only

Get one slide (question) by id.
Returns the slide's title, type, answer options with vote counts, copy and view counters.
Use zigpoll_list_slides to find the id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `slideId` (`string`, required): ID of the slide (question), the `_id` returned by zigpoll_list_slides.

Example input: `{"slideId":"<slideId>"}`

### `zigpoll_list_accounts`

List Accounts · Read-only

List every Zigpoll account the API key can reach.
Returns each account's id, title, plan, Shopify flag, poll ids and response, participant and email counters.
Use it first to find an accountId; use zigpoll_get_account for one account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `zigpoll_list_emails`

List Emails · Read-only

List the email addresses collected by surveys in an account, poll or slide.
Returns a cursor-paginated page with data, hasNextPage and endCursor; each record is a collected email object.
Use zigpoll_list_participants for respondent profiles without email capture.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide exactly one of accountId, pollId or slideId to choose the scope.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `limit` (`integer`, optional): Page size. Default 50, maximum 5000. Use a large limit for bulk exports.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `startCursor` (`string`, optional): Pagination cursor. Pass the `_id` of the last record from the previous page (also returned as `endCursor`) to fetch the next page; stop when `hasNextPage` is false.

Example input: `{}`

### `zigpoll_list_insights`

List Insights · Read-only

List the automated AI insights Zigpoll generated for an account, poll or slide.
Returns a cursor-paginated page with data, hasNextPage and endCursor; each insight is an AI-generated summary of the responses.
Use zigpoll_get_poll_patterns for statistically tested findings.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide exactly one of accountId, pollId or slideId to choose the scope.
- `limit` (`integer`, optional): Page size. Default 50, maximum 5000. Use a large limit for bulk exports.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `startCursor` (`string`, optional): Pagination cursor. Pass the `_id` of the last record from the previous page (also returned as `endCursor`) to fetch the next page; stop when `hasNextPage` is false.

Example input: `{}`

### `zigpoll_list_participants`

List Participants · Read-only

List the participants who took surveys in an account, poll or slide.
Returns a cursor-paginated page with data, hasNextPage and endCursor; each participant has an id, metadata and response history fields.
Use zigpoll_list_responses for the answers themselves.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide exactly one of accountId, pollId or slideId to choose the scope.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `limit` (`integer`, optional): Page size. Default 50, maximum 5000. Use a large limit for bulk exports.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `startCursor` (`string`, optional): Pagination cursor. Pass the `_id` of the last record from the previous page (also returned as `endCursor`) to fetch the next page; stop when `hasNextPage` is false.

Example input: `{}`

### `zigpoll_list_polls`

List Polls · Read-only

List the polls (surveys) in an account.
Returns each poll's id, title, status, visibility, archive flag, page rules, slide ids and engagement counters.
Use zigpoll_get_poll for one poll; use zigpoll_list_slides for its questions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, required): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts).

Example input: `{"accountId":"<accountId>"}`

### `zigpoll_list_responses`

List Responses · Read-only

List participant responses for an account, poll or slide, newest first by default.
Returns a cursor-paginated page with data, hasNextPage and endCursor; each response has the compiled answer text and, for multi-answer questions, an answers list of the picked options.
Use zigpoll_list_participants for respondent profiles; do not build frequency counts from the response text of multi-answer questions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `accountId` (`string`, optional): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts). Provide exactly one of accountId, pollId or slideId to choose the scope.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).
- `filter` (`string`, optional): Return only one kind of answer: `fixed-choice` keeps answers picked from predefined options, `open-ended` keeps free-text write-ins. Omit to return everything. One of: `fixed-choice`, `open-ended`.
- `limit` (`integer`, optional): Page size. Default 50, maximum 5000. Use a large limit for bulk exports.
- `order` (`string`, optional): Page order: `newest` (default) returns the latest responses first, `oldest` walks forward from the earliest response. Pass the last _id as startCursor to continue in the same order. One of: `newest`, `oldest`.
- `pollId` (`string`, optional): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `slideId` (`string`, optional): ID of the slide (question), the `_id` returned by zigpoll_list_slides. Provide exactly one of accountId, pollId or slideId to choose the scope.
- `startCursor` (`string`, optional): Pagination cursor. Pass the `_id` of the last record from the previous page (also returned as `endCursor`) to fetch the next page; stop when `hasNextPage` is false.

Example input: `{}`

### `zigpoll_list_slides`

List Slides · Read-only

List the slides (questions) of a poll.
Returns each slide's id, title, handle, type, answer options with vote counts and view counters.
Use zigpoll_get_slide for one slide; pass createdAfter or createdBefore to count votes in a time window.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `createdAfter` (`string`, optional): Only return records created on or after this time, as a JavaScript timestamp in milliseconds (for example 1760000000000). Use it for incremental sync.
- `createdBefore` (`string`, optional): Only return records created on or before this time, as a JavaScript timestamp in milliseconds (for example 1760000000000).

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_create_poll`

Create Poll · Write

Create a new poll (survey) under an account you own.
Returns the created poll with its id; it starts hidden (isVisible false) and with no slides.
Follow with zigpoll_create_slide to add questions, then zigpoll_update_poll with isVisible true to publish.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `accountId` (`string`, required): ID of the Zigpoll account (the account `_id`, e.g. from zigpoll_list_accounts).
- `title` (`string`, required): Title of the new poll, for example 'Post-Purchase Feedback'.
- `displaySettings` (`object`, optional): Visual display settings object (colors, fonts, position, shape), for example {"backgroundColor": "#212a2f", "align": "right"}.
- `emailDisplaySettings` (`object`, optional): Email delivery display settings object (subject, colors, content), for example {"subject": "Have a minute for a quick survey?"}.
- `pageDisplaySettings` (`object`, optional): Standalone page display settings object (colors, fonts, layout).
- `pageExcludeRules` (`array`, optional): URL path rules for where the poll must not appear, as a list of strings.
- `pageRules` (`array`, optional): URL path rules for where the poll appears, as a list of strings, for example ["/thank-you"]. Shopify surfaces use fixed paths such as /(.*)/thank_you (Thank You page), /:order_number/orders/:variable (Order Status) and /account (customer accounts).
- `schedule` (`object`, optional): Activation and deactivation schedule, either immediate or scheduled with ISO dates, as a JSON object.
- `settings` (`object`, optional): Poll settings object, for example {"showCounter": true, "allowResubmissions": false, "notifyOnComplete": true}. On update it replaces the entire settings object, so send the full object.
- `smsDisplaySettings` (`object`, optional): SMS delivery settings object, for example {"message": "We want your feedback! Click the link to complete our survey."}.
- `targetingSettings` (`object`, optional): Audience targeting by percentage, geography, browser, device type, referral, IP or metadata, as a JSON object.
- `visibilitySettings` (`object`, optional): Auto-open, exit-intent and hide-after rules, for example {"autoOpenDevice": false, "hideAfterSubmission": false}. On update these are merged with existing values, so partial objects are fine.

Example input: `{"accountId":"<accountId>","title":"<title>"}`

### `zigpoll_create_slide`

Create Slide · Write

Add a new slide (question) to an existing poll.
Returns the created slide with its id, handle, type and answer options.
Use zigpoll_list_slides to see existing questions; use zigpoll_update_slide to change one; pass idx to insert at a position.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls. The poll must belong to an account you own.
- `type` (`string`, required): Slide type: question, checkbox, dropdown, autocomplete, image-choice, binary, legal-consent, inline-multiple-choice, star-rating, range, satisfaction, slider, short-answer, long-answer, email-capture, phone-capture, date, file-upload, country, rank, form, copy, thank-you, reward, action or matrix. One of: `question`, `checkbox`, `dropdown`, `autocomplete`, `image-choice`, `binary`, `legal-consent`, `inline-multiple-choice`, `star-rating`, `range`, `satisfaction`, `slider`, `short-answer`, `long-answer`, `email-capture`, `phone-capture`, `date`, `file-upload`, `country`, `rank`, `form`, `copy`, `thank-you`, `reward`, `action`, `matrix`.
- `actions` (`array`, optional): Action buttons for action slides, as a list of objects with title, color, icon and link, for example [{"title": "Shop now", "link": "https://example.com"}].
- `answers` (`array`, optional): Answer options for choice-based slide types, as a list of objects with a title, for example [{"title": "Instagram"}, {"title": "A friend"}]. For matrix slides these are the shared columns; for legal-consent pass one answer whose title is the checkbox label.
- `copy` (`string`, optional): Body copy for the slide; HTML is supported.
- `displayLogic` (`array`, optional): Display logic rules controlling when this slide is shown, as a list of rule objects.
- `formInputs` (`array`, optional): Form fields for form slides, as a list of objects with label, type (short-answer, long-answer, email-capture, radio, checkbox, select, inline-multiple-choice or file-upload), optional and options, for example [{"label": "Email", "type": "email-capture", "optional": false}].
- `idx` (`integer`, optional): Position to insert the slide in the poll's slide list (0 is first). Appended to the end when omitted.
- `leftLabel` (`string`, optional): Left label for range, satisfaction and star-rating slides.
- `logic` (`array`, optional): Conditional logic rules for branching and actions, as a list of rule objects.
- `multi` (`boolean`, optional): Allow multiple selections (checkbox and inline-multiple-choice slides).
- `nextSlide` (`string`, optional): ID of the slide to show next, or "-1" to end the survey.
- `placeholder` (`string`, optional): Placeholder text for free-text inputs.
- `rewardBanner` (`string`, optional): Banner text shown above the reward code.
- `rewardCode` (`string`, optional): Discount or reward code shown on reward slides.
- `rewardCodeType` (`string`, optional): How the reward code is produced: static, dynamic or free-shipping. One of: `static`, `dynamic`, `free-shipping`.
- `rightLabel` (`string`, optional): Right label for range, satisfaction and star-rating slides.
- `rows` (`array`, optional): Question rows for matrix slides, as a list of objects with a title, for example [{"title": "Quality"}, {"title": "Price"}]. Each row is answered from the shared answers (columns).
- `settings` (`object`, optional): Slide settings object, for example {"showTitle": true, "optional": false, "hidden": false}.
- `subtitle` (`string`, optional): Slide subtitle shown under the title.
- `title` (`string`, optional): Slide title (the question text).

Example input: `{"pollId":"<pollId>","type":"question"}`

### `zigpoll_generate_survey_link`

Generate Survey Link · Write

Generate a unique, trackable survey link for one respondent.
Returns the url and the activityId of the new activity record.
Use it to hand out per-person links with metadata; use zigpoll_send_email or zigpoll_send_sms to deliver invitations directly.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `expiresAt` (`string`, optional): ISO 8601 datetime after which the link expires, for example 2026-12-31T23:59:59Z.
- `metadata` (`object`, optional): Key-value metadata to attach to the activity record, for example {"orderId": "1001", "campaign": "spring"}.

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_reorder_slides`

Reorder Slides · Write

Set the order in which a poll's slides appear.
Returns the survey's slide order after the write.
slideIds must list every slide on the poll exactly once; get them from zigpoll_list_slides first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `slideIds` (`array`, required): Every slide id on the poll, in the order they should appear. The list must be complete with no duplicates.

Example input: `{"pollId":"<pollId>","slideIds":[]}`

### `zigpoll_send_email`

Send Email Campaign · Write

Send an email survey invitation to one or more recipients.
Returns success with the number sent and skipped; malformed, placeholder and duplicate addresses are skipped.
This emails real people; use zigpoll_generate_survey_link if you only need a link.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `recipients` (`array`, required): Email addresses to invite, as a list of strings. Addresses are lowercased and de-duplicated.
- `emailDisplaySettings` (`object`, optional): Optional email display settings override (sender, content, colors) for this send, as a JSON object.

Example input: `{"pollId":"<pollId>","recipients":[]}`

### `zigpoll_send_sms`

Send SMS Campaign · Write

Send an SMS survey invitation to one or more phone numbers.
Returns success once the campaign is queued; numbers are normalized and de-duplicated.
This texts real people; use zigpoll_generate_survey_link if you only need a link.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `recipients` (`array`, required): Phone numbers to invite, as a list of strings in E.164 (+14155550123) or domestic format.
- `message` (`string`, optional): SMS message override. Defaults to the poll or account SMS settings.

Example input: `{"pollId":"<pollId>","recipients":[]}`

### `zigpoll_update_poll`

Update Poll · Write

Update an existing poll (survey); only the fields you send are changed.
Returns the updated poll object.
Use it to rename, publish (isVisible true needs at least one slide), archive or change settings; use zigpoll_update_slide to edit questions.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `pollId` (`string`, required): ID of the poll (survey), the `_id` returned by zigpoll_list_polls.
- `displaySettings` (`object`, optional): Visual display settings object (colors, fonts, position, shape), for example {"backgroundColor": "#212a2f", "align": "right"}.
- `emailDisplaySettings` (`object`, optional): Email delivery display settings object (subject, colors, content), for example {"subject": "Have a minute for a quick survey?"}.
- `isArchived` (`boolean`, optional): Whether the poll is archived.
- `isVisible` (`boolean`, optional): Whether the poll is live. Cannot be set to true if the poll has no slides or is archived.
- `pageDisplaySettings` (`object`, optional): Standalone page display settings object (colors, fonts, layout).
- `pageExcludeRules` (`array`, optional): URL path rules for where the poll must not appear, as a list of strings.
- `pageRules` (`array`, optional): URL path rules for where the poll appears, as a list of strings, for example ["/thank-you"]. Shopify surfaces use fixed paths such as /(.*)/thank_you (Thank You page), /:order_number/orders/:variable (Order Status) and /account (customer accounts).
- `schedule` (`object`, optional): Activation and deactivation schedule, either immediate or scheduled with ISO dates, as a JSON object.
- `settings` (`object`, optional): Poll settings object, for example {"showCounter": true, "allowResubmissions": false, "notifyOnComplete": true}. On update it replaces the entire settings object, so send the full object.
- `smsDisplaySettings` (`object`, optional): SMS delivery settings object, for example {"message": "We want your feedback! Click the link to complete our survey."}.
- `targetingSettings` (`object`, optional): Audience targeting by percentage, geography, browser, device type, referral, IP or metadata, as a JSON object.
- `title` (`string`, optional): New title of the poll.
- `visibilitySettings` (`object`, optional): Auto-open, exit-intent and hide-after rules, for example {"autoOpenDevice": false, "hideAfterSubmission": false}. On update these are merged with existing values, so partial objects are fine.

Example input: `{"pollId":"<pollId>"}`

### `zigpoll_update_slide`

Update Slide · Write

Update an existing slide (question); only the fields you send are changed.
Returns the updated slide object.
Use it to edit question text, answers or settings; settings replaces the whole settings object; use zigpoll_create_slide to add a new question.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `slideId` (`string`, required): ID of the slide (question), the `_id` returned by zigpoll_list_slides.
- `actions` (`array`, optional): Action buttons for action slides, as a list of objects with title, color, icon and link, for example [{"title": "Shop now", "link": "https://example.com"}].
- `answers` (`array`, optional): Answer options for choice-based slide types, as a list of objects with a title, for example [{"title": "Instagram"}, {"title": "A friend"}]. For matrix slides these are the shared columns; for legal-consent pass one answer whose title is the checkbox label.
- `copy` (`string`, optional): Body copy for the slide; HTML is supported.
- `displayLogic` (`array`, optional): Display logic rules controlling when this slide is shown, as a list of rule objects.
- `formInputs` (`array`, optional): Form fields for form slides, as a list of objects with label, type (short-answer, long-answer, email-capture, radio, checkbox, select, inline-multiple-choice or file-upload), optional and options, for example [{"label": "Email", "type": "email-capture", "optional": false}].
- `leftLabel` (`string`, optional): Left label for range, satisfaction and star-rating slides.
- `logic` (`array`, optional): Conditional logic rules for branching and actions, as a list of rule objects.
- `multi` (`boolean`, optional): Allow multiple selections (checkbox and inline-multiple-choice slides).
- `nextSlide` (`string`, optional): ID of the slide to show next, or "-1" to end the survey.
- `placeholder` (`string`, optional): Placeholder text for free-text inputs.
- `pollId` (`string`, optional): ID of the poll the slide belongs to. Defaults to the slide's current poll.
- `rewardBanner` (`string`, optional): Banner text shown above the reward code.
- `rewardCode` (`string`, optional): Discount or reward code shown on reward slides.
- `rewardCodeType` (`string`, optional): How the reward code is produced: static, dynamic or free-shipping. One of: `static`, `dynamic`, `free-shipping`.
- `rightLabel` (`string`, optional): Right label for range, satisfaction and star-rating slides.
- `rows` (`array`, optional): Question rows for matrix slides, as a list of objects with a title, for example [{"title": "Quality"}, {"title": "Price"}]. Each row is answered from the shared answers (columns).
- `settings` (`object`, optional): Slide settings object, for example {"showTitle": true, "optional": false, "hidden": false}. On update it replaces the entire settings object, so send the current settings with your change; hidden true skips the question without deleting it.
- `subtitle` (`string`, optional): Slide subtitle shown under the title.
- `title` (`string`, optional): Slide title (the question text).
- `type` (`string`, optional): Change the slide type to one of the valid slide types. One of: `question`, `checkbox`, `dropdown`, `autocomplete`, `image-choice`, `binary`, `legal-consent`, `inline-multiple-choice`, `star-rating`, `range`, `satisfaction`, `slider`, `short-answer`, `long-answer`, `email-capture`, `phone-capture`, `date`, `file-upload`, `country`, `rank`, `form`, `copy`, `thank-you`, `reward`, `action`, `matrix`.

Example input: `{"slideId":"<slideId>"}`

## Related

Other Marketing connectors ([all 87](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
