Manage end-users in your helpdesk system
- GetMessagesRequest
Fin Custom Helpdesk API (0.0.1)
The Fin Custom Helpdesk API allows you to integrate your custom helpdesk with Fin through a standardized set of API endpoints and webhooks.
Note that the names of the endpoints are set by the custom helpdesk's API. They do not need to conform to the names given in this API spec (e.g. create_message).
Q: Can POST be used for all API requests instead of GET?
A: Yes. All endpoints now support POST requests.
Q: Must field names use snake_case or can camelCase be used?
A: snake_case is required. The format of the responses outlined in the documentation must be followed, including the snake_case key names. Intercom cannot support different naming conventions for different customers.
Q: Does create_message API provide a unique message ID for idempotency?
A: Yes. An object_id field is available on all create type requests: create_message, create_conversation, and create_user. This represents the ID of the object in the Intercom system.
Q: Do message APIs support attachments?
A: Yes, attachments are supported. The format of attachments is outlined in the Messages section of the API docs.
Messages can contain:
- Text body only (no attachments)
- Attachments only (no text body - body can be null or empty string)
- Both text body and attachments
However, a message cannot be completely empty - it must have either a body or at least one attachment.
Q: What HTML is supported in message content?
A: The following HTML tags are supported in the Message object:
- Paragraphs:
<p> - Headings:
<h1>,<h2>(note: h3-h6 appear as h2) - Text formatting:
<b>(bold),<i>(italic) - Links:
<a> - Images:
<img>(can be linked) - Line breaks:
<br> - Code blocks:
<code> - Lists:
<ul>(unordered),<ol>(ordered)
Example HTML:
<!-- Headings (h1–h6) -->
<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4</h4>
<h5>Heading 5</h5>
<h6>Heading 6</h6>
<!-- Paragraphs with inline formatting and link -->
<p>
Normal paragraph with <a href="https://example.com">a link</a>, <b>bold</b>,
<i>italic</i>, and a line break<br />right here.
</p>
<!-- Image and linked image -->
<img src="https://placehold.co/600x400/png" alt="Example image" />
<a href="https://example.com"
><img src="https://placehold.co/200x120/png" alt="Linked image"
/></a>
<!-- Lists: unordered, ordered-->
<ul>
<li>Unordered item 1</li>
<li>Unordered item 2</li>
</ul>
<ol>
<li>Ordered item 1</li>
<li>Ordered item 2</li>
</ol>
<!-- Code block -->
<code> console.log('hello world!'); </code>Q: Does the get_agent API need conversation ID parameters?
A: No. get_agent is only used during initial Fin configuration to select which agent represents Fin in the external system. You can return a single hardcoded bot agent here.
Q: How will Intercom inform us that a human agent needs to join a conversation?
A: Intercom sends an update_conversation call with assignee_id set to null.
Q: Are conversation-level attributes separate from user attributes?
A: Yes. Structure is:
{
"conversation": {
"attributes": {
// conversation-specific data like locale, topic, sentiment, order_id
},
"user": {
"id": "...",
"type": "end-user",
"name": "...",
"attributes": {
// user-specific custom attributes
}
}
}
}Q: When EndUser attributes change, will update_conversation be called?
A: Yes. Conversation and user state is synchronized on each inbound/outbound event (new messages, user data updates via workflows, for example an Email Collector step, etc.).
Q: How do I verify that incoming requests are genuine?
A: We provide two extra headers on our requests to your servers:
X-Fin-Request-Timestamp- This is the timestamp of the request (in seconds since epoch). You may use this to reject requests that are too old.X-Fin-Signature- This is the SHA256 HMAC signature of{timestamp}:{request_body}. You may use this to verify the authenticity of the request from us.
Note as there is no body for GET requests, we instead sign: {timestamp}:{request_params_sorted_alphabetically}.
The HMAC key used to validate the signature is found in your deployment settings.
1 - Navigate to the Deploy > Fin Messenger section in your Fin Workspace.
2 - You can give your integration a name to identify it. We will support multiple different connections later (e.g. for multiple different sub-brands you may have)
Please note that "Channel type" is currently static with the value "Fin messenger". We will support other channel types at a later time.
Make note of the Identifier value you are given here. This is the identifer you must use in your webhooks back to the Fin system.
3 - Configure your API endpoint URLs. What these endpoints are for and the request/response format is described in the rest of these docs.
4 - Set up authentication for your endpoints. By default we use OAuth for this. Choose the "OAuth token settings" option and configure the OAuth connection with your server.
Note, you may whitelist Intercom's IP address ranges based on the documentation here
5 - Note the webhook secret generated for you. This must be provided in the X-Webhook-Key header in webhook requests to the Fin system.
6 - Choose a agent from your system to attribute Fin's replies to.
When Fin generate a response for the customer, we will use the ID of the agent chosen here when creating messages in your system.
7 - Finally, when you've configured your workflow and installed the Fin Messenger you're ready to activate Fin.
CreateConversationRequest
Attributes associated with the conversation
{ "title": "Question about pricing", "user": { "id": "user_123456", "name": "Jane Doe", "email": "jane.doe@example.com", "photo_url": "https://example.com/avatars/jane.jpg", "user_type": "end_user", "attributes": { … } }, "object_id": "123456", "attributes": { "issue_type": "Billing", "priority": "High" }, "initial_message": { "message_type": "comment", "body": "string", "author": { … }, "visibility": "public", "object_id": "123456", "attachments": [ … ] } }
CreateMessageRequest
Message input fields for creation. Either body or attachments (or both) must be provided. A message cannot be empty - it must contain either text content or at least one attachment.
Who can see the message:
public- Visible to end-users (appears in Fin Messenger)private- Only visible to agents (internal notes)
{ "message_type": "comment", "body": "string", "author": { "id": "user_123456", "user_type": "end_user", "name": "Jane Doe", "email": "jane.doe@example.com", "photo_url": "https://example.com/avatars/jane.jpg" }, "visibility": "public", "object_id": "123456", "attachments": [ { … } ], "conversation_id": "conv_456" }






