Programmatic access to your surveys, responses and AI analysis. Version v1.
Create an API key in Settings (up to 3 active keys). The plaintext key is shown only once — store it securely. Send it on every request as a Bearer token:
Authorization: Bearer vot_api_xxxxxxxxxxxxxxxx
Requests without a valid, active key receive 401 Unauthorized. If the account's plan is inactive, endpoints return 403 Forbidden. Keys can be rotated (instantly invalidates the old secret) or deleted at any time from Settings.
data field.{ "error": "<code>", "message": "<text>" }.| Method | Path | Description |
|---|---|---|
GET | /surveys | List your surveys. |
POST | /surveys | Create a survey. |
GET | /surveys/{id} | Get a survey with its questions. |
PATCH | /surveys/{id} | Update title, description, status, questions or settings. |
DELETE | /surveys/{id} | Delete a survey and all its data. |
GET | /surveys/{id}/responses | List responses (?limit=, ?offset=). |
GET | /surveys/{id}/analysis | Get cached AI analysis. |
POST | /surveys/{id}/analysis | Generate whole-survey AI analysis (needs ≥3 responses). |
The catalogue below is generated from the active implementation. Query parameters are used for GET requests; other operations accept a JSON object. Path identifiers are supplied in the URL.
Inspect /api/v1/capabilities for machine-readable schemas. MCP create_survey and update_survey wrap survey fields in payload; REST creation and updates accept those fields directly.
Surveys support up to 50 questions and 20 pages. Supply pages, questions, settings, opensAt and closesAt in create or update requests. Scheduling timestamps require an explicit timezone. Publishing requires at least one question.
AI operations may return HTTP 202 with jobId; poll /api/v1/ai/jobs/{job_id}. Read /api/v1/ai/credits before paid operations. Completed analysis is reused until the response count changes; changing language does not trigger regeneration.
CSV response exports contain up to 5000 completed responses; use offset for additional pages. PDF reports include existing insights without generating paid AI analysis. Partial responses have a separate endpoint.
For external response collection, request the survey preview with respondent_id and reuse that identifier when submitting answers keyed by question ID. This keeps A/B variants consistent. Never place a personal API key in a public browser client.
GET /capabilitiesRead the available operations, schemas, permissions and limits.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
POST /surveys/{survey_id}/duplicateDuplicate a survey as a new draft without responses.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"title": {
"maxLength": 2000,
"type": "string"
}
},
"required": [
"survey_id"
],
"type": "object"
}
POST /surveys/{survey_id}/statusPublish, close, or return a survey to draft.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"status": {
"enum": [
"draft",
"published",
"closed"
]
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"status"
],
"type": "object"
}
GET /templatesList localized survey templates.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
GET /templates/{template_id}Read a localized template with questions and theme.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"template_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"template_id"
],
"type": "object"
}
POST /templates/{template_id}/surveysCreate a localized survey from a template without AI credits.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"template_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"title": {
"maxLength": 2000,
"type": "string"
}
},
"required": [
"template_id"
],
"type": "object"
}
GET /question-typesList all supported question types and type-specific configuration fields.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
POST /surveys/{survey_id}/questionsAdd a question to a survey.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"question": {
"type": "object"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"question"
],
"type": "object"
}
PATCH /surveys/{survey_id}/questions/{question_id}Update one question while preserving its identity.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"question": {
"type": "object"
},
"question_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"question_id",
"question"
],
"type": "object"
}
DELETE /surveys/{survey_id}/questions/{question_id}Delete one question and repair branching references.
Required permissions: delete
{
"additionalProperties": false,
"properties": {
"question_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"question_id"
],
"type": "object"
}
POST /surveys/{survey_id}/questions/reorderReorder all questions, preserving page-major ordering.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"order": {
"items": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"maxItems": 50,
"type": "array",
"uniqueItems": true
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"order"
],
"type": "object"
}
GET /surveys/{survey_id}/previewGet resolved A/B questions without recording a view. Use respondent_id to match subsequent JSON submissions.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"respondent_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"seed": {
"maxLength": 2000,
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id"
],
"type": "object"
}
POST /ai/questionsGenerate questions from an idea or incrementally edit existing questions. Costs one credit; may return a job.
Required permissions: write, ai
{
"additionalProperties": false,
"properties": {
"idea": {
"maxLength": 2000,
"type": "string"
},
"pages": {
"items": {
"type": "object"
},
"maxItems": 20,
"type": "array"
},
"questions": {
"items": {
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"idea"
],
"type": "object"
}
GET /ai/jobs/{job_id}Read the status and result of an AI job owned by this account.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"job_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"job_id"
],
"type": "object"
}
POST /surveys/{survey_id}/questions/{question_id}/analysisAnalyze an open-text question. Cached results are free; fresh analysis costs one credit.
Required permissions: write, ai
{
"additionalProperties": false,
"properties": {
"question_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"question_id"
],
"type": "object"
}
GET /ai/creditsRead available AI credits, allowance, consumption and operation costs.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
GET /ai-panel/personasList personas in a personal or organization panel, optionally restricted to a pool.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [],
"type": "object"
}
GET /ai-panel/personas/{persona_id}Read one synthetic persona.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"persona_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"persona_id"
],
"type": "object"
}
POST /ai-panel/personasCreate a persona manually without consuming AI credits.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"attributes": {
"type": "object"
},
"name": {
"maxLength": 2000,
"type": "string"
},
"poolIds": {
"items": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"maxItems": 500,
"type": "array",
"uniqueItems": true
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
}
PATCH /ai-panel/personas/{persona_id}Edit persona attributes and replace pool memberships when supplied.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"attributes": {
"type": "object"
},
"name": {
"maxLength": 2000,
"type": "string"
},
"persona_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"poolIds": {
"items": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"maxItems": 500,
"type": "array",
"uniqueItems": true
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"persona_id"
],
"type": "object"
}
DELETE /ai-panel/personas/{persona_id}Delete a persona from the panel.
Required permissions: delete
{
"additionalProperties": false,
"properties": {
"persona_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"persona_id"
],
"type": "object"
}
GET /ai-panel/poolsList named pools and their persona counts.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [],
"type": "object"
}
GET /ai-panel/pools/{pool_id}Read a named pool and its personas.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"pool_id"
],
"type": "object"
}
POST /ai-panel/poolsCreate a named persona pool.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"description": {
"maxLength": 2000,
"type": "string"
},
"name": {
"maxLength": 2000,
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
}
PATCH /ai-panel/pools/{pool_id}Rename a pool or update its description.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"description": {
"maxLength": 2000,
"type": "string"
},
"name": {
"maxLength": 2000,
"type": "string"
},
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"pool_id"
],
"type": "object"
}
DELETE /ai-panel/pools/{pool_id}Delete a pool and detach its members without deleting personas.
Required permissions: delete
{
"additionalProperties": false,
"properties": {
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"pool_id"
],
"type": "object"
}
POST /ai-panel/pools/{pool_id}/membersAdd or remove personas from a pool in bulk.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"action": {
"enum": [
"add",
"remove"
]
},
"personaIds": {
"items": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"maxItems": 500,
"type": "array",
"uniqueItems": true
},
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"pool_id",
"personaIds",
"action"
],
"type": "object"
}
POST /ai-panel/importImport personas from JSON. Pool metadata is ignored; imported personas are unassigned.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"personas": {
"items": {
"type": "object"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"personas"
],
"type": "object"
}
GET /ai-panel/exportExport personas or one pool as JSON or CSV.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"format": {
"enum": [
"json",
"csv"
]
},
"persona_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [],
"type": "object"
}
POST /ai-panel/generateGenerate personas with AI. Costs five credits per persona, with refunds for missing results.
Required permissions: write, ai
{
"additionalProperties": false,
"properties": {
"ageMax": {
"maximum": 120,
"minimum": 13,
"type": "integer"
},
"ageMin": {
"maximum": 120,
"minimum": 13,
"type": "integer"
},
"count": {
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"description": {
"maxLength": 2000,
"type": "string"
},
"extra": {
"maxLength": 2000,
"type": "string"
},
"genderMix": {
"additionalProperties": false,
"properties": {
"female": {
"maximum": 50,
"minimum": 0,
"type": "integer"
},
"male": {
"maximum": 50,
"minimum": 0,
"type": "integer"
},
"non_binary": {
"maximum": 50,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
}
},
"required": [
"description"
],
"type": "object"
}
GET /ai-panel/costEstimate credits required to administer a survey to a named pool.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"pool_id",
"survey_id"
],
"type": "object"
}
POST /ai-panel/administerAdminister a survey to one named pool. Costs three credits per persona; may return a job.
Required permissions: write, ai
{
"additionalProperties": false,
"properties": {
"pool_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"scope": {
"enum": [
"user",
"org"
],
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"pool_id",
"survey_id"
],
"type": "object"
}
GET /surveys/{survey_id}/resultsRead per-question statistics, A/B breakdowns, views, AI-panel counts and drop-off analysis.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id"
],
"type": "object"
}
GET /surveys/{survey_id}/partial-responsesRead in-progress responses, separately from completed submissions.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id"
],
"type": "object"
}
GET /surveys/{survey_id}/exportDownload completed responses as CSV (up to 5000 per page), or a PDF results report.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"format": {
"enum": [
"csv",
"pdf"
]
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id"
],
"type": "object"
}
POST /surveys/{survey_id}/imagesUpload a base64-encoded PNG, JPEG, GIF or WebP image (maximum 5 MB) for the survey theme.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"content": {
"maxLength": 6990510,
"type": "string"
},
"contentType": {
"enum": [
"image/png",
"image/jpeg",
"image/gif",
"image/webp"
]
},
"field": {
"enum": [
"headerImage",
"backgroundImage"
]
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"field",
"contentType",
"content"
],
"type": "object"
}
POST /surveys/{survey_id}/responsesSubmit a completed response for an external respondent; enforces publication, schedule, branching and duplicate rules.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"answers": {
"type": "object"
},
"completionTimeSeconds": {
"maximum": 604800,
"minimum": 0,
"type": "integer"
},
"respondentInfo": {
"type": "object"
},
"respondent_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"respondent_id",
"answers"
],
"type": "object"
}
POST /surveys/{survey_id}/partial-responsesAutosave an external respondent's partial response when collection is enabled.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"answers": {
"type": "object"
},
"completionTimeSeconds": {
"maximum": 604800,
"minimum": 0,
"type": "integer"
},
"respondentInfo": {
"type": "object"
},
"respondent_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"survey_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"survey_id",
"respondent_id",
"answers"
],
"type": "object"
}
GET /accountRead profile, language, domain, plan and organization access.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
PATCH /accountUpdate display name, service language or custom domain. Does not change email, credentials or billing.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"customDomain": {
"maxLength": 253,
"type": [
"string",
"null"
]
},
"displayName": {
"maxLength": 100,
"minLength": 2,
"type": "string"
},
"preferredLanguage": {
"maxLength": 10,
"type": "string"
}
},
"required": [],
"type": "object"
}
GET /organizationRead the organization, available licenses and shared AI credits.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
GET /organization/membersList organization members, roles, licenses and AI consumption. Administrators only.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
POST /organization/membersAdd an existing Votira account to the organization. Administrators only.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"email": {
"maxLength": 254,
"pattern": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$",
"type": "string"
},
"role": {
"enum": [
"viewer",
"editor",
"admin"
]
}
},
"required": [
"email",
"role"
],
"type": "object"
}
PATCH /organization/members/{member_id}Update a member's role or assigned license. Administrators only; the owner is protected.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"hasLicense": {
"type": "boolean"
},
"member_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"role": {
"enum": [
"viewer",
"editor",
"admin"
]
}
},
"required": [
"member_id"
],
"type": "object"
}
DELETE /organization/members/{member_id}Remove a member without deleting their account. Administrators only.
Required permissions: delete
{
"additionalProperties": false,
"properties": {
"member_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"member_id"
],
"type": "object"
}
GET /organization/invitesList organization invitations without exposing invitation tokens. Administrators only.
Required permissions: read
{
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
}
POST /organization/invitesCreate an invitation and return its share URL. Administrators only.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"email": {
"maxLength": 254,
"pattern": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$",
"type": "string"
},
"role": {
"enum": [
"viewer",
"editor",
"admin"
]
},
"type": {
"enum": [
"member",
"guest"
]
}
},
"required": [
"role"
],
"type": "object"
}
DELETE /organization/invites/{invite_id}Revoke a pending organization invitation. Administrators only.
Required permissions: delete
{
"additionalProperties": false,
"properties": {
"invite_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"invite_id"
],
"type": "object"
}
GET /audit-logSearch the organization's audit trail. Enterprise administrators only.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"category": {
"enum": [
"auth",
"survey",
"results",
"ai",
"keys",
"billing",
"organization",
"profile",
"audit",
"api",
"mcp"
]
},
"date_from": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"date_to": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
},
"search": {
"maxLength": 100,
"type": "string"
}
},
"required": [],
"type": "object"
}
GET /audit-log/exportExport up to 5000 audit entries as CSV. Enterprise administrators only.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"category": {
"enum": [
"auth",
"survey",
"results",
"ai",
"keys",
"billing",
"organization",
"profile",
"audit",
"api",
"mcp"
]
},
"date_from": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"date_to": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
},
"search": {
"maxLength": 100,
"type": "string"
}
},
"required": [],
"type": "object"
}
GET /billing/invoicesList paid personal invoices and, for administrators, organization invoices.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
}
},
"required": [],
"type": "object"
}
GET /billing/invoices/{invoice_id}/pdfDownload a paid invoice PDF after verifying the account's billing ownership.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"invoice_id": {
"maxLength": 100,
"pattern": "^in_[A-Za-z0-9]+$",
"type": "string"
}
},
"required": [
"invoice_id"
],
"type": "object"
}
GET /supportList the account's support tickets, bug reports and feature requests.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 100000,
"minimum": 0,
"type": "integer"
}
},
"required": [],
"type": "object"
}
GET /support/{submission_id}Read a support request and team replies, scoped to its owner.
Required permissions: read
{
"additionalProperties": false,
"properties": {
"submission_id": {
"maxLength": 100,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
}
},
"required": [
"submission_id"
],
"type": "object"
}
POST /supportOpen a support ticket, bug report or feature request.
Required permissions: write
{
"additionalProperties": false,
"properties": {
"category": {
"enum": [
"bug",
"feature",
"ticket"
]
},
"description": {
"maxLength": 5000,
"minLength": 10,
"type": "string"
},
"priority": {
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"problemSolved": {
"maxLength": 5000,
"type": "string"
},
"severity": {
"enum": [
"low",
"medium",
"high",
"critical"
]
},
"stepsToReproduce": {
"maxLength": 5000,
"type": "string"
},
"subject": {
"maxLength": 150,
"minLength": 3,
"type": "string"
},
"ticketCategory": {
"enum": [
"billing",
"technical",
"account",
"other"
]
}
},
"required": [
"category",
"subject",
"description"
],
"type": "object"
}
List surveys
curl -H "Authorization: Bearer $VOTIRA_API_KEY" \ https://votira.co/api/v1/surveys
Create a survey
curl -X POST https://votira.co/api/v1/surveys \
-H "Authorization: Bearer $VOTIRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Pricing validation","description":"Quick check","questions":[]}'
Fetch responses (paginated)
curl -H "Authorization: Bearer $VOTIRA_API_KEY" \ "https://votira.co/api/v1/surveys/srv_123/responses?limit=50&offset=0"
Requests are rate limited per client. Read endpoints allow up to 600 requests/hour; writes and AI analysis are more tightly limited (AI generation is capped at 30/hour). Exceeding a limit returns 429 with the rate_limited error code — back off and retry.
200 / 201 — success.202 — AI job accepted; poll its status.402 — No AI credits remaining.409 — Operation conflicts with the current resource state.400 — invalid request body or parameters.401 — missing or invalid API key.403 — account plan inactive.404 — resource not found.422 — not enough data (e.g. fewer than 3 responses for analysis).429 — rate limit exceeded.502 — AI provider temporarily unavailable.Create your first AI-powered survey in minutes and find out if your idea has legs.
Start Your Free Trial7-day free trial of full features · No credit card required