This version is not stable and everything within is subject to change. We recommend using this for test and staging environments, as opposed to within production.
For changes that have been updated across all versions, see the Unversioned changes page.
There are breaking changes in this version, which are detailed below.
A new GET /teams/{team_id}/metrics endpoint is now available, providing real-time per-admin conversation metrics (open, idle, snoozed counts) for a given team. This is designed for workforce management integrations that need to monitor agent workload in real time.
Endpoint: GET /teams/{team_id}/metrics
Path Parameters:
team_id- The ID of the team to retrieve metrics for. UseGET /teamsto list available team IDs.
Optional Parameters:
idle_threshold- Seconds after which an open conversation is considered idle (default: 1800, clamped to 1–86400).
Example Request:
GET /teams/42/metricsExample Response:
{
"type": "team_metric.list",
"data": [
{
"type": "team_metric",
"admin_id": "123",
"open": 5,
"idle": 2,
"snoozed": 1
}
]
}This endpoint requires the real-time monitoring feature to be enabled for your workspace and the read_admins OAuth scope.
For complete documentation, see the Team Metrics API Reference.
The GET /conversations/{id} endpoint now supports an include_email_history query parameter. When set to true, the source object of the conversation (email) will include an email_message_metadata field containing:
message_id— the unique identifier from the email'sMessage-IDheadersubject— the subject of the emailemail_address_headers— a list of an email address headershistory— the HTML content of any quoted or forwarded email history from the initial inbound message
Updated Endpoint:
GET /conversations/{id}?include_email_history=true— returnsemail_message_metadatain thesourceobject
Note: The history is only available for the conversation source (initial part), not for individual conversation parts. This parameter is not available on list/search endpoints.
You can now retrieve a list of deleted conversation IDs and their deletion timestamps using the new GET /conversations/deleted endpoint.
Try Listing Deleted Conversations
Added missing endpoint for retrieving Fin Voice calls associated with a conversation ID. Also backfilled to v2.15.
The fin_replied webhook event now uses a replying status for intermediate reply parts, and a separate fin_status_updated event with awaiting_user_reply fires as a "done" signal when Fin has finished replying. This replaces the previous behavior where every fin_replied event had status: awaiting_user_reply, making it impossible to distinguish intermediate replies from the final one.
Before:
fin_replied (status: awaiting_user_reply) — part 1
fin_replied (status: awaiting_user_reply) — part 2
fin_replied (status: awaiting_user_reply) — part 3After:
fin_replied (status: replying) — part 1
fin_replied (status: replying) — part 2
fin_replied (status: replying) — part 3
fin_status_updated (status: awaiting_user_reply) — done signalWhat changed:
fin_repliedevent:statusenum now includesreplying(new default for intermediate replies) andawaiting_user_reply(legacy)fin_status_updatedevent:statusenum now includesawaiting_user_replyin addition toescalated,resolved, andcomplete
Clients should update their integrations to listen for the fin_status_updated event with status: awaiting_user_reply as the signal that Fin is done replying and the user can respond.
The List all activity logs endpoint now supports filtering by one or more event types via the new event_types query parameter.
Updated Endpoint:
GET /admins/activity_logs- now acceptsevent_types[]query parameter
Example Request:
GET /admins/activity_logs?created_at_after=1677253093&event_types[]=app_name_change&event_types[]=message_state_changeUse the GET /admins/activity_log_event_types endpoint to retrieve all valid event type values.
A new endpoint lets you retrieve all possible event type values for admin activity logs. Use these values to understand what actions are trackable and to filter results when querying the Activity Logs API.
New Endpoint:
GET /admins/activity_log_event_types- List all activity log event types
Example Response:
{
"type": "activity_log_event_type.list",
"event_types": [
"admin_login_success",
"admin_logout",
"app_name_change",
"message_state_change"
]
}OAuth Scope Required: Read admins and teammates
For complete documentation, see the Activity Log Event Types API Reference.
The Delete a conversation endpoint now supports a retain_metrics query parameter that controls how conversation data is deleted:
retain_metrics=true(default): Deletes the conversation while retaining reporting data.retain_metrics=false: Deletes the conversation and all associated reporting data.
Using retain_metrics=false requires the delete_conversations_and_metrics OAuth scope. See OAuth Scopes for details.
Example Request:
curl -X DELETE https://api.intercom.io/conversations/123?retain_metrics=false \
-H 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
-H 'Accept: application/json' \
-H 'Intercom-Version: Unstable'For more info, see this help center article.
A new top-level Folders API is now available at /folders for organizing content into hierarchical folder structures.
New endpoints:
GET /folders— List all folders (supports pagination andparent_folder_idfilter)POST /folders— Create a new folderGET /folders/{id}— Retrieve a folderPUT /folders/{id}— Update a folderDELETE /folders/{id}— Delete a folder (must be empty)
Article and Internal Article changes:
- A
folder_idfield has been added to article and internal article responses, as well as create and update request payloads, allowing you to organize articles into folders. - The
/internal_articles/searchendpoint'sfolder_idparameter now searches recursively through descendant folders.
The Ticket object now includes a previous_ticket_state_id field that returns the ID of the ticket's previous state. This enables tracking ticket state transitions for reporting and compliance. The field returns null when no state change history exists.
You can now create notes on company records via the API using POST /companies/{company_id}/notes, mirroring the existing contact notes functionality. The request and response format is identical to contact notes, with an optional admin_id parameter that defaults to the token owner. Notes are polymorphic — a single note belongs to either a contact or a company, never both.
The admin object returned by GET /admins, GET /admins/{id}, GET /me, and PUT /admins/{id}/away now includes a role attribute when the admin has a role assigned. The role object contains the role id and name.
Example:
{
"type": "admin",
"id": "1295",
"name": "Joe Example",
"role": {
"type": "role",
"id": "456",
"name": "Support Agent"
}
}Note: Admins with custom per-user permissions (no role assigned) will not have the role field.
The display_as query parameter in the Retrieve Conversation and List Conversation Parts endpoints now affects both the body and subject fields of conversation messages when set to plaintext. By default, both fields are returned in HTML format.
Conversation webhook payloads now use the same serialization format as API responses:
- Statistics date fields (
first_contact_reply_at,first_assignment_at,first_admin_reply_at,first_close_at,last_assignment_at,last_assignment_admin_reply_at,last_contact_reply_at,last_admin_reply_at,last_close_at) now return Unix timestamp integers instead of ISO8601 strings. bodyandsubjectfields now return plain text instead of HTML.
We've added a new Data Connectors API that lets you create, update, delete, and list your data connectors, plus view their execution history. Data connectors allow you to make HTTP requests to external APIs from Intercom workflows and AI agents.
Endpoints:
POST /data_connectors- Create a new data connectorPATCH /data_connectors/{id}- Update a data connector (fields, state transitions)DELETE /data_connectors/{id}- Delete a data connectorGET /data_connectors- List all data connectors (paginated)GET /data_connectors/{id}- Retrieve a single data connector with full detailGET /data_connectors/{id}/execution_results- List execution resultsGET /data_connectors/{id}/execution_results/{id}- Retrieve a single execution result
Key Features:
- Create in draft: New connectors start in
draftstate — configure URL, headers, data inputs, and audiences before publishing - Audience targeting: Control which user types (leads, users, visitors) can trigger the connector
- Safe deletion: Returns
409if the connector is in use or not in draft state - Cursor-based pagination: Navigate through data connectors and execution results using
starting_afterandper_page - Filtering: Filter execution results by
success,error_type, and time range - Opt-in bodies: Use
include_bodies=trueto include request/response bodies in execution results - Opt-in request URL: Use
include_request_url=trueto include the sanitised request URL
OAuth Scope Required: Read data connectors (read-only) or Read and write data connectors (create/delete)
For complete documentation and examples, see the Data Connectors API Reference.
You can now receive real-time notifications when Data Connector actions complete execution using the new data_connector.execution.completed webhook topic. This webhook provides operational visibility into connector execution outcomes, including success/failure status, HTTP response codes, error categorization, and execution timing. See the webhook models for details on how to subscribe to execution events.
We've added a new Macros API that provides programmatic access to saved replies (macros) in Intercom. This API enables external applications to retrieve and display your team's pre-written responses, making it easier to integrate Intercom macros with third-party tools and workflows.
New Endpoints:
GET /macros- List all available macros with paginationGET /macros/{id}- Retrieve a specific macro by ID
Key Features:
- Cursor-based pagination: Navigate through large sets of macros efficiently using the
starting_afterparameter with Base64-encoded cursors - Smart placeholder transformation: Macros containing Intercom placeholders (e.g.,
{{user.name}}) are automatically transformed to XML-like attributes (<attribute key="user.name"/>) for easier parsing - Flexible filtering: Use the
updated_sinceparameter to retrieve only recently modified macros - Team visibility controls: Respects macro visibility settings, showing only macros available to the authenticated user's teams
- Channel availability: Each macro indicates where it can be used (
inbox,messenger, or both)
OAuth Scope Required: READ_CONVERSATIONS
Use Cases:
- Integration with training platforms like Solidroad for customer service simulations
- Building custom macro management interfaces
- Exporting macros for documentation or backup purposes
- Analyzing macro usage and content across your organization
Example Request:
curl -X GET https://api.intercom.io/macros?per_page=10 \
-H 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
-H 'Accept: application/json' \
-H 'Intercom-Version: @Unstable'Example Response:
{
"type": "list",
"data": [
{
"type": "macro",
"id": "123",
"name": "Order Status Update",
"body": "<p>Hi <attribute key=\"user.name\" default=\"there\"/>, your order is ready!</p>",
"body_text": "Hi there, your order is ready!",
"created_at": "2025-07-17T11:18:08.000Z",
"updated_at": "2025-07-17T15:30:24.000Z",
"visible_to": "everyone",
"visible_to_team_ids": [],
"available_on": ["inbox", "messenger"]
}
],
"pages": {
"type": "pages",
"per_page": 10,
"next": {
"starting_after": "WzE3MTk0OTM3NTcuMCwgIjEyMyJd"
}
}
}Important Notes:
- This API is currently available in the Unstable version only
- Placeholders in macro bodies are transformed from Intercom format to XML-like attributes
- The pagination cursor encodes
[updated_at, id]for stable ordering - Maximum 150 macros can be retrieved per request
For complete documentation and more examples, see the Macros API Reference.
The WhatsApp Message status API is now available in the Unstable version. This endpoint returns paginated status events for WhatsApp messages sent via the Outbound module, providing information about delivery state and related message details.
Starting in early August 2024, accessing a ticket directly through the Conversations API will requires the "Read tickets" or "Write tickets" scope, as appropriate. When listing conversations or searching conversations, tickets will only be returned in the results if the caller has the "Read tickets" scope.
Previously, tickets were accessible through the Conversations API using only the "Read conversations" or "Write conversations" scope(s). Any apps relying on this behaviour will need to add the appropriate ticket permission, and have users reauthenticate.
We added formatted_phone as a searchable attribute for contacts. This is the contact's phone number normalized to the E164 format.
The Reporting Data Export API now includes a qualified_id field in the get_datasets response to uniquely identify attributes across different types.
Problem Solved: Custom attributes can have the same name across different types (e.g., a "Brand" attribute might exist for both user custom data and conversation custom data). Previously, using just the id field could result in ambiguous attribute selection.
New Field: The qualified_id field uses a namespaced format: "type.name" (e.g., "people.Brand", "conversation.Brand").
Available Prefixes:
people- User custom data attributescompany- Company custom data attributesconversation- Conversation custom data attributesticket- Ticket attributessystem- System-defined attributes
Example Response:
{
"type": "list",
"data": [
{
"id": "conversation",
"name": "Conversation",
"attributes": [
{
"id": "Brand",
"qualified_id": "people.Brand",
"name": "Brand"
}
]
}
]
}Usage: When calling the enqueue endpoint, you must use qualified_id values in the attribute_ids array. The simple id is no longer accepted — use the qualified_id from the get_datasets response to ensure unambiguous attribute selection.