{"templateId":"markdown","versions":[{"version":"1.0","label":"v1.0","link":"/docs/references/1.0/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"1.1","label":"v1.1","link":"/docs/references/1.1/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"1.2","label":"v1.2","link":"/docs/references/1.2/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"1.3","label":"v1.3","link":"/docs/references/1.3/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"1.4","label":"v1.4","link":"/docs/references/1.4/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.0","label":"v2.0","link":"/docs/references/2.0/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.1","label":"v2.1","link":"/docs/references/2.1/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.2","label":"v2.2","link":"/docs/references/2.2/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.3","label":"v2.3","link":"/docs/references/2.3/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.4","label":"v2.4","link":"/docs/references/2.4/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.5","label":"v2.5","link":"/docs/references/2.5/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.6","label":"v2.6","link":"/docs/references/2.6/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.7","label":"v2.7","link":"/docs/references/2.7/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.8","label":"v2.8","link":"/docs/references/2.8/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.9","label":"v2.9","link":"/docs/references/2.9/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.10","label":"v2.10","link":"/docs/references/2.10/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.11","label":"v2.11","link":"/docs/references/2.11/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.12","label":"v2.12","link":"/docs/references/2.12/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.13","label":"v2.13","link":"/docs/references/2.13/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.14","label":"v2.14","link":"/docs/references/2.14/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.15","label":"v2.15","link":"/docs/references/2.15/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.16","label":"v2.16","link":"/docs/references/2.16/changelog","default":false,"active":false,"folderId":"a015c489"},{"version":"2.17","label":"v2.17","link":"/docs/references/2.17/changelog","default":false,"active":true,"folderId":"a015c489"},{"version":"2.18","label":"v2.18","link":"/docs/references/changelog","default":true,"active":false,"folderId":"a015c489"},{"version":"Preview","label":"Preview","link":"/docs/references/preview/changelog","default":false,"active":false,"folderId":"a015c489"}],"sharedDataIds":{"sidebar":"sidebar-docs/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Changelog (2.17)","projectTitle":"Intercom and Fin Developer Platform","description":"Faster resolutions, higher CSAT, and lighter support volumes with the only platform to combine the power of automation and human customer support.","siteUrl":"https://developers.intercom.com","image":"/assets/og-image.9c9ef3a6cedbceee0e1d52fae2ffcce97f5a189639cf24e473331da9ad02c5f8.b1bff462.png"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"changelog-217","__idx":0},"children":["Changelog (2.17)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For changes that have been updated across all versions, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/build-an-integration/learn-more/rest-apis/unversioned-changes"},"children":["Unversioned changes"]}," page."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["There are ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/build-an-integration/learn-more/rest-apis/api-changelog#about-breaking-changes-in-the-intercom-api"},"children":["breaking changes"]}," in this version, which are detailed below."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"breaking-changes","__idx":1},"children":["Breaking Changes"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-change-conversation-rating-teammate-returns-workflow-for-workflow-ratings","__idx":2},"children":["Breaking change: conversation rating ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teammate"]}," returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["workflow"]}," for workflow ratings"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a workflow requested a conversation rating and no teammate took part, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversation_rating.teammate"]}," now returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type: \"workflow\""]}," with the workflow's id. Earlier versions return an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["team"]}," reference for these ratings, and its id doesn't identify a teammate in your workspace."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This applies to the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":["Retrieve"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":["List"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":["Search"]}," conversation endpoints, and to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversation.rating.added"]}," webhook."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"breaking-change-contact-search-date-filtering-is-anchored-to-utc","__idx":3},"children":["Breaking change: Contact Search date filtering is anchored to UTC"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/searchcontacts"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/search"]}]}," no longer interprets date filters in the workspace timezone:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Standard timestamp attributes"]}," filter on the exact UTC second you pass, instead of being widened to the whole workspace-timezone day. A value the API returned now matches that contact exactly, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[">"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<"]}," comparisons are second-accurate. Affected attributes: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updated_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["signed_up_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_seen_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_contacted_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_replied_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_email_opened_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["last_email_clicked_at"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ios_last_seen_at"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["android_last_seen_at"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Customer-defined date attributes"]}," are anchored to UTC calendar days rather than workspace-timezone calendar days."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The standard timestamp attributes listed above are also reported as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["datetime"]}," instead of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date"]}," by ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/data-attributes/lisdataattributes"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /data_attributes"]}]},". Customer-defined date attributes are still reported as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Migrating from an earlier version:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Standard timestamp attributes"]}," — a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["="]}," filter that previously matched anything on a given day now matches only that exact second. To keep matching a whole day, bracket it with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[">"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<"]},"; both are exclusive, so pass the second before the day starts and the first second of the next day."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Customer-defined date attributes"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["="]}," still matches the whole day, so existing filters keep working. Only the day boundary moves, from your workspace timezone to UTC."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All stable API versions (2.16 and earlier) are unaffected and continue to bucket date filters by the whole workspace-timezone day."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conversations-html-tables-in-replies-and-notes-are-preserved","__idx":4},"children":["Conversations: HTML tables in replies and notes are preserved"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A reply or note whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," contains ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<table>"]}," markup is stored as a real table, so a later ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]}," returns table markup instead of a single paragraph of concatenated cell text. Previously the structure was discarded and only the cell text survived."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is enabled per workspace and is still rolling out. Until your workspace has access, a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<table>"]}," in a reply ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," continues to be flattened to plain text, as it is today."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The request contract is unchanged — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," is still an HTML string and there is no new parameter. Conversation parts created before this change are unaffected, and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," with no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<table>"]}," behaves exactly as it did."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A table-bearing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," is checked before conversion: at most 200 rows and 50 columns per table, 20 tables and 10,000 cells per message, and no nested tables. Exceeding any limit returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400 Bad Request"]}," naming the limit, rather than truncating. Note that when a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," contains a table, the whole body takes a different conversion path, so other markup in it can come back differently — see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/guides/conversations/supported-html"},"children":["Allowed HTML for conversation replies"]}," for the supported tags, the limits, and the known differences."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Affected endpoints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/replyconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/{id}/reply"]}]}," — both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: comment"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: note"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/tickets/replyticket"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /tickets/{id}/reply"]}]}," — both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: comment"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: note"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On a ticket, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: comment"]}," is rejected for tracker tickets, and for back-office tickets that are not shared with the customer. Those accept ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message_type: note"]}," only. This is existing ticket-reply behaviour and is not specific to tables."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"changes","__idx":5},"children":["Changes"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"qa-review-attributes-removed-from-conversation-custom_attributes","__idx":6},"children":["QA review attributes removed from conversation ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom_attributes"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom_attributes"]}," on conversation responses and webhook payloads no longer includes the attributes written by QA monitors and scorecards: the system-defined ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Review status"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Reviewer"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Has QA Notes"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["QA Notes Count"]},", plus any conversation attribute a QA monitor or scorecard created."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On the conversation endpoints, read QA results as structured data with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["include_monitors=true"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["include_scorecards=true"]},". Webhooks take no such parameter, so a conversation webhook payload no longer carries QA data at all — retrieve the conversation with those parameters when you need it."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This applies to ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/search"]}]},", and conversation webhook payloads. Workspaces on API version 2.16 or earlier that were explicitly opted in to see these attributes continue to see them."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conversations-new-drop_reason-values-for-spam-complaints-and-full-mailboxes","__idx":7},"children":["Conversations: new ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drop_reason"]}," values for spam complaints and full mailboxes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drop_reason"]}," can now report ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_marked_as_spam"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_mailbox_full_suppressed"]},", two new reasons a recipient's address was suppressed:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_marked_as_spam"]}," — the address was suppressed after a spam complaint, from an email provider's feedback loop or an in-app report."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_mailbox_full_suppressed"]}," — the address was suppressed because its mailbox is full."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user_suppressed"]}," is still returned, but no longer implies either cause: it now covers only addresses suppressed manually (for example, by a support teammate) and drop reasons recorded before this change."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"articles-dynamic-content-in-article-bodies","__idx":8},"children":["Articles: dynamic content in article bodies"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The article ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," now keeps dynamic content references when dynamic content is enabled for your workspace. Each reference is an element with the class ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intercom-dynamic-content"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data-intercom-dynamic-content-key"]}," attribute holding the dynamic content's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["key"]},", wrapping the content shown for the article's locale: a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<div>"]}," for block dynamic content and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<span>"]}," for inline dynamic content."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"html","header":{"controls":{"copy":{}}},"source":"<div class=\"intercom-dynamic-content\" data-intercom-dynamic-content-key=\"refund-policy\"><p>You can request a refund within 30 days of purchase.</p></div>\n<p>Call us on <span class=\"intercom-dynamic-content\" data-intercom-dynamic-content-key=\"support-phone-number\">+1-555-0100</span>.</p>\n","lang":"html"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To keep a reference when you create or update an article, send the element back in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]},". Its inner content is ignored, so edit the dynamic content itself to change what readers see. Removing the element removes the reference."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On earlier API versions, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," shows inline dynamic content as the literal text ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["#{{dynamic_content:KEY}}"]},", which is kept if you send it back. Block dynamic content is left out, so updating an article's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," from one of those versions removes its block references."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Affected endpoints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/articles/retrievearticle"},"children":["Retrieve an article"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/articles/createarticle"},"children":["Create an article"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/articles/updatearticle"},"children":["Update an article"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"new-features","__idx":9},"children":["New Features"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conversations-ai-topic-and-subtopic-and-cx-score-reasons-in-custom_attributes","__idx":10},"children":["Conversations: AI Topic and Subtopic and CX Score reasons in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom_attributes"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Conversation responses now include AI Topic and Subtopic classifications and the reasons behind a conversation's CX Score inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom_attributes"]},", under the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AI Topic and Subtopic"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CX Score reasons"]}," keys. AI Topic and Subtopic is an array of objects, each with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["topic_name"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["subtopic_name"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},"; CX Score reasons is an array of objects, each with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"custom_attributes\": {\n    \"AI Topic and Subtopic\": [\n      { \"topic_name\": \"Billing\", \"subtopic_name\": \"Payment Issues\", \"id\": 42 }\n    ],\n    \"CX Score reasons\": [\n      { \"name\": \"Resolution speed\", \"value\": \"Fast\" }\n    ]\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Intercom generates these attributes, so they are returned in responses only and cannot be set. AI Topic and Subtopic requires the AI add-on. Each key is omitted for conversations with no value. This applies to every response and webhook payload that includes a conversation, such as the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":["Retrieve"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":["List"]},", and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":["Search"]}," conversation endpoints."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"dynamic-content","__idx":11},"children":["Dynamic content"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now manage dynamic content: reusable content with a variation per locale, and optionally per brand, that you can insert into Help Center articles. Update a dynamic content once and every article that uses it shows the new value."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/dynamic-content/listdynamiccontents"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /dynamic_contents"]}]}," lists dynamic content, most recently updated first."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/dynamic-content/createdynamiccontent"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /dynamic_contents"]}]}," creates dynamic content. Set ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["content_type"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["inline"]}," for a short value such as a phone number, or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["block"]}," for one or more blocks of content sent as HTML in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/dynamic-content/getdynamiccontent"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /dynamic_contents/{id}"]}]}," retrieves a dynamic content."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/dynamic-content/updatedynamiccontent"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /dynamic_contents/{id}"]}]}," updates its name, default locale or variations. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["variations"]}," replaces the full set."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/dynamic-content/deletedynamiccontent"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /dynamic_contents/{id}"]}]}," deletes a dynamic content that no article uses."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To make a locale or brand show nothing instead of falling back to the default content, send a variation with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intentionally_empty: true"]},". Any content sent with it is ignored, and responses report ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["intentionally_empty"]}," on every variation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reading requires the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read_dynamic_content"]}," scope, and creating, updating and deleting require the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read_write_dynamic_content"]}," scope. The workspace must have dynamic content enabled; otherwise these endpoints respond ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dynamic_content.created"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dynamic_content.updated"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["dynamic_content.deleted"]}," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/2.17/webhooks/webhook-models"},"children":["webhook topics"]}," notify you of changes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"data-connectors-version-history","__idx":12},"children":["Data connectors: version history"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now read the version history of a data connector and annotate its versions. Versions are returned newest-first, and you can retrieve any version's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["definition"]},", the connector's configuration at that version, without affecting the live connector."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Reading versions requires the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read_data_connector_versions"]}," OAuth scope, and updating a note requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read_write_data_connector_versions"]},"."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/data-connectors/listdataconnectorversions"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /data_connectors/{id}/versions"]}]}," — List the versions of a data connector (newest-first, cursor-paginated with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["per_page"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["starting_after"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/data-connectors/retrievedataconnectorversion"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /data_connectors/{id}/versions/{version_id}"]}]}," — Retrieve a single version."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/data-connectors/updatedataconnectorversion"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PATCH /data_connectors/{id}/versions/{version_id}"]}]}," — Update a version's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["note"]},". Send an empty string to clear it."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use a version's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["entity_version_id"]}," as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["version_id"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"folder-management-api","__idx":13},"children":["Folder Management API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A new top-level Folders API is now available at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/folders"]}," for organizing content into hierarchical folder structures."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New endpoints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /folders"]}," — List all folders (supports pagination and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["parent_folder_id"]}," filter)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /folders"]}," — Create a new folder"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /folders/{id}"]}," — Retrieve a folder"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /folders/{id}"]}," — Update a folder"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /folders/{id}"]}," — Delete a folder (must be empty)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Article and Internal Article changes:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["folder_id"]}," field has been added to article and internal article responses, as well as create and update request payloads, allowing you to organize articles into folders."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/internal_articles/search"]}," endpoint's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["folder_id"]}," parameter now searches recursively through descendant folders."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conversation-and-ticket-parts-report-the-teammate-and-team-they-assigned","__idx":14},"children":["Conversation and ticket parts report the teammate and team they assigned"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Conversation parts and ticket parts now carry ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_assignee_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["team_assignee_id"]},", the teammate and the team a part assigned the conversation or ticket to. They appear on ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":["conversations"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/tickets/getticket"},"children":["tickets"]},", and on the webhook payloads built from the same parts. They are named to match the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_assignee_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["team_assignee_id"]}," already returned on conversations and tickets."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A part records a single assignee, so when a part assigns a team and a teammate at the same time, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assigned_to"]}," reports the teammate only. This happens whenever a team's Round Robin distribution resolves the teammate inline, which meant the team a conversation was routed to was not reported at all. The new fields report each assignee separately, so team routing is visible regardless of the team's distribution method:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"type\": \"conversation_part\",\n  \"part_type\": \"assignment\",\n  \"assigned_to\": { \"type\": \"admin\", \"id\": \"991267715\" },\n  \"admin_assignee_id\": 991267715,\n  \"team_assignee_id\": 5017691\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both fields are populated for parts created before this change as well as new ones, so no backfill is needed to see historical team routing."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["How each field behaves, using teammate ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["991267715"]},", team ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5017691"]}," and bot ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["278"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What the part did"},"children":["What the part did"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"assigned_to"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assigned_to"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"admin_assignee_id"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_assignee_id"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"team_assignee_id"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["team_assignee_id"]}]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Assigned a team, resolving a teammate inline (Round Robin)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"admin\", \"id\": \"991267715\"}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["991267715"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5017691"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Assigned a teammate"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"admin\", \"id\": \"991267715\"}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["991267715"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Assigned a team"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"team\", \"id\": \"5017691\"}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5017691"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Assigned a bot"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"bot\", \"id\": \"278\"}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["278"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Removed the team"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"nobody_admin\", \"id\": null}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Removed the teammate"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"nobody_admin\", \"id\": null}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unassigned without naming which kind"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"type\": \"nobody_admin\", \"id\": null}"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Changed no assignment, for example a comment"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A bot appears in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["admin_assignee_id"]},", because assignment treats anything that is not a team as a teammate. On endpoints that omit empty fields, both are absent rather than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," — the same as the neighbouring ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["assigned_to"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"conversations-call_summary-parts-now-identify-the-call-they-describe","__idx":15},"children":["Conversations: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call_summary"]}," parts now identify the call they describe"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call_summary"]}," conversation parts now return ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["event_details"]}," containing the id of the call the summary describes. A conversation can contain several calls, and therefore several ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call_summary"]}," parts side by side; previously nothing in the response indicated which call each summary belonged to."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["New field:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["event_details.call_id"]}," (string) — the id of the call the summary describes. It matches the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," returned by the Calls API and by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call.started"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call.ended"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call.recording_available"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["call.transcription_available"]}," webhook topics, so it can be used as a direct join key."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call summaries are written asynchronously after the call transcript has been processed, so the part's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," can still be empty when you first read the conversation. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["event_details.call_id"]}," is present from the moment the part is created, regardless of whether the summary text has been generated yet."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Affected endpoints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":["Retrieve a conversation"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Conversation parts are only returned by endpoints that return a full conversation, so ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["List all conversations"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Search conversations"]}," are unaffected — their responses return conversation list items, which do not include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversation_parts"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"search-companies","__idx":16},"children":["Search companies"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now search for companies with the new ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/companies/searchcompanies"},"children":["Search companies"]}," endpoint (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /companies/search"]},"), mirroring ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/searchcontacts"},"children":["Search contacts"]},". Filter by standard company fields, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["custom_attributes.{attribute_name}"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tag_id"]}," (which accepts the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["="]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["!="]}," operators). Results use cursor-based pagination via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["starting_after"]},". Companies with no associated users are excluded from results."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"list-contact-activities","__idx":17},"children":["List contact activities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/listcontactactivities"},"children":["list contact activities"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/activities"]},". The endpoint returns a paginated feed of contact lifecycle events on a workspace level — such as creation, role update, merge, and deletion — ordered oldest first. Results use cursor-based pagination via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["starting_after"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"new-contacts-bulk-endpoints","__idx":18},"children":["New contacts bulk endpoints"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"bulk-create-contacts","__idx":19},"children":["Bulk create contacts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/bulkcreatecontacts"},"children":["bulk create contacts"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/bulk"]},". This is a strict create: a contact matching an existing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["external_id"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," is rejected rather than updated. It returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," with a job you can poll via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/bulk/{id}"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"bulk-update-contacts","__idx":20},"children":["Bulk update contacts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/bulkupdatecontacts"},"children":["bulk update contacts"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /contacts/bulk"]},". Contacts are identified by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},". It returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," with a job you can poll via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/bulk/{id}"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"bulk-delete-contacts","__idx":21},"children":["Bulk delete contacts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/bulkdeletecontacts"},"children":["bulk delete contacts"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/bulk/delete"]},". Contacts are identified by ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," and deleted. It returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["202"]}," with a job you can poll via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/bulk/{id}"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"preview-a-contact-merge","__idx":22},"children":["Preview a contact merge"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/previewmergecontact"},"children":["preview a contact merge"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/merge/preview"]}," without applying the merge. It's a read-only dry run: send the same ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["from"]}," (lead) and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["into"]}," (user) contact IDs you'd pass to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/merge"]},", and it reports whether the merge is allowed, without changing anything."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowed"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", the response includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["summary"]}," of every attribute change (with the resulting value on the surviving contact) and, for each object type, two counts: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["from"]}," — how many are on the lead and would move to the user — and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["into"]}," — how many the user already has. Counts are reported for conversations, tickets, phone calls, notes, and tags; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversations"]}," counts non-ticket conversations only, with tickets and phone calls (phone-lead merges only) reported separately. When ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowed"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},", it returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reasons"]},", each with a stable ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["code"]}," and a human-readable ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["message"]}," explaining why."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"list-a-workspaces-deleted-contacts","__idx":23},"children":["List a workspace's deleted contacts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now fetch a paginated list of the contacts in your workspace that are no longer active with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/listdeletedcontacts"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/deleted"]}]},". This helps you recover contacts whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["external_id"]}," you no longer have so you can permanently delete them."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each entry includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," explaining why the contact is inactive — one of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["archived"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["blocked"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merged"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending_deletion"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["permanently_deleted"]}," — along with its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["role"]},", and an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updated_at"]}," UNIX timestamp. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merged_into_id"]}," is included only when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merged"]},". For ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["permanently_deleted"]}," contacts, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["external_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," are returned as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Results are paginated with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["page"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["per_page"]}," (default ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["10"]},", maximum ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["150"]},"). A non-positive ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["page"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["per_page"]}," returns ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP 400 Bad Request"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"contacts-read-email_verified-back-on-the-contact-object","__idx":24},"children":["Contacts: read email_verified back on the contact object"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The contact object response now includes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email_verified"]}," field, so you can read back the value set when you ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/createcontact"},"children":["create"]}," or ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/updatecontact"},"children":["update"]}," a contact. Setting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email_verified"]}," field has been supported since API version 2.16."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email_verified"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," only when the contact's current email address was marked verified through the Contacts API and has not changed since; it becomes ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]}," again if the contact's email changes, until the new address is verified. A lead with a verified email is reused when Intercom later matches an inbound email, or an outbound conversation or ticket, to that address, instead of creating a new lead."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Affected endpoints:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/showcontact"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/{id}"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/showcontactbyexternalid"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts/find_by_external_id/{external_id}"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/listcontacts"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /contacts"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/searchcontacts"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/search"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/createcontact"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/updatecontact"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PUT /contacts/{id}"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/contacts/mergecontact"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /contacts/merge"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/companies/listattachedcontacts"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /companies/{id}/contacts"]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/visitors/convertvisitor"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /visitors/convert"]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"retrieve-the-human-in-the-loop-events-for-a-conversation","__idx":25},"children":["Retrieve the human-in-the-loop events for a conversation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When Fin is unsure of an answer it can consult a teammate before replying, proposing a draft that the teammate approves, steers with feedback, or takes over. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listhitlevents"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}/hitl_events"]}]}," returns those consultations as a list of events, oldest first, across every consultation on the conversation."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"type\": \"list\",\n  \"data\": [\n    {\n      \"hitl_cycle_id\": \"3f2a91c4-8e77-4d61-9a2b-0c5d7e1f4a80\",\n      \"event_type\": \"fin_teammate_input_received\",\n      \"conversation_part_id\": null,\n      \"rule_id\": \"88\",\n      \"rule_name\": \"Refunds over $100\",\n      \"created_at\": 1767225701,\n      \"data\": {\n        \"round_index\": 1,\n        \"teammate_input\": \"Tell them 5 business days.\",\n        \"reviewer_admin_id\": \"4001\",\n        \"regeneration_outcome\": \"answer\"\n      }\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Which fields appear in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," depends on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["event_type"]},":"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"event_type"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["event_type"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"data fields"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," fields"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_consultation_started"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["channel"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_threshold_percent"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["confidence_percent"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sharp_ask"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ask_rationale"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["issue_summary"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["customer_question"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_draft_proposed"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["draft"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_teammate_input_received"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["round_index"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["teammate_input"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer_admin_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["regeneration_outcome"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_draft_revised"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["round_index"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["revised_draft"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["regeneration_outcome"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_consultation_finished"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["outcome"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["approved_draft_type"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["final_draft"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sent_text"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer_admin_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration_seconds"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rounds_count"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["payload_truncated"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every consultation produces a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_consultation_started"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_consultation_finished"]}," event. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_draft_proposed"]}," appears when Fin proposed a draft, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_teammate_input_received"]}," once per round of teammate feedback, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_draft_revised"]}," once per round where Fin produced a revised draft in response. A consultation ends with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["outcome"]}," of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["approved"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["taken_over"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["timed_out_sent"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["timed_out_escalated"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["superseded"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hitl_cycle_id"]}," identifies the consultation, so it is the same on every event of one consultation rather than unique per event. Group events by it to reconstruct a single consultation. A conversation can hold several — one that replaces an outstanding consultation finishes as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["superseded"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A few things to know when reading the response:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Events appear only once a consultation has ended, so one still awaiting a teammate is absent."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["conversation_part_id"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," where an event has no corresponding conversation part. Teammate feedback given through the inbox creates no part, a revised draft has no part of its own, and a consultation that escalated or was superseded sent no reply."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_name"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rule_threshold_percent"]}," are recorded when the consultation begins and not updated afterwards, so a rule renamed or retuned since will not match its current settings. They are ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]}," for consultations no rule triggered."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer_admin_id"]}," is the teammate involved in that event: on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_teammate_input_received"]}," whoever gave the feedback, on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_consultation_finished"]}," whoever approved the draft or took over. On a consultation with several rounds these can be different teammates."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rounds_count"]}," counts every round of feedback the consultation had, while only the ten most recent are returned as events. A heavily steered consultation therefore returns fewer ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fin_teammate_input_received"]}," events than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["rounds_count"]}," reports."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Redacting a conversation removes this data. Depending on how it was redacted, the conversation returns no events, or events whose text fields are all ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Requires the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["read_conversations"]}," scope, and the conversation must be one the caller can access."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"internal-articles-in-ai-agent-content-sources","__idx":26},"children":["Internal articles in AI Agent content sources"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ai_agent.content_sources"]}," list on a conversation now includes the internal articles Fin used, reported with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["content_type"]}," of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["internal_article"]}," alongside the article's title, locale, and a link your teammates can open."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Earlier versions leave internal articles out of the list, so a conversation answered from one returns fewer sources than Fin actually used."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"delete-a-note","__idx":27},"children":["Delete a note"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now delete a single contact or company note with ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/notes/deletenote"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["DELETE /notes/{id}"]}]},". Notes of other kinds cannot be deleted through the API. Requires the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["write_users_companies"]}," OAuth scope."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scorecard-entries-now-include-the-reviewer-and-review-status","__idx":28},"children":["Scorecard entries now include the reviewer and review status"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each entry in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scorecards"]}," array returned with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["include_scorecards=true"]}," now tells you who the review is assigned to and where that review stands, alongside the existing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewed_teammate"]}," (the teammate or AI agent whose handling was scored):"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer"]}," — who the review is assigned to, as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"ai\" }"]}," when it is assigned to Fin or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"admin\", \"admin_id\": \"...\" }"]}," when it is assigned to a teammate. Null when the scorecard has no review yet or the review is unassigned."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["review_status"]}," — the status shown in the QA reviews list: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["unreviewed"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitted"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["passed_review"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["needs_fix"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wont_fix"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fix_complete"]},". Null when the scorecard has no review."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"scorecard_id\": \"67890\",\n  \"name\": \"Standard QA Review\",\n  \"passed\": true,\n  \"score\": 0.85,\n  \"reviewed_teammate\": { \"type\": \"admin\", \"admin_id\": \"991267715\" },\n  \"reviewer\": { \"type\": \"admin\", \"admin_id\": \"884120017\" },\n  \"review_status\": \"submitted\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fields are returned by ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/search"]}]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scorecard-entries-now-include-who-submitted-and-who-last-revised-the-review","__idx":29},"children":["Scorecard entries now include who submitted and who last revised the review"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each entry in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scorecards"]}," array returned with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["include_scorecards=true"]}," now tells you who acted on the review, alongside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer"]}," (who the review is assigned to):"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitted_by"]}," — who last submitted the review, as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"ai\" }"]}," when Fin submitted it or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"admin\", \"admin_id\": \"...\" }"]}," when a teammate did. This can be a different teammate from the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reviewer"]},". Null while the review is unreviewed or when the scorecard has no review."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["revised_by"]}," — who last changed the review after it was submitted, in the same shape. Null while the review is unreviewed, when it has not been changed since it was submitted, or when the scorecard has no review."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"scorecard_id\": \"67890\",\n  \"name\": \"Standard QA Review\",\n  \"reviewer\": { \"type\": \"admin\", \"admin_id\": \"884120017\" },\n  \"review_status\": \"submitted\",\n  \"submitted_by\": { \"type\": \"admin\", \"admin_id\": \"884120017\" },\n  \"revised_by\": null\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fields are returned by ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/search"]}]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scorecard-entries-now-include-review-notes","__idx":30},"children":["Scorecard entries now include review notes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each entry in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scorecards"]}," array returned with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["include_scorecards=true"]}," now carries the notes teammates left on that scorecard's QA review, so you can read the reviewer's commentary next to the score it explains:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["notes"]}," — an array holding each note on the linked review, oldest first. Empty when the scorecard has no linked review."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each note has an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["created_at"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updated_at"]}," timestamps, an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["author"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["author"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"admin\", \"admin_id\": \"...\" }"]}," when a teammate wrote the note, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{ \"type\": \"ai\" }"]}," when Fin did, and null when the teammate who wrote it has since been deleted. The body is the plain text the teammate typed; it is not rendered as HTML."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"scorecard_id\": \"67890\",\n  \"name\": \"Standard QA Review\",\n  \"reviewer\": { \"type\": \"admin\", \"admin_id\": \"884120017\" },\n  \"review_status\": \"submitted\",\n  \"notes\": [\n    {\n      \"id\": \"9001\",\n      \"created_at\": 1734537900,\n      \"updated_at\": 1734537900,\n      \"author\": { \"type\": \"admin\", \"admin_id\": \"884120017\" },\n      \"body\": \"Great empathy in the second reply.\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The field is returned by ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/search"]}]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"scorecard-evaluators-now-include-readable-names-labels-and-reasons","__idx":31},"children":["Scorecard evaluators now include readable names, labels and reasons"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each evaluator in a scorecard entry's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["evaluators"]}," array previously exposed only ids. It now also carries the human-readable name and result labels, so you can display a scorecard without looking up every id yourself:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]}," — the evaluator's (criterion's) name. Null if it could not be resolved."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.value_label"]}," — the label of the rating option matching ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.value"]}," (for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Needs improvement"]},"). Omitted when the label could not be resolved."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["result.reasons"]}," — the structured reasons chosen for the result, each with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["name"]},". Omitted when none were chosen."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"evaluator_id\": \"54321\",\n  \"name\": \"Tone of voice\",\n  \"result\": {\n    \"value\": \"pass\",\n    \"value_label\": \"Pass\",\n    \"source\": \"ai\",\n    \"reasoning\": \"The agent acknowledged the issue and resolved it within the same response.\",\n    \"reasons\": [\n      { \"name\": \"Clear and concise\" },\n      { \"name\": \"Empathetic tone\" }\n    ]\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The fields are returned by ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/listconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations"]}]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/retrieveconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /conversations/{id}"]}]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/searchconversations"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/search"]}]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"failed-otp-email-verifications-now-tell-you-why","__idx":32},"children":["Failed OTP email verifications now tell you why"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ai_agent_event"]}," conversation part with the event type ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["otp_email_verification_failed"]}," now carries a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason"]}," naming why the one-time passcode email could not verify the contact:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"part_type\": \"ai_agent_event\",\n  \"event_details\": {\n    \"event\": {\n      \"type\": \"otp_email_verification_failed\",\n      \"value\": \"OTP email verification failed\",\n      \"data\": {\n        \"otp_email_verification_failed\": {\n          \"reason\": \"no_email\"\n        }\n      }\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The reason you can receive today is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["no_email"]},": the workspace requires email verification before Fin runs an authenticated action, and the contact has no email address on record."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Treat ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reason"]}," as a free-form string. More reasons may follow, so fall back to the event's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["value"]}," for a reason you do not recognise. A failure recorded without a reason returns an empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," object."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This applies to the conversation and conversation part endpoints and to conversation webhook topics. Earlier versions continue to return an empty ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," object for this event."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"assign-a-closed-conversation-without-reopening-it","__idx":33},"children":["Assign a closed conversation without reopening it"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Assigning a closed conversation reopens it. You can now keep it closed by passing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skip_reopen"]}," on an assignment to ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/rest-api/api.intercom.io/conversations/manageconversation"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /conversations/{id}/parts"]}]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"message_type\": \"assignment\",\n  \"type\": \"admin\",\n  \"admin_id\": \"991267708\",\n  \"assignee_id\": \"4324241\",\n  \"skip_reopen\": true\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The conversation keeps its original close timestamp, no reopen event is recorded, and the assignment does not count as a new closure in reporting. This lets you reassign a batch of closed conversations — when a teammate leaves, or an inbox is retired — without changing your closure metrics."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["skip_reopen"]}," is optional and defaults to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["false"]},", so assignment behaves as before unless you set it. Open and snoozed conversations are unaffected."]}]},"headings":[{"value":"Changelog (2.17)","id":"changelog-217","depth":1},{"value":"Breaking Changes","id":"breaking-changes","depth":2},{"value":"Breaking change: conversation rating teammate returns workflow for workflow ratings","id":"breaking-change-conversation-rating-teammate-returns-workflow-for-workflow-ratings","depth":3},{"value":"Breaking change: Contact Search date filtering is anchored to UTC","id":"breaking-change-contact-search-date-filtering-is-anchored-to-utc","depth":3},{"value":"Conversations: HTML tables in replies and notes are preserved","id":"conversations-html-tables-in-replies-and-notes-are-preserved","depth":3},{"value":"Changes","id":"changes","depth":2},{"value":"QA review attributes removed from conversation custom_attributes","id":"qa-review-attributes-removed-from-conversation-custom_attributes","depth":3},{"value":"Conversations: new drop_reason values for spam complaints and full mailboxes","id":"conversations-new-drop_reason-values-for-spam-complaints-and-full-mailboxes","depth":3},{"value":"Articles: dynamic content in article bodies","id":"articles-dynamic-content-in-article-bodies","depth":3},{"value":"New Features","id":"new-features","depth":2},{"value":"Conversations: AI Topic and Subtopic and CX Score reasons in custom_attributes","id":"conversations-ai-topic-and-subtopic-and-cx-score-reasons-in-custom_attributes","depth":3},{"value":"Dynamic content","id":"dynamic-content","depth":3},{"value":"Data connectors: version history","id":"data-connectors-version-history","depth":3},{"value":"Folder Management API","id":"folder-management-api","depth":3},{"value":"Conversation and ticket parts report the teammate and team they assigned","id":"conversation-and-ticket-parts-report-the-teammate-and-team-they-assigned","depth":3},{"value":"Conversations: call_summary parts now identify the call they describe","id":"conversations-call_summary-parts-now-identify-the-call-they-describe","depth":3},{"value":"Search companies","id":"search-companies","depth":3},{"value":"List contact activities","id":"list-contact-activities","depth":3},{"value":"New contacts bulk endpoints","id":"new-contacts-bulk-endpoints","depth":3},{"value":"Bulk create contacts","id":"bulk-create-contacts","depth":4},{"value":"Bulk update contacts","id":"bulk-update-contacts","depth":4},{"value":"Bulk delete contacts","id":"bulk-delete-contacts","depth":4},{"value":"Preview a contact merge","id":"preview-a-contact-merge","depth":3},{"value":"List a workspace's deleted contacts","id":"list-a-workspaces-deleted-contacts","depth":3},{"value":"Contacts: read email_verified back on the contact object","id":"contacts-read-email_verified-back-on-the-contact-object","depth":3},{"value":"Retrieve the human-in-the-loop events for a conversation","id":"retrieve-the-human-in-the-loop-events-for-a-conversation","depth":3},{"value":"Internal articles in AI Agent content sources","id":"internal-articles-in-ai-agent-content-sources","depth":3},{"value":"Delete a note","id":"delete-a-note","depth":3},{"value":"Scorecard entries now include the reviewer and review status","id":"scorecard-entries-now-include-the-reviewer-and-review-status","depth":3},{"value":"Scorecard entries now include who submitted and who last revised the review","id":"scorecard-entries-now-include-who-submitted-and-who-last-revised-the-review","depth":3},{"value":"Scorecard entries now include review notes","id":"scorecard-entries-now-include-review-notes","depth":3},{"value":"Scorecard evaluators now include readable names, labels and reasons","id":"scorecard-evaluators-now-include-readable-names-labels-and-reasons","depth":3},{"value":"Failed OTP email verifications now tell you why","id":"failed-otp-email-verifications-now-tell-you-why","depth":3},{"value":"Assign a closed conversation without reopening it","id":"assign-a-closed-conversation-without-reopening-it","depth":3}],"frontmatter":{"seo":{"title":"Changelog (2.17)"}},"lastModified":"2026-10-14T09:27:37.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/references/2.17/changelog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}