Use your own AI agent with Elvo
Let an AI agent such as Claude, ChatGPT, Codex or Cursor read, triage and answer conversations in Elvo through the public API.
You can let your own AI agent work in Elvo: Claude Code, Claude, OpenAI Codex, ChatGPT, Cursor, or a script you write yourself. The agent uses the public REST API, so it can do most of what you do in the dashboard.
What an agent can do
For example, an agent can:
- Draft replies to new conversations for a person to review and send.
- Look up old emails and customer history before it answers.
- Monitor the inbox and flag urgent cases with a tag or an internal note.
- Tag, assign and close conversations, or snooze them.
It can also send replies directly, add internal notes and mention teammates, look up contacts, users and teams, and do admin work such as automation rules, the AI knowledge base and the performance report. For the full technical reference, see the API docs.
The API is included on the Vöxtur (Growth) plan and above.
Step 1: Create an access token
Go to Settings → API & agents and click Create token (you must be an admin). Give it a name, such as "Claude triage", and choose the access:
- Read: the agent can only look (
GETrequests). Start here, for example for monitoring and summaries. - Write: the agent can also reply, add notes and change conversations.
Choose an expiry, then copy the token (it starts with elvo_) and store it safely. Elvo shows it
only once.
The token acts as you. The agent can see and do everything you can in Elvo, including your direct messages and personal inbox.
Step 2: Point your agent at Elvo
Elvo publishes two files written for AI agents:
- https://elvo.is/llms.txt: a short overview of Elvo, every endpoint, and the rules for errors, rate limits and pagination.
- https://elvo.is/api/public/v1/openapi.json: the full OpenAPI spec, with every field and example.
Agents that can run commands (Claude Code, Codex, Cursor) call the API with curl or a short
script. Give the agent the token as an environment variable, such as ELVO_API_TOKEN, not in
the chat itself. Then start with a prompt like this one and change the task to fit your team:
You help our support team in Elvo, our helpdesk.
Read https://elvo.is/llms.txt first. Use the OpenAPI spec at
https://elvo.is/api/public/v1/openapi.json for exact fields.
Base URL: https://elvo.is/api/public/v1
Auth: send "Authorization: Bearer $ELVO_API_TOKEN" on every request.
Task: list open conversations whose latest customer message has waited more
than 30 minutes for a reply. For each one, read the full thread (include
internal notes and events), then save a proposed reply as a draft for a
person to review. Do not send replies to customers. If you are unsure, add
an internal note instead. At the end, summarize what you did.Example tasks
All paths below are under https://elvo.is/api/public/v1.
Find conversations that need an answer
curl "https://elvo.is/api/public/v1/conversations?unanswered_for_minutes=30&archived=hide" \
-H "Authorization: Bearer $ELVO_API_TOKEN"You can also filter by status, team_id, assigned_to_id, tag and channel, or search
subjects with q.
Read a conversation
GET /conversations/{id}/comments?include_internal=true&include_events=true returns the
messages, internal notes and events, newest first. GET /contacts/{id} returns the customer.
Look up customer history
GET /contacts?email=anna@example.com finds the contact. Then
GET /conversations?contact_id=<id> lists all of that customer's earlier conversations.
Save a reply for review
PUT /conversations/{id}/draft with {"content": "..."} saves a draft in the composer. Nothing
is sent. A person opens the conversation, edits the draft and sends it.
Send a reply
curl -X POST https://elvo.is/api/public/v1/conversations/<id>/comments \
-H "Authorization: Bearer $ELVO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"content":"Hi Anna, your order shipped today.","to":["anna@example.com"],"status":"resolved"}'On email conversations to is required. Elvo sends to exactly the addresses you give.
Add an internal note
Use the same endpoint with "is_internal": true. A note is visible to your team only and is
never sent to the customer. Mention a teammate with @[Name].
Assign, tag and change status
curl -X PATCH https://elvo.is/api/public/v1/conversations/<id> \
-H "Authorization: Bearer $ELVO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"assigned_to_id":"<user-id>","tags":["billing"],"status":"pending"}'tags replaces the full list. Get user ids from GET /users and team ids from GET /teams.
Monitor new email
A simple loop works well: every 2 to 5 minutes, call
GET /conversations?unanswered_for_minutes=5&archived=hide. It returns open and pending
conversations where the latest customer message has no reply yet. Have the agent remember
which conversations and messages it has already handled, so that it does not act twice.
Each token can make 200 read and 60 write requests per minute, so polling every few minutes
uses very little of that. If you need changes in real time, register a
webhook instead (conversation.created, comment.created). Webhooks need a server that
can receive requests.
Safety
- Start read-only. Create a Write token only when you trust the agent's results.
- Review before sending. Let the agent save drafts until you have checked its work, then let it send replies.
- Internal notes stay internal. A note never emails the customer. A reply does.
- Keep the token secret. It has your permissions. Keep it in an environment variable or a secrets manager, never in a shared prompt or in code you commit.
- Revoke what you do not use. Set an expiry, and revoke old tokens under Settings → API & agents. A revoked token stops working at once.
Learn more
- API docs: every endpoint and field, and you can try requests live.
- Public API: tokens, authentication and webhooks.