Intercom API Manage customer conversations, contacts, messages, articles, and support operations via the Intercom REST API. Official docs: https://developers.intercom.com/docs When to Use Use this skill when you need to: Manage contacts - Create, update, search, and delete user profiles Handle conversations - List, search, reply to, assign, and close conversations Send messages - Create and send messages to contacts Manage companies - Track organizations and their members Work with articles - Access help center content and knowledge base Add notes - Annotate contact profiles with internal notes Use tags - Organize contacts and conversations with labels Track events - Record custom user activities and behaviors Manage tickets - Create and handle support tickets Prerequisites Setup API Wrapper Create a helper script for API calls: cat
/tmp/intercom-curl << 'EOF'
!/bin/bash
- curl -s -H "Content-Type: application/json" -H "Authorization: Bearer $INTERCOM_TOKEN" "$@"
- EOF
- chmod
- +x /tmp/intercom-curl
- Usage:
- All examples below use
- /tmp/intercom-curl
- instead of direct
- curl
- calls.
- Getting Your Access Token
- Log in to your
- Intercom workspace
- Navigate to
- Settings
- →
- Developers
- →
- Developer Hub
- Create a new app or select an existing one
- Go to
- Configure
- →
- Authentication
- Copy your
- Access Token
- export
- INTERCOM_TOKEN
- =
- "your_access_token"
- Verify Token
- Test your token:
- /tmp/intercom-curl
- "https://api.intercom.io/admins"
- |
- jq
- '.admins[] | {id, name, email}'
- Expected response: List of admins in your workspace
- ✅ This skill has been tested and verified
- with a live Intercom workspace. All core endpoints work correctly.
- Regional Endpoints
- US (Default)
- :
- https://api.intercom.io/
- Europe
- :
- https://api.eu.intercom.io/
- Australia
- :
- https://api.au.intercom.io/
- How to Use
- All examples assume
- INTERCOM_TOKEN
- is set.
- Base URL
- :
- https://api.intercom.io/
- Required Headers
- :
- Authorization: Bearer ${INTERCOM_TOKEN}
- Accept: application/json
- Intercom-Version: 2.14
- Core APIs
- 1. List Admins
- Get all admins/teammates in your workspace:
- /tmp/intercom-curl
- "https://api.intercom.io/admins"
- |
- jq
- '.admins[] | {id, name, email}'
- 2. Create Contact
- Create a new contact (lead or user):
- Write to
- /tmp/intercom_request.json
- :
- {
- "email"
- :
- "user@example.com"
- ,
- "name"
- :
- "John Doe"
- ,
- "phone"
- :
- "+1234567890"
- }
- Then run:
- /tmp/intercom-curl
- -X
- POST
- "https://api.intercom.io/contacts"
- -d
- @/tmp/intercom_request.json
- With custom attributes:
- Write to
- /tmp/intercom_request.json
- :
- {
- "email"
- :
- "user@example.com"
- ,
- "name"
- :
- "John Doe"
- ,
- "custom_attributes"
- :
- {
- "plan"
- :
- "premium"
- ,
- "signup_date"
- :
- "2024-01-15"
- }
- }
- Then run:
- /tmp/intercom-curl
- -X
- POST
- "https://api.intercom.io/contacts"
- -d
- @/tmp/intercom_request.json
- 3. Get Contact
- Retrieve a specific contact by ID. Replace
- with the actual contact ID:
- curl
- -s
- "https://api.intercom.io/contacts/
" - -H
- "Authorization: Bearer
- ${INTERCOM_TOKEN}
- "
- -H
- "Accept: application/json"
- -H
- "Intercom-Version: 2.14"
- 4. Update Contact
- Update contact information. Replace
- with the actual contact ID:
- Write to
- /tmp/intercom_request.json
- :
- {
- "name"
- :
- "Jane Doe"
- ,
- "custom_attributes"
- :
- {
- "plan"
- :
- "enterprise"
- }
- }
- Then run:
- curl
- -s
- -X
- PATCH
- "https://api.intercom.io/contacts/
" - -H
- "Authorization: Bearer
- ${INTERCOM_TOKEN}
- "
- -H
- "Content-Type: application/json"
- -H
- "Accept: application/json"
- -H
- "Intercom-Version: 2.14"
- -d
- @/tmp/intercom_request.json
- Note
- Newly created contacts may need a few seconds before they can be updated.
5. Delete Contact
Permanently delete a contact. Replace
with the actual contact ID: curl -s -X DELETE "https://api.intercom.io/contacts/ " -H "Authorization: Bearer ${INTERCOM_TOKEN} " -H "Accept: application/json" -H "Intercom-Version: 2.14" 6. Search Contacts Search contacts with filters: Write to /tmp/intercom_request.json : { "query" : { "field" : "email" , "operator" : "=" , "value" : "user@example.com" } } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/contacts/search" -d @/tmp/intercom_request.json | jq '.data[] | {id, email, name}' Search with multiple filters: Write to /tmp/intercom_request.json : { "query" : { "operator" : "AND" , "value" : [ { "field" : "role" , "operator" : "=" , "value" : "user" } , { "field" : "custom_attributes.plan" , "operator" : "=" , "value" : "premium" } ] } } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/contacts/search" -d @/tmp/intercom_request.json | jq '.data[] | {id, email, name}' 7. List Conversations Get all conversations: /tmp/intercom-curl "https://api.intercom.io/conversations?order=desc&sort=updated_at" | jq '.conversations[] | {id, state, created_at, updated_at}' 8. Get Conversation Retrieve a specific conversation. Replace with the actual conversation ID: /tmp/intercom-curl "https://api.intercom.io/conversations/ " 9. Search Conversations Search for open conversations: Write to /tmp/intercom_request.json : { "query" : { "operator" : "AND" , "value" : [ { "field" : "state" , "operator" : "=" , "value" : "open" } ] } } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/search" -d @/tmp/intercom_request.json | jq '.conversations[] | {id, state, created_at}' Search by assignee: Replace with the actual admin ID in the request JSON below. Write to /tmp/intercom_request.json : { "query" : { "field" : "admin_assignee_id" , "operator" : "=" , "value" : " " } } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/search" -d @/tmp/intercom_request.json | jq '.conversations[] | {id, state, created_at}' 10. Reply to Conversation Reply as an admin. Replace and with actual IDs: Write to /tmp/intercom_request.json : { "message_type" : "comment" , "type" : "admin" , "admin_id" : " " , "body" : "Thank you for your message. We'll help you with this." } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/ /parts" -d @/tmp/intercom_request.json 11. Assign Conversation Assign a conversation to an admin or team. Replace , , and with actual IDs: Write to /tmp/intercom_request.json : { "message_type" : "assignment" , "type" : "admin" , "admin_id" : " " , "assignee_id" : " " } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/ /parts" -d @/tmp/intercom_request.json 12. Close Conversation Close an open conversation. Replace and with actual IDs: Write to /tmp/intercom_request.json : { "message_type" : "close" , "type" : "admin" , "admin_id" : " " } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/ /parts" -d @/tmp/intercom_request.json 13. Create Note Add an internal note to a contact. Replace with the actual contact ID: Write to /tmp/intercom_request.json : { "body" : "Customer is interested in enterprise plan. Follow up next week." } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/contacts/ /notes" -d @/tmp/intercom_request.json 14. List Tags Get all tags: /tmp/intercom-curl "https://api.intercom.io/tags" | jq '.data[] | {id, name}' 15. Create Tag Create a new tag: Write to /tmp/intercom_request.json : { "name" : "VIP Customer" } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/tags" -d @/tmp/intercom_request.json 16. Tag Contact Add a tag to a contact. Replace and with actual IDs: Write to /tmp/intercom_request.json : { "id" : " " } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/contacts/ /tags" -d @/tmp/intercom_request.json 17. Untag Contact Remove a tag from a contact. Replace and with actual IDs: curl -s -X DELETE "https://api.intercom.io/contacts/ /tags/ " -H "Authorization: Bearer ${INTERCOM_TOKEN} " -H "Intercom-Version: 2.14" 18. List Articles Get help center articles: /tmp/intercom-curl "https://api.intercom.io/articles" | jq '.data[] | {id, title, url}' 19. Get Article Retrieve a specific article. Replace with the actual article ID: /tmp/intercom-curl "https://api.intercom.io/articles/ " 20. Create Company Create a new company: Write to /tmp/intercom_request.json : { "company_id" : "acme-corp-123" , "name" : "Acme Corporation" , "plan" : "enterprise" , "size" : 500 , "website" : "https://acme.com" } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/companies" -d @/tmp/intercom_request.json 21. Attach Contact to Company Associate a contact with a company. Replace and with actual IDs: Write to /tmp/intercom_request.json : { "id" : " " } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/contacts/ /companies" -d @/tmp/intercom_request.json 22. Track Event Record a custom event for a contact: Write to /tmp/intercom_request.json : { "event_name" : "purchased-plan" , "created_at" : 1234567890 , "user_id" : "user-123" , "metadata" : { "plan" : "premium" , "price" : 99 } } Then run: /tmp/intercom-curl -X POST "https://api.intercom.io/events" -d @/tmp/intercom_request.json Common Workflows Find and Reply to Open Conversations Write to /tmp/intercom_request.json : { "query" : { "field" : "state" , "operator" : "=" , "value" : "open" } } Then run:
Search for open conversations
OPEN_CONVS
" $( /tmp/intercom-curl -X POST "https://api.intercom.io/conversations/search" -d @/tmp/intercom_request.json ) "
Replace with the actual admin ID
ADMIN_ID
"
Create contact and extract ID
CONTACT_ID
$( /tmp/intercom-curl -X POST "https://api.intercom.io/contacts" -d @/tmp/intercom_request.json )
Replace with the actual company ID
COMPANY_ID
- "
" - Write to
- /tmp/intercom_request.json
- :
- {
- "id"
- :
- "
" - }
- Then run:
- /tmp/intercom-curl
- -X
- POST
- "https://api.intercom.io/contacts/
- ${CONTACT_ID}
- /companies"
- -d
- @/tmp/intercom_request.json
- Search Operators
- Field Operators
- =
- - Equals
- !=
- - Not equals
- <
- - Less than
- >
- - Greater than
- <=
- - Less than or equal
- >=
- - Greater than or equal
- IN
- - In list
- NIN
- - Not in list
- ~
- - Contains (for strings)
- !~
- - Does not contain
- Query Operators
- AND
- - All conditions must match
- OR
- - Any condition can match
- Example Complex Search
- Write to
- /tmp/intercom_request.json
- :
- {
- "query"
- :
- {
- "operator"
- :
- "AND"
- ,
- "value"
- :
- [
- {
- "field"
- :
- "role"
- ,
- "operator"
- :
- "="
- ,
- "value"
- :
- "user"
- }
- ,
- {
- "field"
- :
- "created_at"
- ,
- "operator"
- :
- ">"
- ,
- "value"
- :
- 1609459200
- }
- ,
- {
- "field"
- :
- "custom_attributes.plan"
- ,
- "operator"
- :
- "IN"
- ,
- "value"
- :
- [
- "premium"
- ,
- "enterprise"
- ]
- }
- ]
- }
- ,
- "pagination"
- :
- {
- "per_page"
- :
- 50
- }
- }
- Then run:
- /tmp/intercom-curl
- -X
- POST
- "https://api.intercom.io/contacts/search"
- -d
- @/tmp/intercom_request.json
- |
- jq
- '.data[] | {id, email, name}'
- Rate Limits
- Private Apps
-
- 10,000 API calls per minute
- Public Apps
-
- 10,000 API calls per minute
- Workspace Limit
-
- 25,000 API calls per minute (combined)
- When rate limited, API returns
- 429 Too Many Requests
- .
- Rate Limit Headers
- :
- X-RateLimit-Limit
-
- Requests per minute allowed
- X-RateLimit-Remaining
-
- Remaining requests in current window
- X-RateLimit-Reset
-
- Unix timestamp when limit resets
- Guidelines
- Always include required headers
-
- All requests should have
- Authorization
- ,
- Accept: application/json
- , and
- Intercom-Version: 2.14
- headers
- Use correct HTTP methods
- :
- GET
- for retrieving data
- POST
- for creating resources and searches
- PATCH
- for updating resources (not PUT)
- DELETE
- for removing resources
- Handle rate limits
-
- Monitor
- X-RateLimit-Remaining
- and implement exponential backoff
- Wait after creating resources
-
- Newly created contacts may need a few seconds before they can be updated or searched
- Use search wisely
-
- Search endpoints are powerful but count toward rate limits
- Pagination
-
- Use cursor-based pagination for large datasets
- Test with small datasets
-
- Verify your queries work before scaling up
- Secure tokens
-
- Never expose access tokens in public repositories or logs
- Use filters
-
- Narrow search results with filters to reduce API calls
- Conversation states
-
- Valid states are
- open
- ,
- closed
- ,
- snoozed
- Custom attributes
-
- Define custom fields in Intercom UI before using in API
- Check workspace ID
- Your workspace ID is included in contact responses for verification API Reference Main Documentation: https://developers.intercom.com/docs API Reference: https://developers.intercom.com/docs/references/rest-api/api-intercom-com/ Authentication: https://developers.intercom.com/docs/build-an-integration/learn-more/authentication/ Rate Limiting: https://developers.intercom.com/docs/references/rest-api/errors/rate-limiting/ Contacts API: https://developers.intercom.com/docs/references/rest-api/api-intercom-com/contacts/ Conversations API: https://developers.intercom.com/docs/references/rest-api/api-intercom-com/conversations/ Developer Hub: https://app.intercom.com/a/apps/_/developer-hub