# Elvo
> Elvo is an AI-first customer service platform. Conversations arrive from email, chat, and other channels; AI drafts and auto-replies handle most of the load with human agents supervising.
## Agent quickstart (read this first)
You are an AI agent working in an Elvo helpdesk through the REST API. Human guide: https://elvo.is/help/ai-agents. Full reference: https://elvo.is/docs (OpenAPI: https://elvo.is/api/public/v1/openapi.json; every operation has an `operationId`).
1. **Auth.** Send `Authorization: Bearer elvo_...` on every request to https://elvo.is/api/public/v1. A token is created in Settings → API & agents (Icelandic: API og gervigreind) and acts as the person who created it: you see and do what they can. Read tokens can only GET; write tokens can also POST, PUT, PATCH and DELETE.
2. **Who am I.** `GET /me` returns the user the token acts as. Use that user id to recognise your own comments, drafts and assignments.
3. **List work, newest first.** `GET /conversations?status=open` (default order is `created_at` descending). Without `status` you get every status, including spam (`ignored`) and trash (`deleted`). Snoozed conversations are hidden by default (`snoozed=hide`); archived ones are included by default (`archived=all`, pass `archived=hide` to match the inbox). Page with `cursor` and `limit` (max 100).
4. **Read the full timeline.** `GET /conversations/{id}/comments?include_internal=true&include_events=true`. Comments come newest first in `data`; with `include_events=true` the events (assign, tag, status changes) come in a separate top-level `events` array, oldest first. Read `content_text` (plain text, quoted email history removed); `content` is the stored body and `content_format` says if it is `html` or `text`. Email messages carry `from`, `to`, `cc`. In events, `before`/`after`/`metadata` are internal and unstable: display them, do not depend on their keys.
5. **Act.** Three different things:
- **Reply** (reaches the customer): `POST /conversations/{id}/comments` with `{"content": "...", "to": ["customer@example.com"]}`. On email conversations `to` is required; the server never guesses recipients. Add `"status": "resolved"` to close in the same call.
- **Internal note** (team only, sends nothing): same endpoint with `"is_internal": true`. Plain text with light markdown; mention a teammate with `@[Full Name]`.
- **Draft** (a person reviews and sends it; nothing is sent): `PUT /conversations/{id}/draft` with `{"content": "..."}`. The body is normalised to HTML (for example wrapped in `
`). Each person has their own draft on a conversation, and the token user's draft is yours: GET, PUT and DELETE only read, write and remove that draft, never a teammate's. It shows in the conversation for everyone on the team who opens it, with the token user as author, so a teammate can review, edit and send it.
6. **Change state.** `PATCH /conversations/{id}` with `status`, `assigned_to_id`, `team_id`, `subject`, or tags. `tags` replaces the whole list; use `add_tags` / `remove_tags` to change some tags without reading the list first. Tag names are case-sensitive and an unknown name creates the tag.
7. **Keep up with changes.** Either poll `GET /conversations?sort=updated_at&order=asc&updated_after=` and dedupe by `id` (the overlap covers email that carries its sent time, which can precede its arrival), or register a webhook (`POST /webhooks`) for `conversation.created`, `conversation.updated` and `comment.created`. Webhooks never deliver internal notes and are not replayed while an endpoint is disabled, so a poll is still the safe way to reconcile.
**Facts to rely on**
- IDs are UUIDs. `conversation_number` is the short number people see, not an id.
- Statuses: `open` (needs your team), `pending` (waiting for the customer), `resolved` (done; there is no `closed`, use `resolved`), `ignored` (spam), `deleted` (trash). A new customer message normally reopens a conversation to `open`.
- Errors are JSON: `{ "error": { "type", "message", "details" } }`. Read `message`; it says what to fix. Unknown query parameters and body fields are rejected with `400 validation_error` rather than ignored; an unsupported HTTP method gets `405 method_not_allowed`.
- Rate limits: 200 reads and 60 writes per minute per token. On `429`, wait `Retry-After` seconds. See "Rate limits" below.
- New response fields can appear at any time. Ignore fields you do not know.
## Products
Elvo is a unified customer-service platform (þjónustuborð / helpdesk) for Icelandic businesses. One AI service agent, "Elvo-þjónninn", answers across every channel, resolving simple requests automatically or drafting replies a human approves. Everything lands in one shared helpdesk where the team takes over with full context.
- Spjallþjónn (web chat): answers website visitors instantly from your own content and hands complex cases to the team. https://elvo.is/spjallthjonn
- Svarþjónn (email & messages): reads email, social messages, and web-form submissions, triages them, and writes reply drafts you approve. https://elvo.is/svarthjonn
- Raddþjónn (voice): answers phone calls in Icelandic, resolves simple requests, transfers to a person during opening hours, and otherwise takes a message. https://elvo.is/raddthjonn
- Þjónustuborð (helpdesk): the shared inbox that unifies every channel, enriched with AI and integrations. https://elvo.is/thjonustubord
## Pricing
Per-seat monthly plans, billed in ISK (+VAT). Four tiers: Lítill, Vöxtur (recommended), Stór, and Sérsniðið (custom pricing for larger organizations). The Raddþjónn voice agent is a paid add-on. Current prices: https://elvo.is/verdskra
## Company
Elvo is an Icelandic company serving Icelandic businesses; the product and its AI agents operate in Icelandic. Security and privacy: GDPR-compliant with a data-processing agreement, all data hosted within Europe (EU), AES-256 encryption in transit and at rest, and full audit trails.
- Home: https://elvo.is/
- Pricing: https://elvo.is/verdskra
- Web chat agent (Spjallþjónn): https://elvo.is/spjallthjonn
- Email agent (Svarþjónn): https://elvo.is/svarthjonn
- Voice agent (Raddþjónn): https://elvo.is/raddthjonn
- Helpdesk (Þjónustuborð): https://elvo.is/thjonustubord
- About us: https://elvo.is/um-okkur
## Public REST API
Elvo exposes a public REST API for AI agents and integrations. Authenticate with a Bearer token (format `elvo_...`) created in Settings → API & agents. Read tokens can only make GET/HEAD requests; write tokens can also POST, PUT, PATCH, and DELETE.
- OpenAPI spec: https://elvo.is/api/public/v1/openapi.json
- Interactive docs: https://elvo.is/docs
- Guide for AI agents: https://elvo.is/help/ai-agents
- Base URL: https://elvo.is/api/public/v1
## Endpoints (v1)
All endpoints return JSON with envelope `{ "data": ... }` for single resources or `{ "data": [...], "pagination": { "next_cursor", "has_more" } }` for lists. Cursor pagination: `?cursor=...&limit=25` (max 100). Each line shows the `operationId` in brackets.
- POST /conversations (createConversation): Create a conversation.
- GET /conversations (listConversations): List conversations. Query: status, assigned_to_id, team_id, contact_id, channel, channel_id, tag, q, contact_email, created_after, updated_after, sort, order, snoozed, archived, unanswered_for_minutes.
- POST /conversations/drafts (createConversationDraft): Create an outbound compose draft.
- GET /conversations/{conversationId} (getConversation): Get a conversation.
- PATCH /conversations/{conversationId} (updateConversation): Update a conversation.
- POST /conversations/{conversationId}/snooze (snoozeConversation): Snooze a conversation.
- DELETE /conversations/{conversationId}/snooze (unsnoozeConversation): Unsnooze a conversation.
- GET /conversations/{conversationId}/comments (listComments): List conversation comments. Query: include_internal, include_events.
- POST /conversations/{conversationId}/comments (createComment): Send a reply or add an internal note.
- PATCH /conversations/{conversationId}/comments/{commentId} (updateComment): Edit an internal note.
- DELETE /conversations/{conversationId}/comments/{commentId} (deleteComment): Delete an internal note.
- GET /conversations/{conversationId}/draft (getDraft): Get your draft on the conversation.
- PUT /conversations/{conversationId}/draft (upsertDraft): Create or update your draft on the conversation.
- DELETE /conversations/{conversationId}/draft (deleteDraft): Delete your draft on the conversation.
- GET /chats (listChats): List your chats.
- GET /chats/{chatId} (getChat): Get a chat.
- GET /mentions (listMentions): List my mentions. Query: since, author_id, kind.
- GET /chats/{chatId}/messages (listChatMessages): List chat messages. Query: include_events.
- POST /chats/{chatId}/messages (createChatMessage): Post a chat message.
- PATCH /chats/{chatId}/messages/{messageId} (updateChatMessage): Edit a chat message.
- DELETE /chats/{chatId}/messages/{messageId} (deleteChatMessage): Delete a chat message.
- GET /contacts (listContacts): List contacts. Query: q, email.
- GET /contacts/{contactId} (getContact): Get a contact.
- GET /organization (getOrganization): Get current organization.
- POST /attachments (createAttachment): Upload an attachment.
- GET /webhooks (listWebhooks): List webhook endpoints.
- POST /webhooks (createWebhook): Create a webhook endpoint.
- GET /webhooks/{webhookId} (getWebhook): Get a webhook endpoint.
- PATCH /webhooks/{webhookId} (updateWebhook): Update a webhook endpoint.
- DELETE /webhooks/{webhookId} (deleteWebhook): Delete a webhook endpoint.
- GET /users (listUsers): List team members. Query: include_deactivated.
- GET /users/{userId} (getUser): Get a team member.
- PATCH /users/{userId} (updateUser): Change a member's role.
- DELETE /users/{userId} (deactivateUser): Deactivate a member.
- POST /users/{userId}/reactivate (reactivateUser): Reactivate a deactivated member.
- GET /invitations (listInvitations): List pending invitations.
- POST /invitations (createInvitation): Invite a member.
- DELETE /invitations/{invitationId} (deleteInvitation): Revoke an invitation.
- GET /teams (listTeams): List teams.
- POST /teams (createTeam): Create a team.
- GET /teams/{teamId} (getTeam): Get a team.
- PATCH /teams/{teamId} (updateTeam): Update a team.
- DELETE /teams/{teamId} (deleteTeam): Delete a team.
- GET /teams/{teamId}/members (listTeamMembers): List team members.
- POST /teams/{teamId}/members (addTeamMember): Add a team member.
- PATCH /teams/{teamId}/members/{userId} (updateTeamMember): Change a member's team role.
- DELETE /teams/{teamId}/members/{userId} (removeTeamMember): Remove a team member.
- GET /channels (listChannels): List channels.
- GET /tags (listTags): List tags. Query: q.
- POST /tags (createTag): Create a tag.
- GET /tags/{tagId} (getTag): Get a tag.
- PATCH /tags/{tagId} (updateTag): Update a tag.
- DELETE /tags/{tagId} (deleteTag): Delete a tag.
- GET /canned-responses (listCannedResponses): List canned responses. Query: team_id, category.
- POST /canned-responses (createCannedResponse): Create a canned response.
- GET /canned-responses/{responseId} (getCannedResponse): Get a canned response.
- PATCH /canned-responses/{responseId} (updateCannedResponse): Update a canned response.
- DELETE /canned-responses/{responseId} (deleteCannedResponse): Delete a canned response.
- GET /automation-rules (listAutomationRules): List automation rules.
- POST /automation-rules (createAutomationRule): Create an automation rule.
- GET /automation-rules/{ruleId} (getAutomationRule): Get an automation rule.
- PATCH /automation-rules/{ruleId} (updateAutomationRule): Update an automation rule.
- DELETE /automation-rules/{ruleId} (deleteAutomationRule): Delete an automation rule.
- POST /automation-rules/{ruleId}/apply (applyAutomationRule): Apply a rule to existing conversations.
- GET /knowledge-sources (listKnowledgeSources): List knowledge sources. Query: status, source_type.
- POST /knowledge-sources (createKnowledgeSource): Create a knowledge source.
- GET /knowledge-sources/{sourceId} (getKnowledgeSource): Get a knowledge source.
- PATCH /knowledge-sources/{sourceId} (updateKnowledgeSource): Update a knowledge source.
- DELETE /knowledge-sources/{sourceId} (deleteKnowledgeSource): Delete a knowledge source.
- POST /knowledge-sources/files (uploadKnowledgeSourceFile): Upload a file as a knowledge source.
- PUT /knowledge-sources/{sourceId}/file (replaceKnowledgeSourceFile): Replace the file behind a knowledge source.
- POST /knowledge-sources/{sourceId}/sync (syncKnowledgeSource): Re-sync a live knowledge source.
- GET /reports/performance (getPerformanceReport): Get the performance report. Query: period, from, to, team_id, agent_ids, comparison.
- GET /me (getMe): Get the token owner, organization and token.
- GET /me/out-of-office (getOutOfOffice): Get my out-of-office status.
- PUT /me/out-of-office (setOutOfOffice): Set my out-of-office status.
- DELETE /me/out-of-office (clearOutOfOffice): Clear my out-of-office status.
## Errors
```json
{ "error": { "type": "validation_error", "message": "...", "details": ... } }
```
Types: authentication_error (401), authorization_error (403), validation_error (400), not_found (404), plan_limit (402), conflict (409), rate_limit_exceeded (429), internal_error (500).
## Rate limits
200 read requests/minute and 60 write requests/minute per token (sliding window). Responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` (an ISO 8601 timestamp). A 429 also carries `Retry-After` in seconds. Error responses other than 429 may omit the `X-RateLimit-*` headers.
## Mentions
Notify a teammate from a note or chat message by writing `@[Name]` (their exact display name; matching is case-insensitive and whitespace-tolerant) in the content. Notes also support `@[team:Name]` and `@[everyone]` (admin tokens only). Unmatched names notify no one.
## Workspace administration
Everything under Settings is on the API too: members (`/users`, `/invitations`), teams and membership (`/teams`), inbound channels (`GET /channels`: every mailbox, Meta page, WhatsApp number, widget and phone line with the team it routes to), tags (`/tags`), canned responses (`/canned-responses`), automation/routing rules (`/automation-rules`: full rule JSON, suitable for version control), the AI knowledge base (`/knowledge-sources`: create text or URL sources, upload files, PATCH text or PUT a replacement file to keep the AI fresh from a pipeline), and the performance report (`GET /reports/performance`). Member, invitation, team and knowledge writes need a token created by an organization admin.
## Tags
Conversations carry `tags`: an array of tag names from an org-wide vocabulary (each tag also has a color and emoji; manage the vocabulary via `/tags`). Names are case-sensitive and max 100 characters. Writing `tags` on PATCH replaces the full list (empty array clears); `add_tags` and `remove_tags` change only the names you give. Unknown names create new tags automatically. Filter with `GET /conversations?tag=` (exact name match).
## Not yet in the API
Bulk operations, composer features (scheduled send, forwarding), knowledge files over 4 MB (dashboard only), and rule change history/diff (export rules with GET and keep them in version control). Email elvo@elvo.is if you need one of these.
## Custom integrations & chat widget
Beyond the REST API, Elvo pulls live context from a business's own systems into agent sidebars and AI reply drafts. Built-in connectors: DK, Business Central, Payday, Regla, Shopify, WooCommerce, HubSpot, Dropp, Abler. A custom integration covers any other system via a single HTTPS endpoint the business hosts: Elvo POSTs the contact's identity and latest message, the endpoint returns structured JSON (sidebar fields + an AI summary). Full contract with sample servers: https://elvo.is/docs (section "Custom integrations").
The customer-facing chat widget (Spjallþjónn) embeds on any website with a script snippet from Settings; widget conversations arrive in the workspace like any other channel and are readable via the REST API and webhooks. Embed snippet: https://elvo.is/docs (section "Embedding the chat widget").
## Help center (Icelandic)
- [AI-aðgerðir](https://elvo.is/hjalp/ai-adgerdir)
- [Vefþjónusta (API)](https://elvo.is/hjalp/api)
- [Áskrift og verðskrá](https://elvo.is/hjalp/askrift)
- [Notaðu eigin gervigreind í Elvo](https://elvo.is/hjalp/eigin-gervigreind)
- [Fjarvera](https://elvo.is/hjalp/fjarvera)
- [Flýtilyklar](https://elvo.is/hjalp/flytilyklar)
- [Flytja inn gögn](https://elvo.is/hjalp/flytja-inn-gogn)
- [Frammistaða](https://elvo.is/hjalp/frammistada)
- [Fyrirtækisstillingar](https://elvo.is/hjalp/fyrirtaeki)
- [Fyrstu skref](https://elvo.is/hjalp/fyrstu-skref)
- [Gervigreind — AI-drög og þekkingargrunnur](https://elvo.is/hjalp/gervigreind)
- [Hvað er Elvo?](https://elvo.is/hjalp/hvad-er-elvo)
- [Setja í bið og fresta](https://elvo.is/hjalp/i-bid)
- [Yfirlit](https://elvo.is/hjalp)
- [Leit og geymsla](https://elvo.is/hjalp/leit-og-geymsla)
- [Merki](https://elvo.is/hjalp/merki)
- [Meta (Facebook og Instagram)](https://elvo.is/hjalp/meta)
- [Notendur og hlutverk](https://elvo.is/hjalp/notendur)
- [Persónulegar stillingar](https://elvo.is/hjalp/personulegar-stillingar)
- [Reglur](https://elvo.is/hjalp/reglur)
- [Sameina mál](https://elvo.is/hjalp/sameina-mal)
- [Samþættingar](https://elvo.is/hjalp/samthaettingar)
- [Setja upp spjallþjóninn](https://elvo.is/hjalp/spjallthjonn)
- [Stöðluð svör](https://elvo.is/hjalp/stodlud-svor)
- [Svara viðskiptavinum](https://elvo.is/hjalp/svara-vidskiptavinum)
- [Svarglugginn](https://elvo.is/hjalp/svargluggi)
- [Tengiliðir](https://elvo.is/hjalp/tengilidir)
- [Teymi og samvinna](https://elvo.is/hjalp/teymi)
- [Tilkynningar](https://elvo.is/hjalp/tilkynningar)
- [Undirskriftir](https://elvo.is/hjalp/undirskriftir)
- [Viðmótið](https://elvo.is/hjalp/vidmotid)
- [Að vinna með mál](https://elvo.is/hjalp/vinna-med-mal)
- [Áframsending](https://elvo.is/hjalp/tengja-tolvupost/aframsending)
- [Gmail / Google Workspace](https://elvo.is/hjalp/tengja-tolvupost/gmail)
- [Tengja tölvupóst](https://elvo.is/hjalp/tengja-tolvupost)
- [Fyrir kerfisstjóra: samþykkja Elvo í Microsoft 365](https://elvo.is/hjalp/tengja-tolvupost/kerfisstjori)
- [Outlook / Microsoft 365](https://elvo.is/hjalp/tengja-tolvupost/outlook)
## Help center (English)
- [AI actions](https://elvo.is/help/ai-actions)
- [Use your own AI agent with Elvo](https://elvo.is/help/ai-agents)
- [AI drafts & knowledge base](https://elvo.is/help/ai-drafts-and-knowledge)
- [Public API](https://elvo.is/help/api)
- [Automation rules](https://elvo.is/help/automation-rules)
- [Billing & plans](https://elvo.is/help/billing)
- [Canned responses](https://elvo.is/help/canned-responses)
- [Set up the chat agent](https://elvo.is/help/chat-agent)
- [The composer](https://elvo.is/help/composer)
- [Contacts](https://elvo.is/help/contacts)
- [Import data](https://elvo.is/help/import-data)
- [Overview](https://elvo.is/help)
- [Integrations](https://elvo.is/help/integrations)
- [Keyboard shortcuts](https://elvo.is/help/keyboard-shortcuts)
- [Merging tickets](https://elvo.is/help/merging-tickets)
- [Meta (Facebook & Instagram)](https://elvo.is/help/meta)
- [Notifications](https://elvo.is/help/notifications)
- [Organization settings](https://elvo.is/help/organization)
- [Out of office](https://elvo.is/help/out-of-office)
- [Performance](https://elvo.is/help/performance)
- [Personal settings](https://elvo.is/help/personal-settings)
- [Quickstart](https://elvo.is/help/quickstart)
- [Replying to customers](https://elvo.is/help/replying-to-customers)
- [Search & archive](https://elvo.is/help/search-and-archive)
- [Signatures](https://elvo.is/help/signatures)
- [Snoozing & on hold](https://elvo.is/help/snoozing)
- [Tags](https://elvo.is/help/tags)
- [Teams & collaboration](https://elvo.is/help/teams)
- [The interface](https://elvo.is/help/the-interface)
- [Users & roles](https://elvo.is/help/users-and-roles)
- [What is Elvo?](https://elvo.is/help/what-is-elvo)
- [Working with tickets](https://elvo.is/help/working-with-tickets)
- [Forwarding](https://elvo.is/help/connect-email/forwarding)
- [Gmail / Google Workspace](https://elvo.is/help/connect-email/gmail)
- [Connect email](https://elvo.is/help/connect-email)
- [For IT admins: approve Elvo in Microsoft 365](https://elvo.is/help/connect-email/it-admin)
- [Outlook / Microsoft 365](https://elvo.is/help/connect-email/outlook)