Skip to main content
POST
/
v2
/
polls
Create a poll
curl --request POST \
  --url https://api.zenzap.co/v2/polls \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --header 'X-Signature: <api-key>' \
  --header 'X-Timestamp: <x-timestamp>' \
  --data '
{
  "topicId": "550e8400-e29b-41d4-a716-446655440000",
  "question": "Which release should we prioritize?",
  "options": [
    "Bug fixes",
    "New features",
    "Performance improvements"
  ],
  "selectionType": "single"
}
'
{ "id": "770e8400-e29b-41d4-a716-446655440099", "topicId": "550e8400-e29b-41d4-a716-446655440000", "question": "Which release should we prioritize?", "options": [ { "id": "a1b2c3", "text": "Bug fixes" }, { "id": "d4e5f6", "text": "New features" }, { "id": "g7h8i9", "text": "Performance improvements" } ], "selectionType": "single", "status": "active", "createdAt": 1699564800000 }

Documentation Index

Fetch the complete documentation index at: https://docs.zenzap.co/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

Authorization
string
header
required

Use your API key as the Bearer token. You can view your API key and secret in your Zenzap organization API key settings.

X-Signature
string
header
required

HMAC-SHA256 signature for request verification.

Headers

X-Signature
string
required

HMAC signature of the request for authentication and replay protection.

Replay Protection: The signature includes a timestamp to prevent replay attacks. Requests with timestamps older than 5 minutes are rejected.

The signature payload differs by HTTP method:

  • POST/PUT/PATCH/DELETE: HMAC-SHA256 of {timestamp}.{body}
  • GET: HMAC-SHA256 of {timestamp}.{uri}

The signature is calculated as:

  1. Get the current Unix timestamp in milliseconds
  2. Determine the payload:
    • For POST/PUT/PATCH/DELETE: Use {timestamp}.{body} where body is the request body
    • For GET: Use {timestamp}.{uri} where uri is the full request URI (e.g., /v2/members?limit=10)
  3. Calculate HMAC-SHA256 of the combined payload using your API secret
  4. Hex-encode the output
  5. Include the timestamp in the X-Timestamp header

Example for GET request to /v2/members?limit=10:

timestamp = 1699564800000
payload = "1699564800000./v2/members?limit=10"
signature = HMAC-SHA256(secret, payload)
X-Signature: hex(signature)
X-Timestamp: 1699564800000

Example for POST request with body {"topicId":"123","text":"Hello"}:

timestamp = 1699564800000
payload = '1699564800000.{"topicId":"123","text":"Hello"}'
signature = HMAC-SHA256(secret, payload)
X-Signature: hex(signature)
X-Timestamp: 1699564800000

For multipart/form-data requests, sign the exact raw request body bytes (including boundaries and file bytes) as transmitted.

Pattern: ^[a-f0-9]{64}$
Example:

"a3d5f8e7c2b1d4f6a8e9c7b5d3f1a2e4b6c8d0f2e4a6b8c0d2e4f6a8b0c2d4e6"

X-Timestamp
integer<int64>
required

Unix timestamp in milliseconds when the request was created. Used for replay protection - requests older than 5 minutes are rejected.

Example:

1699564800000

Body

application/json
topicId
string<uuid>
required

ID of the topic to post the poll in. The bot must be a member.

Example:

"550e8400-e29b-41d4-a716-446655440000"

question
string
required

The poll question / title.

Maximum string length: 500
Example:

"Which release should we prioritize?"

options
string[]
required

Poll answer options. Each item is the display text; IDs are generated server-side.

Required array length: 2 - 10 elements
Maximum string length: 1000
Example:
[
  "Bug fixes",
  "New features",
  "Performance improvements"
]
selectionType
enum<string>
required

Whether voters may select one or multiple options:

  • single: one choice allowed
  • multiple: any number of choices allowed
Available options:
single,
multiple
Example:

"single"

anonymous
boolean

If true, voter identities are hidden. Anonymous polls do not support voting via the API.

Example:

false

Response

Poll created successfully. The id field is the poll ID — use it as {pollId} when calling POST /v2/polls/{pollId}/votes.

id
string<uuid>

The poll ID. Use this as the pollId path parameter when voting.

Example:

"770e8400-e29b-41d4-a716-446655440099"

topicId
string<uuid>

ID of the topic the poll was posted in.

Example:

"550e8400-e29b-41d4-a716-446655440000"

question
string

The poll question.

Example:

"Which release should we prioritize?"

options
object[]

Poll options with their server-generated IDs.

selectionType
enum<string>
Available options:
single,
multiple
Example:

"single"

status
enum<string>

Current poll status.

Available options:
active,
closed
Example:

"active"

anonymous
boolean

Whether the poll is anonymous.

Example:

false

createdAt
integer<int64>

Creation timestamp in milliseconds.

Example:

1699564800000