Expand Fin to email is now live on Fin Academy!
Get more out of Intercom using our API and webhooks
Recently active
I want to make this post as I have spent the last day trying to understand why the X-Hub-Signature being sent in the header wasn’t matching the the HMAC signature that I was getting when converting the JSON body and Client Secret from the request.If you are using Python, MAKE SURE YOU USE SEPARATORS IN THE JSON DUMP BEFORE ENCODING. Here is the method that worked for me: def authenticate_intercom_request(self,x_hub_sig): json_string = json.dumps(self.body, separators=(',', ':')) hashed = hmac.new(self.secret.encode('utf-8'), json_string.encode('utf-8'), sha1) return hmac.compare_digest(hashed.hexdigest(), x_hub_sig[5:])Python by default will add chars in the body that will alter the returned value from Intercom, and without the separators listed above it will always fail.
The Intercom platform has following webhook topics: - conversation.admin.replied -- Admin conversation replies - conversation.operator.replied -- Fin/Bot replies to a conversationHere all topics https://developers.intercom.com/docs/references/webhooks/webhook-modelsDuring the tests with reusable workflow, I noticed that Bot replied are send in both topic. As a result, service receive two messages.Below an example of Bot reply message in `conversation.admin.replied`:{ "type": "notification_event", "app_id": "l4e36xhv", "data": { "type": "notification_event_data", "item": { "id": "215474343849634", "...": "...", "conversation_rating": null, "title": "Andrew", "custom_attributes": {}, "conversation_parts": { "type": "conversation_part.list", "conversation_parts": [ { "type": "conversation_part", "id": "4576
Clari and Salesloft announced the gradual sunset of Drift in March 2026. No hard end-of-life date, no confirmed migration runway. If you're waiting for a firm deadline before you act, that deadline may arrive with less lead time than your data volume requires.This is what to prioritize before your access disappears.The data that's hardest to recover once it's goneNot everything in Drift carries equal weight. Contacts and lead records are relatively portable — CSV exports handle most of it. What's harder to reconstruct is conversation history: transcripts, timestamps, assignees, thread structure, tags, and the metadata that makes historical conversations searchable and useful.Drift enforces a 600 requests/minute API rate limit. That's the hard ceiling on extraction speed regardless of which method you use. If conversation transcripts matter to your team — for training, compliance, context, or handoffs — budget 2–3 weeks for the extraction alone. That's not a migration timeline. That's j
Hi Intercom Team,We're hitting intermittent errors from the REST API that appear out of the blue — not correlated with our request rate or any code change on our side — and that succeed when we retry a short while later.The responses come back as HTML (nginx), not the usual JSON. Two examples:404 Not Found — GET /companies/scroll, x-request-id: 000fb95rqvhcl5nf9to0 403 Forbidden — seen previously (HTML, no x-request-id / x-ratelimit-limit headers)We've increased our retry/backoff, which recovers most occurrences, but some still fail outright.This looks like prior reports:https://community.intercom.com/api-webhooks-23/getting-404-502-and-504-error-from-api-at-the-first-time-then-success-after-retry-10039 https://community.intercom.com/api-webhooks-23/api-requests-are-returning-403-4656Any help here would be pretty appreciated. Happy to share timestamps and more request IDs.Thanks,Faruq
We’re migrating from Zendesk to Intercom.In our App, we have notes that preserve certain actions and any associated Zendesk tickets with URLs to that ticket, like https://{workspace}.zendesk.com/agent/tickets/12345.We’d like to record a direct URL to a ticket in the same fashion with Intercom. However, it’s not immediately apparent what that URL would look like.If I have just created an Intercom ticket via the API with id 12345, what would the URL to that ticket look like?
Hi,I’m using the Intercom Messenger SDK in a React application and I’m trying to pass contextual data onto the conversation as conversation attributes.For example, I want to set values such as:workspace_name workspace_id current_url subscription_plan item_id item_title item_urlThese values are specific to the conversation the user is starting, as a user may be in different workspaces or different parts of the application at different times, so storing this as user attributes is not appropriate because the values can change from conversation to conversation.Fin suggested updating user attributes via the SDK, but that does not solve the problem for us. We need the data attached to the conversation itself, so it can be used reliably in Workflows, Inbox, and downstream connectors.It feels like the Messenger SDK should support setting conversation attributes when opening or creating a conversation. I’d prefer not to make a separate REST API call to update the conversation after it has been
I was wondering if there’s a timeline or expected timeframe at least to when can we expect intercom’s MCP to expand outside the US hosted servers?
Hi,I have embedded the Intercom script using Javascript. When I checked the Intercom setting configuration, everything looked good to me. But when I tried to init Intercom messager, I got an error "Invalid user_hash". Then I tried to check the user_hash value in the setting and compare it to the value in the dashboard. It's all the SAME. Why I still got this error?
Hello,Is it possible to create a side conversation in a ticket using the REST API?
I've been searching through the Intercom docs, asked Fin, and tried Claude, but I can't find a clear answer on this.I want to set up a webhook that triggers for every outbound email we send. When I try conversation.admin.replied and conversation.admin.opened it doesn't work. In an older community thread (link) someone mentions conversation.part.created as the solution, but I can't find that topic anywhere in the current webhook configuration.It has to trigger the webhook when a reply in a conversation is made, when a new conversation is made. It just has to trigger after every email that we send.What's the correct webhook topic to use for all outbound mail?
Intercom has multiple conversation-related webhooks.When a new conversation is created in the Intercom Inbox, the `conversation.*` topics are not triggered.Below the screenshots on how a new conversation is created. Thanks for help!
I am using the MCP search_articles here: https://developers.intercom.com/docs/guides/mcp#_-9Currently, help center filtering does not work. I suspect this is because the MCP endpoint uses help_centre_id while the REST API (https://developers.intercom.com/docs/references/rest-api/api.intercom.io/articles/searcharticles) uses help_center_id.This means if I am trying to filter by a specific help center using MCP search_articles this doesn't work and I get articles from all help centers regardless of my filter.I am currently using the REST API as a workaround which does correctly filter by help center.Is it possible that MCP search_articles needs changed to use help_center_id and not help_centre_id?
Hi Intercom Support Team, We’re intermittently seeing issues with the Companies Scroll API (/companies/scroll) in production. Our integration fetches over 100,000 company records, and while it often works, it occasionally fails with scroll_exists ("scroll already exists"). We have verified that no concurrent jobs are running on our side when this happens. We also implemented retries with long delays (up to 5 minutes), but the same error can still persist. Based on your docs, we expected scroll sessions to expire after 1 minute of inactivity, but in these cases that does not appear to happen. Because this is intermittent, it can be difficult to reproduce consistently, but it is recurring enough to impact our pipeline. Could you please investigate and advise on possible causes or recommended handling?Best RegardsUsama
I noticed what looks like a type inconsistency between two related schemas in the REST API.On the Admin object (/admins/admin), the id field is defined as a string — and the example values in the docs reflect this (e.g. "493881", "1295").However, on the Contact object, the owner_id field — which the docs describe as "the id of an admin that has been assigned account ownership of the contact" — is defined as an integer.These two fields represent the same value (an admin's ID), but they're typed differently depending on which side of the relationship you're looking at. This creates a few practical problems:Strict-typed languages choke on this. If I model Admin.id as a string and Contact.owner_id as an integer (matching the docs), I can't do a straightforward equality check without casting one or the other. Search filter confusion. When using the Search Contacts endpoint and filtering by owner_id, should I be passing a string or an integer? The field type says integer, but the actual admi
We are sending messages using Intercom’s REST API and after completing a task on our platform side, we would like to inform the customer that:“The team will get back to you on this. Our usual reply time is 1 day. You'll get replies here and to email@example.com.” (sent from William’s Admin ID)However, this causes an unintended side-effect with our auto-assignment rules:Because Intercom treats this as a teammate reply, when the auto-assignment occurs (balanced assignment). We auto-assign conversations based on “waiting longest”, so this causes these conversations to be de-prioritised and skipped, and they will only be picked up again if the customer replies.As a workaround, we currently: Do not send a message to the customer, and instead Use the API to unassign the conversation and move it into a manually monitored inbox where it auto-assigned and picked up. This avoids breaking the assignment logic, but it leaves the customer confused because they receive no acknowledgement that we a
We have an integration that posts comments to tickets via POST /tickets/{ticket_id}/reply using an admin user. We've noticed that when the ticket is unassigned, Intercom auto-assigns it to our integration's admin. We'd like to undo this by setting assignee_id to "0" via PUT /tickets/{ticket_id}, but this also clears the team_assignee_id -- even though we're not passing team_assignee_id in the request body.Two questions:1. Is there a way to unassign the admin_assignee_id (via assignee_id: "0") without also clearing the team_assignee_id? Our PUT request only includes assignee_id, but the team gets removed as a side effect.2. Is there a way to set team_assignee_id via the API after a ticket has been created? We've tried including it in the PUT /tickets/{ticket_id} request body and get a 200 response, but the team assignment doesn't actually update on the ticket. We're using API version 2.14. Any guidance would be appreciated.
Hi everyone, Is it possible to list all snippets from our system? I would like to list them like I list articles (https://developers.intercom.com/docs/references/rest-api/api.intercom.io/articles/listarticles) Best regards
Hi!One of our customers uses Intercom, and in order to create a pipeline between our backend and their order processing workflow, we created an API account in Intercom which we set to our company’s email. The customer now wants to have full control of the API account, without having to fiddle with changing the API token. Will the API token remain functional if the API account’s email is changed? Thanks!
Hi there,I've been looking through Intercom documentation, and it seems like there's something called a Custom Channel and an event called "custom channel base event." However, when I dig a little deeper, it seems that’s somehow connected to Fin?Not trying to integrate a conversation with the Fin chatbot; rather, I am looking to use my own pipeline for our users to interact with my customer service team in Inbox.What I'm looking to do is integrate my custom app as a custom channel in Inbox so that our team can interact through our own managed integration via API.Does anyone know:How to access this capability? If this feature is gated? Whether usage of this feature is billable or if it is included in the standard subscription tier?Thank you!
Issue:The TypeScript type definition for the companies property in the @intercom/messenger-js-sdk (v0.0.18) appears to be incorrectly defined as a single-item tuple rather than a standard array.Details: In the SDK's type definitions, the companies property is defined as: companies?: [any];In TypeScript, the [any] syntax defines a tuple of length 1. However, Intercom's own documentation and the actual JavaScript API support an array of multiple company objects.The Error: When attempting to pass an array of multiple companies, the TypeScript compiler throws the following error:TS2322: Type '{ name: string; company_id: string; }[]' is not assignable to type '[any]'. Target requires 1 element(s) but source may have fewer.Steps to Reproduce: Try to boot the messenger with more than one company:TypeScriptimport { boot } from '@intercom/messenger-js-sdk';const companies: { company_id: string; name: string }[] = [ { company_id: '1', name: 'Company A' }, { company_id: '2', name: 'Company B' }
Please help, previously there was no problem. But now the image sent from the webhook does not include the complete url.
Hello,We integrate with Intercom using webhooks. When an admin replies to a conversation, we receive the reply via the conversation.admin.replied webhook event.When AI Inbox Translations is enabled, we continue to receive the original replies through the webhook, but we’re unable to receive the translated versions of those messages.Could you please advise on how translations can be accessed via the API or webhooks?
We are experiencing an issue where conversations started via the JavaScript Messenger are not being associated with the company object provided during initialization. While the session ping correctly identifies the active_company_id, the resulting Conversation object via the REST API doesn’t returns companies at all.Steps to Reproduce: Initialize the Intercom Messenger using the window.intercomSettings snippet. Provide a valid user_id, user_hash (Identity Verification), and a company object (including a valid company_id). The Messenger boots successfully; identity_verified is true. Start a brand new conversation as the user. Fetch that specific conversation via the REST API (GET /conversations/{id}). Expected Result: The companies/company_id field in the Conversation JSON response should contain the company object passed during initialization.Actual Result: The companies field is either missing.Technical Context: Identity Verification: Enabled. The user_hash is generated correc
Hi team,I'm looking to upgrade @intercom/messenger-js-sdk from 0.0.13 to 0.0.18 in our Angular application, but I can't find a changelog or release notes anywhere.The npm package doesn't link to a public GitHub repository, and there's no CHANGELOG.md in the package.Could you please:Publish a changelog for the SDK (even just in the README)? Or point me to where release notes are documented?This would help developers assess upgrade risk and understand new features. I've done a diff and can see additions like hideNotifications() and whoami(), but official documentation would be appreciated.Thanks!
We want to add a note to an Intercom conversation but without impersonating an existing admin user. The API docs suggest that to reply with a note, you need:message_type: note type: admin an admin_idWe’re triggering this from within our app and, under certain conditions, want to programmatically append additional context as an internal note. If there’s another way to attach context to a conversation, that could also work.Ideally, we’d post on behalf of a bot or app, but I can’t find anything in the docs that supports this. Impersonating a user feels like a security risk, and creating a dedicated seat for this purpose introduces its own concerns.Is there a recommended pattern for handling this?
Already have an account? Login
No account yet? Create an account
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.