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.
We now have two separate activity types to show changes to ticket and conversation assignment limits: admin_conversation_assignment_limit_change
and admin_ticket_assignment_limit_change
. Similarly, metadata will show ticket_assignment_limit
and conversation_assignment_limit
instead of assignment_limit
.
The ticket update endpoint (PUT /tickets/{id}
) has been restructured to support workflow execution and explicit admin attribution. This is a breaking change that affects how you specify the admin performing the update and assign tickets.
Key Changes:
- New
admin_id
field: You can now specify which admin is performing the ticket update using the top-leveladmin_id
field. This enables proper workflow execution and attribution of actions to specific admins. - New
assignee_id
field: Direct assignment of tickets is now done via the top-levelassignee_id
field instead of nested within anassignment
object. - Deprecated
assignment
object: The previous method of assigning tickets using the nestedassignment: { admin_id, assignee_id }
structure is no longer supported in v2.14.
Migration Guide:
Previous format (v2.13 and earlier):
{
"ticket_attributes": { ... },
"assignment": {
"admin_id": "123",
"assignee_id": "456"
}
}
New format (v2.14):
{
"ticket_attributes": { ... },
"admin_id": 123,
"assignee_id": "456"
}
Important Notes:
- The
admin_id
field must be an integer and refers to the admin performing the update (not necessarily the assignee) - The
assignee_id
field is a string and refers to the admin or team being assigned to the ticket - If
admin_id
is not provided, the system will use the Operator (Fin) as the default admin - The admin specified in
admin_id
must exist and have access to the workspace, otherwise a 404 error will be returned
We’ve added a new Calls API to retrieve calls and related assets (recordings and transcripts).
New Endpoints:
GET /calls
– List all calls with page-based pagination (page
,per_page
, default 25, max 25)GET /calls/{id}
– Retrieve a call by idGET /calls/{id}/recording
– Redirects (302) to a signed URL for the call’s recording (returns 404 if not available)GET /calls/{id}/transcript
– Returns the call transcript; if none exists, returns[{}]
; returns 404 if the call does not existPOST /calls/search
- Returns calls for the specifiedconversation_ids
(max 20), including transcript and transcript_status when available
Notes:
- Responses and pagination envelopes are consistent with other list endpoints in the API.
- Recording endpoints may return a 302 redirect via the
Location
header.
For complete documentation and more examples, see the Calls API Reference.
Custom away status reasons per workspace can be fetched using the Away Status Reasons API.
You can now integrate your own platform as a custom Intercom channel, by notifying Intercom of events that happen in it (like a user opening a conversation in your platform, or sending a message through your platform).
These API endpoints are part of the closed Beta for "Fin over API", towards allowing Fin to work everywhere.
A new Internal Articles API has been added to manage your internal knowledge base content. This enables teams to automate content management workflows and integrate internal documentation with external systems.
New Endpoints:
GET /internal_articles
- List all internal articles with pagination supportPOST /internal_articles
- Create a new internal articleGET /internal_articles/{id}
- Retrieve a specific internal article by IDPUT /internal_articles/{id}
- Update an existing internal articleDELETE /internal_articles/{id}
- Delete an internal articleGET /internal_articles/search
- Search for internal articles based on query parameters
Request Example:
POST /internal_articles
{
"title": "How to handle refunds",
"body": "Step-by-step guide for processing customer refunds...",
"owner_id": 123456,
"author_id": 123456,
"locale": "en"
}
The News Items API now supports specifying a published_at
date when creating or updating news items. This allows you to set custom publish dates for news items, particularly useful when importing existing content or maintaining historical accuracy.
Key Changes:
- Added
published_at
field to news item responses, showing when the news item was published - Added
published_at
field to newsfeed assignments in both requests and responses - The
published_at
field accepts Unix timestamps (in seconds) - Publish dates must be in the past - future dates are not allowed as scheduling is not supported via the API
Request Example:
POST /news/news_items
{
"title": "Product Update",
"body": "New features released",
"sender_id": "123",
"newsfeed_assignments": [
{
"newsfeed_id": 53,
"published_at": 1664638214
}
]
}
Response includes:
published_at
field at the news item level showing the overall publish datepublished_at
field within each newsfeed assignment showing when it was published to that specific newsfeed
A new Reporting Data Export API has been added to programmatically export reporting datasets. This enables you to download your reporting data for analysis in external tools or data warehouses.
New Endpoints:
POST /export/reporting_data/enqueue
- Enqueue a new reporting data export jobGET /export/reporting_data/{job_identifier}
- Check the status of an export jobGET /export/reporting_data/get_datasets
- List available datasets and their attributes
Key Features:
- Export reporting datasets with customizable attribute selection
- Specify time ranges for data extraction using Unix timestamps
- Support for multiple dataset types (conversation, admin_status_change, conversation_state, etc.)
- Concurrent job limit of 5 pending exports per workspace
- Exported data is delivered as compressed files (.tgz format)
Example Export Request:
POST /export/reporting_data/enqueue
{
"dataset_id": "conversation",
"attribute_ids": [
"conversation_id",
"conversation_started_at"
],
"start_time": 1717490000,
"end_time": 1717510000
}
Response:
{
"job_identifier": "job1",
"status": "pending",
"download_url": "",
"download_expires_at": ""
}
Notes:
- Jobs are processed asynchronously - poll the status endpoint to check completion
- Download URLs are temporary and expire after a set period
- The API respects rate limits to ensure system stability
A new endpoint /jobs/status/{id}
allows you to check the status of asynchronous API operations:
GET /jobs/status/{id}
Returns job execution details including:
- Current status (pending, in_progress, success, failed)
- Resource type and ID when completed
- Direct URL to the created resource
This enables monitoring of background jobs initiated through async endpoints like /tickets/enqueue
.
Quick replies represent admin defined values that an end-user can select, most often represented in the UI as clickable buttons that display below a message. In the Reply to a conversation endpoint, admins can define and send a choice of quick reply options, and end-users can choose their reply and their response can be sent using the API.
The historical reply option choices can be viewed for a conversation part in the metadata of the conversation part.
For example, this is what the quick reply options look like in a quick_reply
part type from a bot.
{
"metadata": {
"quick_reply_options": [
{
"uuid": "1448547007",
"text": "oui",
"translations": {
"en": "yes",
"fr": "oui"
}
},
{
"uuid": "1448547008",
"text": "non",
"translations": {
"en": "no",
"fr": "non"
}
}
]
}
}
Once the contact replies, the metadata on the conversation part will capture their choice and display it like this:
metadata: { quick_reply_option_uuid: '1448547007' }
We've added a new webhook topic conversation.operator.replied
that triggers when Fin or a bot replies to a conversation. This webhook enables real-time notifications for automated operator responses, helping you track and respond to bot interactions in your conversations.
Event Details:
- Topic Name:
conversation.operator.replied
- Description: Triggered when Fin/Bot replies to a conversation
- Required Scope: Read conversations
- Payload: Contains the conversation part created by the operator reply
Added a new optional include_translations
query parameter to the conversation retrieval endpoint (GET /conversations/{id}
). When set to true
, conversation parts will be translated to the detected language of the conversation, enabling multi-language support for conversation content.
Added created_at
and updated_at
fields to the AI Agent rating information within conversation responses. These timestamps provide visibility into when customers rated their AI Agent interactions and when those ratings were last modified.
Added updated_at
field to the conversation rating information within conversation responses. This timestamp provides visibility into when teammate conversation ratings were last modified.
Within the author object of a conversation part we have added two new fields: is_ai_answer
and from_ai_agent
.
Use from_ai_agent
to understand if the bot reply was sent from the AI agent, rather than from a workflow operator or other type of bot.
Use is_ai_answer
to understand if the reply represented in the conversation part was generated by the AI agent.
Added updated_attribute_data
field to ticket part responses to track attribute changes within tickets.
The create message endpooint now supports multiple users in the to
and cc
field in the form of an array of recipient objects.
Similarly the bcc
field has been added.
{
"from": {
"type": "admin",
"id": "991267816"
},
"to": [
{
"type": "user",
"id": "6762f2391bb69f9f2193bc19"
},
{
"type": "lead",
"id": "6762f23c1bb69f9f2193bc1b"
},
{
"type": "user",
"id": "6762f23d1bb69f9f2193bc1c"
}
],
"cc": [
{
"type": "user",
"id": "6762f23e1bb69f9f2193bc1d"
},
{
"type": "user",
"id": "6762f23f1bb69f9f2193bc1e"
}
],
"bcc": [
{
"type": "user",
"id": "6762f23e1bb69f9f2193bc2f"
}
],
"message_type": "conversation",
"body": "heyy"
}
The Create a ticket endpoint now supports immediate assignment when creating tickets. You can specify assignees in the assignment
object:
{
"assignment": {
"admin_assignee_id": "123",
"team_assignee_id": "8"
}
}
admin_assignee_id
: The ID of the admin to assign the ticket toteam_assignee_id
: The ID of the team to assign the ticket to
Both fields are optional. If not provided, the ticket will be created unassigned.
A new endpoint /tickets/enqueue
has been added for asynchronous ticket creation. This endpoint:
- Validates input parameters before enqueuing the job
- Returns a job ID immediately for tracking
- Processes ticket creation asynchronously for better performance with large volumes
POST /tickets/enqueue
{
"ticket_type_id": "88",
"contacts": [{"id": "123"}],
"ticket_attributes": {...}
}
Response includes a job object with:
id
: Job identifier for status trackingstatus
: Current job status (pending, in_progress, success, failed)url
: URL to check job status at/jobs/status/{id}
resource_type
: "ticket"resource_id
: Created ticket ID (when successful)resource_url
: URL to retrieve the created ticket (when successful)
A new webhook topic job.completed
has been added that triggers when an asynchronous API job completes. This allows real-time notifications when background operations finish processing.
The Update a conversation endpoint now supports associating conversations with companies using the company_id
field:
PUT /conversations/{id}
{
"company_id": "5f4d3c1c-7b1b-4d7d-a97e-6095715c6632"
}
- Set
company_id
to associate the conversation with a company - Set to
null
to remove the company association - The company must exist and be accessible within the workspace