Intercom Tickets
For support teams that track refunds, bugs and back-office requests as Intercom tickets: search the queue by state or assignee, open a ticket of the right ticket type for a customer, move it between ticket states, reassign it, tag it, and post a customer reply or an internal note.
Connect this API to an AI agent Browse all specs
What you can do with Intercom Tickets via MCP
Every endpoint below becomes a governed tool your AI agent (Claude, ChatGPT, or a customer-facing VX agent) can call — with scoped permissions, sandbox testing, and audit logs.
| Method | Path | Operation | Description |
|---|---|---|---|
| POST | /tickets/search |
searchTickets | Search tickets by state, assignee, type, contact or dates |
| GET | /tickets/{ticket_id} |
getTicket | Get a ticket with its attributes, state and contacts |
| PUT | /tickets/{ticket_id} |
updateTicket | Change a ticket's state, assignee or attributes |
| POST | /tickets |
createTicket | Open a ticket of a ticket type for a customer |
| POST | /tickets/{ticket_id}/reply |
replyToTicket | Reply to the customer or add an internal note |
| POST | /tickets/{ticket_id}/tags |
tagTicket | Add a tag to a ticket |
| GET | /ticket_types |
listTicketTypes | List ticket types (customer, back-office, tracker) |
| GET | /ticket_types/{ticket_type_id} |
getTicketType | Get a ticket type with its attribute fields |
| GET | /ticket_states |
listTicketStates | List the ticket states a ticket can move through |
| GET | /admins |
listAdmins | List teammates to find an assignee or reply author id |
| GET | /tags |
listTags | List workspace tags to find a tag id |
Authentication
intercom_token
Bearer token — sent as Authorization: Bearer <token>
Intercom access token, sent as Authorization: Bearer <token>.
How to get a credential
- Open the Intercom Developer Hub (https://app.intercom.com/a/apps/_/developer-hub) and create an app for your workspace.
- Open Configure > Authentication and copy the Access token (it acts on your own workspace). For other workspaces, use OAuth instead.
- Under Permissions, turn on the permissions in the table below and save.
Permissions used
| Permission | Operations |
|---|---|
| Read tickets | searchTickets, getTicket, listTicketTypes, getTicketType, listTicketStates |
| Write tickets | createTicket, updateTicket, replyToTicket, tagTicket |
| Read admins and teammates | listAdmins |
| Read tags | listTags |
Common errors
| Status | Meaning | Fix |
|---|---|---|
| 401 | Token missing or revoked | Copy the access token again from the Developer Hub. |
| 403 | Permission missing | Turn on the permission above for the app and save. |
| 400 | Bad ticket attributes or state | Use attribute names from getTicketType and a ticket_state_id from listTicketStates. |
| 404 | Ticket not found | Use the ticket id from searchTickets (not the ticket number shown to customers). |
| 429 | Rate limit | Wait and retry; workspaces get roughly 10,000 calls per minute per app. |
Workspaces hosted in the EU or Australia use https://api.eu.intercom.io or https://api.au.intercom.io. Store the token as a VX Agents credential (Bearer token).
Usage guide
Setup
- Add an Intercom access token (Developer Hub app) as a VX Agents Bearer credential, with read/write tickets, read admins and read tags permissions.
- Every call pins
Intercom-Version: 2.17. EU or AU workspaces must change the base URL tohttps://api.eu.intercom.ioorhttps://api.au.intercom.io. - Worth pinning: your own
admin_id(fromlistAdmins) for replies and updates.
Work the ticket queue
listTicketTypesandlistTicketStatesonce to learn type ids, their attribute names (getTicketType) and state ids (submitted,in_progress,waiting_on_customer,resolvedcategories).searchTicketswith aquery, e.g.{"field": "admin_assignee_id", "operator": "=", "value": "<admin id>"}; other fields includestate,open,ticket_type_id,contact_ids,team_assignee_id,created_at. Combine withAND/OR; page withpagination.starting_after.getTicketfor the full ticket: attributes, state, contacts and linked conversations.- To open a ticket, confirm with the user, then
createTicketwithticket_type_id,contacts: [{"id": "<contact id>"}](oremail) andticket_attributessuch as_default_title_and_default_description_. - To move or reassign it, confirm, then
updateTicketwithticket_state_id,assignee_id,open: falseto close, andadmin_id(the teammate making the change). - To answer, confirm the text, then
replyToTicketwith{"message_type": "comment", "type": "admin", "admin_id": "...", "body": "..."}. Usenotefor an internal note; tracker and unshared back-office tickets accept only notes. listTagsthentagTicketwith{"id": "<tag id>", "admin_id": "..."}to label it.
Good to know
- Ticket
id(used in paths) differs fromticket_id(the number customers see). - Timestamps are Unix seconds.
- Search allows at most 2 nested filters and 15 filters per
AND/ORgroup; 20 results per page by default. - Replies with
commentreach the customer by email or Messenger, and state changes can trigger workflows: always confirm first. Deleting tickets and editing ticket types are not part of this spec.
Source: Intercom REST API 2.17 reference, Tickets, Ticket Types and Ticket States (https://developers.intercom.com/docs/references/rest-api/api.intercom.io/tickets), checked 2026-10-20.
How to use this spec
- Create a free VX Agents account (sandbox tools included).
- Open the marketplace and connect “Intercom Tickets” to an agent.
- Expose it as an MCP server for Claude/ChatGPT, or chat with it directly.