Everything an AI agent can do with the Intercom API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints30
API version2.15
Last updated23 June 2026
Orientation

How the Intercom API works.

The Intercom API is how an app or AI agent works with an Intercom workspace: reading and replying to conversations, creating and updating contacts, managing support tickets, publishing help center articles, and recording the events a customer triggers. Access is granted through an access token, and the OAuth scopes on that token set which data a call can read or change. A workspace lives in a single region with its own data residency, and a state change can fire a webhook to a registered endpoint.

30Endpoints
8Capability groups
14Read
16Write
16Permissions
Authentication
Intercom authenticates every call with an access token sent as an Authorization Bearer header, not a username and password. A private app reads its token from the Developer Hub to act on its own workspace; a public app uses the OAuth 2.0 authorization-code flow to connect a customer's workspace. Intercom's OAuth issues no refresh token, so a token stays valid until access is revoked.
Permissions
An access token carries OAuth scopes that gate which data it can read or change, named in plain terms like 'Read conversations', 'Write conversations', and 'Read and write users'. A method called without the scope it needs returns a 401 with a token_unauthorized error. Webhook topics map to the same scopes, so an app only receives events it is allowed to read.
Versioning
Intercom versions its API with a dotted number, currently 2.15, set per app and overridable per request with the Intercom-Version header. Breaking changes, like removing an operation or renaming a parameter, ship only in a new version, so a pinned integration keeps working until it moves up. A webhook payload follows the version pinned to the app.
Data model
Intercom is resource-oriented REST with JSON requests and responses over https://api.intercom.io. A workspace is hosted in one region (US, EU, or Australia), each with its own base URL, and api.intercom.io routes to the right one. A contact is a user or a lead, conversations and tickets hold the support history, and a state change can fire a webhook topic. Lists and searches are cursor-paginated.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Intercom determines what it can reach. There is a route for making calls, a route for receiving events, and a hosted server that exposes Intercom tools to agents, and each is governed by the token behind it and the permissions that token carries.

Ways to connect

REST API

The REST API takes JSON request bodies, returns JSON, and pages through lists with a cursor, at https://api.intercom.io. A workspace is hosted in one region, and the request can be sent to the regional base, https://api.eu.intercom.io for the EU or https://api.au.intercom.io for Australia, or to api.intercom.io which routes to the workspace's region. A call authenticates with an access token in the Authorization header and pins an API version with the Intercom-Version header.

Best forConnecting an app or AI agent to Intercom.
Governed byThe access token and the OAuth scopes it carries.
Docs ↗

Webhooks

Intercom POSTs a notification to an HTTPS endpoint when a subscribed topic fires, like conversation.user.created or ticket.state.updated. Each topic maps to an OAuth scope, so an app only receives topics its token is allowed to read. The receiver verifies the X-Hub-Signature header against the app's client secret to confirm the request came from Intercom.

Best forReceiving Intercom events at an app or AI agent.
Governed byThe subscribed topics and the scopes behind them.
Docs ↗

MCP server

A hosted Model Context Protocol server at https://mcp.intercom.com/mcp exposes Intercom tools to AI agents and LLM clients, with a deprecated SSE endpoint at https://mcp.intercom.com/sse. It authenticates with OAuth or a Bearer access token and provides 13 tools: a universal search and fetch, plus search_conversations, get_conversation, search_contacts, get_contact, list_companies, get_company, list_articles, search_articles, get_article, create_article, and update_article. It is currently supported only for US-hosted workspaces.

Best forConnecting an AI agent to Intercom through MCP.
Governed byThe OAuth grant or access token and the scopes it carries.
Docs ↗
Authentication

Access token

A private app gets a long-lived access token from the Developer Hub that calls only its own workspace. The token is sent as Authorization: Bearer. It carries the scopes selected for the app, and stays valid until it is revoked. This is the route for an integration acting on a single, known workspace.

TokenBearer access token
Best forA private app acting on its own workspace.
Docs ↗

OAuth 2.0

A public app uses the OAuth 2.0 authorization-code flow so a customer can connect their own Intercom workspace without sharing a token. The app requests only the scopes it needs, and the resulting access token is sent the same way, as Authorization: Bearer. Intercom's OAuth does not issue refresh tokens, so a token stays valid until the user revokes access or the app deauthorizes.

TokenOAuth 2.0 access token (no refresh token)
Best forA public app connecting third-party workspaces.
Docs ↗
Capability map

What an AI agent can do in Intercom.

The Intercom API is split into areas an agent can act on, like contacts, conversations, companies, tickets, articles, and events. Each area has its own methods and its own permission scope, and some grant access to far more than others.

Endpoint reference

Every Intercom API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Contacts

Create, retrieve, update, delete, list, and search contacts (users and leads), and archive or unarchive them.7

Granted by the 'Write users and companies' scope.

Acts oncontact
Permission (capability)Write users
VersionAvailable since the API’s base version
Webhook eventcontact.user.created
Rate limitStandard limits apply

Covered by 'Read one user and one company' or the broader 'Read and list users and companies'.

Acts oncontact
Permission (capability)Read one user
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granted by the 'Write users and companies' scope.

Acts oncontact
Permission (capability)Write users
VersionAvailable since the API’s base version
Webhook eventcontact.user.updated
Rate limitStandard limits apply

Granted by the 'Write users and companies' scope.

Acts oncontact
Permission (capability)Write users
VersionAvailable since the API’s base version
Webhook eventcontact.deleted
Rate limitStandard limits apply

Covered by 'Read and list users and companies'.

Acts oncontact
Permission (capability)Read users
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

A search, sent as a POST with a query body; covered by 'Read and list users and companies'.

Acts oncontact
Permission (capability)Read users
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granted by the 'Write users and companies' scope.

Acts oncontact
Permission (capability)Write users
VersionAvailable since the API’s base version
Webhook eventcontact.archived
Rate limitStandard limits apply

Conversations

Create, retrieve, list, and search conversations, reply to them, and close, snooze, open, or assign them.6

Creating a contact-initiated conversation; the 'Write conversations' scope.

Acts onconversation
Permission (capability)Write conversations
VersionAvailable since the API’s base version
Webhook eventconversation.user.created
Rate limitStandard limits apply

Read-only; the 'Read conversations' scope.

Acts onconversation
Permission (capability)Read conversations
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; the 'Read conversations' scope.

Acts onconversation
Permission (capability)Read conversations
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

A search, sent as a POST with a query body; the 'Read conversations' scope.

Acts onconversation
Permission (capability)Read conversations
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granted by 'Write conversations' ('Reply to, mark as read and close conversations').

Acts onconversation
Permission (capability)Write conversations
VersionAvailable since the API’s base version
Webhook eventconversation.admin.replied
Rate limitStandard limits apply

The message_type in the body selects the action (close, snoozed, open, assignment); the 'Write conversations' scope.

Acts onconversation
Permission (capability)Write conversations
VersionAvailable since the API’s base version
Webhook eventconversation.admin.closed
Rate limitStandard limits apply

Messages

Send an admin-initiated message to a contact, as an in-app message or an email.1

message_type is in_app or email; sending starts a new conversation, governed by the 'Write conversations' scope.

Acts onmessage
Permission (capability)Write conversations
VersionAvailable since the API’s base version
Webhook eventconversation.admin.single.created
Rate limitStandard limits apply

Tickets

Create, retrieve, and update tickets, and reply to them.4

The 'Write tickets' scope ('Create tickets').

Acts onticket
Permission (capability)Write tickets
VersionAvailable since the API’s base version
Webhook eventticket.created
Rate limitStandard limits apply

Read-only; the 'Read tickets' scope ('View tickets').

Acts onticket
Permission (capability)Read tickets
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

The 'Write tickets' scope.

Acts onticket
Permission (capability)Write tickets
VersionAvailable since the API’s base version
Webhook eventticket.state.updated
Rate limitStandard limits apply

The 'Write tickets' scope.

Acts onticket
Permission (capability)Write tickets
VersionAvailable since the API’s base version
Webhook eventticket.admin.replied
Rate limitStandard limits apply

Companies

Create or update a company, retrieve one, and list companies in a workspace.3

An upsert by company_id; granted by 'Write users and companies'.

Acts oncompany
Permission (capability)Write companies
VersionAvailable since the API’s base version
Webhook eventcompany.created
Rate limitStandard limits apply

Covered by 'Read one user and one company' or the broader 'Read and list users and companies'.

Acts oncompany
Permission (capability)Read one company
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Covered by 'Read and list users and companies'.

Acts oncompany
Permission (capability)Read companies
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Articles

Create, retrieve, update, delete, list, and search help center articles.4

The 'Read and Write articles' scope.

Acts onarticle
Permission (capability)Write articles
VersionAvailable since the API’s base version
Webhook eventarticle.created
Rate limitStandard limits apply

Read-only; the 'Read and list articles' scope.

Acts onarticle
Permission (capability)Read articles
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

The 'Read and Write articles' scope.

Acts onarticle
Permission (capability)Write articles
VersionAvailable since the API’s base version
Webhook eventarticle.updated
Rate limitStandard limits apply

Read-only; the 'Read and list articles' scope.

Acts onarticle
Permission (capability)Read articles
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Data events

Submit a data event for a contact and list a contact's recent events.2

The 'Write events' scope ('Ability to submit events').

Acts onevent
Permission (capability)Write events
VersionAvailable since the API’s base version
Webhook eventevent.created
Rate limitStandard limits apply

Read-only; the 'Read events' scope ('List all events belonging to a user').

Acts onevent
Permission (capability)Read events
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Admins

List admins, retrieve one, identify the current admin, and set an admin's away status.3

Read-only; the 'Read admins' scope.

Acts onadmin
Permission (capability)Read admins
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Returns the admin and workspace tied to the token; covered by the 'Read admins' scope.

Acts onadmin
Permission (capability)Read admins
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

The 'Update admins' scope ('Update away mode for admins').

Acts onadmin
Permission (capability)Update admins
VersionAvailable since the API’s base version
Webhook eventadmin.away_mode_updated
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Intercom can notify an app when something happens in a workspace, like a contact starting a conversation or a ticket changing state. It sends a notification with the topic and the affected object, so an integration learns about activity without polling.

EventWhat it signalsTriggered by
contact.user.createdA user (an identified contact) was created in the workspace./contacts
contact.user.updatedA user's attributes changed./contacts/{id}
contact.archivedA contact was archived and removed from active lists./contacts/{id}/archive
contact.deletedA contact was permanently deleted./contacts/{id}
conversation.user.createdA contact started a new conversation./conversations
conversation.admin.repliedAn admin replied to a conversation./conversations/{id}/reply
conversation.admin.closedAn admin closed a conversation./conversations/{id}/parts
conversation.admin.single.createdAn admin started a direct, admin-initiated message to a contact./messages
ticket.createdA ticket was created./tickets
ticket.state.updatedA ticket's state changed./tickets/{id}
ticket.admin.repliedAn admin replied to a ticket./tickets/{id}/reply
company.createdA company was created in the workspace./companies
article.createdA help center article was created./articles
article.updatedA help center article was updated./articles/{id}
event.createdA data event was recorded for a contact./events
admin.away_mode_updatedAn admin's away mode was changed./admins/{id}/away
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Intercom limits how fast an app can call, by a per-app and per-workspace ceiling measured per minute but enforced in ten-second windows.

Request rate

Intercom meters requests by a per-app and per-workspace ceiling, not by a per-method cost. A private app defaults to 10,000 API calls per minute per app and 25,000 per minute per workspace, where multiple private apps in a workspace share the workspace total; a public app gets its own 10,000 per minute that does not count against other apps. The per-minute allowance is enforced in ten-second windows, so a 1,000-per-minute limit permits about 166 calls per ten seconds. A successful response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers, and going over returns HTTP 429.

Pagination

List endpoints are cursor-based: a response includes a pages object with a next cursor, passed as starting_after on the following request, until no further cursor is returned. Search endpoints (a POST with a query body) page the same way through a pagination object. Page size is set with per_page, up to a maximum of 150.

Request size

A list or search page returns at most 150 records, the maximum value of per_page. Data events are listable only while less than 90 days old. A submitted data event returns 202 Accepted with an empty body.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400bad_request / parameter_invalidA general client error, often malformed data or a missing or invalid parameter.Read the error message, fix the request body or parameters, and resend.
401unauthorized / token_unauthorizedNo valid access token was provided, or the token lacks the scope the endpoint needs.Send a valid Bearer token, and confirm the app has the OAuth scope the method requires.
403forbiddenThe request is not allowed for this token, even though it authenticated.Check the app's permissions and the workspace it is acting on.
404not_foundThe resource was not found, or is in a different region than the one called.Verify the id, and confirm the request is hitting the workspace's hosting region.
422unprocessable_entityThe data was well-formed but semantically invalid, for example a value that fails validation.Correct the invalid field named in the error and resend.
429rate_limit_exceededThe app or workspace reached its rate limit. The X-RateLimit-Remaining and X-RateLimit-Reset headers show how many calls are left and when the window resets.Back off until the reset time, then retry, and smooth the request rate across the ten-second windows.
500server_errorAn error on Intercom's side, which can also appear as 502, 503, or 504.Retry with backoff, and contact Intercom support if it persists.
Versioning & freshness

Version history.

Intercom versions its API with a dotted number, like 2.15, sent in the Intercom-Version header, and pins a default version to each app. Breaking changes ship only in a new version, so a pinned integration keeps working until it chooses to move up.

Version history

What changed, and when

Latest version2.15
2.15Current version
Current version (2.15)

The current default API version. Intercom versions with a dotted number sent in the Intercom-Version header and pins a default to each app; breaking changes ship only in a new version.

What changed
  • skip_notifications parameter added when replying to conversations, suppressing notifications while still storing the reply.
  • New ticket.resolved webhook topic, firing when a ticket transitions to resolved.
  • AI Agent resolution_state values renamed: 'abandoned' to 'negative_feedback', 'routed_to_team' to 'escalated'.
  • A company can now be added to a conversation via the Conversations API.
  • language_override field added to create and update contact endpoints.
  • New endpoints for Fin Voice configurations and for exporting workflow configurations.
2.14
Version 2.14

A version that introduced new capabilities across calls, tickets, and messaging.

What changed
  • New Calls API to retrieve calls and related assets (recordings and transcripts).
  • New Internal Articles API to manage internal knowledge base content.
  • Support for multiple message recipients (to, cc, bcc).
2.13
Version 2.13

A dated API version in the supported set, pinned with the Intercom-Version header.

What changed
  • Continued refinement of the contacts, conversations, and tickets resources.
2.12
Version 2.12

An earlier dated API version.

What changed
  • Earlier dated release in the supported version set.
2.11
Version 2.11

An earlier dated API version.

What changed
  • Earlier dated release in the supported version set.

Pin a version on the app and move up on a schedule that suits the integration.

Intercom API changelog ↗
Questions

Intercom API, answered.

What's the difference between an access token and OAuth?+
A private app, one that only touches its own workspace, reads a long-lived access token from the Developer Hub and sends it as a Bearer token. A public app, one that connects other people's workspaces, must use OAuth so a customer authorizes it without ever handing over a token. Intercom's guidance is to never ask a user for their access token and to use OAuth for their data.
Does Intercom's OAuth use refresh tokens?+
No. Intercom's OAuth implementation does not issue refresh tokens. An access token obtained through OAuth stays valid until the user revokes access manually or the app deauthorizes itself, so there is no refresh step to build.
How does API versioning work?+
Each app is pinned to a default version, currently 2.15, set in the Developer Hub. A request can override it by sending the Intercom-Version header, which takes precedence over the app's default. Breaking changes only appear in a new version, so a pinned app keeps working until it deliberately moves up.
What are the rate limits?+
A private app defaults to 10,000 API calls per minute per app and 25,000 per minute per workspace, with multiple private apps sharing the workspace total. A public app gets its own 10,000 per minute. The per-minute allowance is spread across ten-second windows, so the practical ceiling is roughly a sixth of the per-minute number every ten seconds. Going over returns a 429, and the response headers show when the window resets.
Which region should an app call, US, EU, or Australia?+
A workspace is hosted in one region. Calling api.intercom.io lets Intercom route the request to the workspace's region, or an app can call the region directly: api.eu.intercom.io for the EU and api.au.intercom.io for Australia. A call to the wrong region can return a 404, so an app handling multiple customers should send each to the right base URL.
Does Intercom have an MCP server for AI agents?+
Yes. Intercom hosts a remote Model Context Protocol server at https://mcp.intercom.com/mcp that exposes Intercom data to AI tools and LLM clients. It authenticates with OAuth or a Bearer access token and provides 13 tools, including search and fetch plus conversation, contact, company, and article tools. It is currently supported only for US-hosted workspaces.
How do I verify a webhook really came from Intercom?+
Each webhook notification carries an X-Hub-Signature header. The receiver computes an HMAC over the raw request body using the app's client secret and compares it against the header. A mismatch is rejected, which prevents a spoofed request from being treated as a real Intercom event.
Related

More support API guides for agents

What is Bollard AI?

Control what every AI agent can do in Intercom.

Bollard AI sits between a team's AI agents and Intercom. Grant each agent exactly the access it needs, read or write, resource by resource, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared Intercom token.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Intercom
Support Agent
Read conversations ResourceOffReadFull use
Reply to conversations ActionOffReadFull use
Delete conversations ActionOffReadFull use
Per-agent access, set in Bollard AI, not in Intercom