Intercom REST API for managing customer conversations, contacts, messages, and support tickets. Use this skill to send messages, manage contacts, handle conversations, and access help center content.
/plugin marketplace add vm0-ai/api0/plugin install api0@api0This skill inherits all available tools. When active, it can use any tool Claude has access to.
Manage customer conversations, contacts, messages, articles, and support operations via the Intercom REST API.
Official docs:
https://developers.intercom.com/docs
Use this skill when you need to:
export INTERCOM_ACCESS_TOKEN="your_access_token"
Test your token:
bash -c 'curl -s "https://api.intercom.io/admins" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"' | jq .
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.
https://api.intercom.io/https://api.eu.intercom.io/https://api.au.intercom.io/Important: When using
$VARin a command that pipes to another command, wrap the command containing$VARinbash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"' | jq .
All examples assume INTERCOM_ACCESS_TOKEN is set.
Base URL: https://api.intercom.io/
Required Headers:
Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}Accept: application/jsonIntercom-Version: 2.14Get all admins/teammates in your workspace:
bash -c 'curl -s "https://api.intercom.io/admins" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"' | jq '.admins[] | {id, name, email}
Create a new contact (lead or user):
bash -c 'curl -s -X POST "https://api.intercom.io/contacts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Accept: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"email": "user@example.com", "name": "John Doe", "phone": "+1234567890"}'"'"'' | jq .
With custom attributes:
bash -c 'curl -s -X POST "https://api.intercom.io/contacts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Accept: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"email": "user@example.com", "name": "John Doe", "custom_attributes": {"plan": "premium", "signup_date": "2024-01-15"}}'"'"'' | jq .
Retrieve a specific contact by ID:
CONTACT_ID="63a07ddf05a32042dffac965"
bash -c 'curl -s "https://api.intercom.io/contacts/${CONTACT_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"' | jq .
Update contact information:
CONTACT_ID="63a07ddf05a32042dffac965"
bash -c 'curl -s -X PATCH "https://api.intercom.io/contacts/${CONTACT_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Accept: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"name": "Jane Doe", "custom_attributes": {"plan": "enterprise"}}'"'"'' | jq .
Note: Newly created contacts may need a few seconds before they can be updated.
Permanently delete a contact:
CONTACT_ID="63a07ddf05a32042dffac965"
curl -s -X DELETE "https://api.intercom.io/contacts/${CONTACT_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"
Search contacts with filters:
bash -c 'curl -s -X POST "https://api.intercom.io/contacts/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"query": {"field": "email", "operator": "=", "value": "user@example.com"}}'"'"'' | jq '.data[]
Search with multiple filters:
bash -c 'curl -s -X POST "https://api.intercom.io/contacts/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"query": {"operator": "AND", "value": [{"field": "role", "operator": "=", "value": "user"}, {"field": "custom_attributes.plan", "operator": "=", "value": "premium"}]}}'"'"'' | jq '.data[]
Get all conversations:
bash -c 'curl -s "https://api.intercom.io/conversations?order=desc&sort=updated_at" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"' | jq '.conversations[] | {id, state, created_at, updated_at}
Retrieve a specific conversation:
CONVERSATION_ID="147"
bash -c 'curl -s "https://api.intercom.io/conversations/${CONVERSATION_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Accept: application/json" -H "Intercom-Version: 2.14"' | jq .
Search for open conversations:
bash -c 'curl -s -X POST "https://api.intercom.io/conversations/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"query": {"operator": "AND", "value": [{"field": "state", "operator": "=", "value": "open"}]}}'"'"'' | jq '.conversations[]
Search by assignee:
ADMIN_ID="1234567"
bash -c 'curl -s -X POST "https://api.intercom.io/conversations/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"query\": {\"field\": \"admin_assignee_id\", \"operator\": \"=\", \"value\": \"${ADMIN_ID}\"}}"' | jq '.conversations[]
Reply as an admin:
CONVERSATION_ID="147"
ADMIN_ID="1234567"
bash -c 'curl -s -X POST "https://api.intercom.io/conversations/${CONVERSATION_ID}/parts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"message_type\": \"comment\", \"type\": \"admin\", \"admin_id\": \"${ADMIN_ID}\", \"body\": \"Thank you for your message. We'"'"'ll help you with this.\"}"' | jq .
Assign a conversation to an admin or team:
CONVERSATION_ID="147"
ADMIN_ID="1234567"
bash -c 'curl -s -X POST "https://api.intercom.io/conversations/${CONVERSATION_ID}/parts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"message_type\": \"assignment\", \"type\": \"admin\", \"admin_id\": \"${ADMIN_ID}\", \"assignee_id\": \"${ADMIN_ID}\"}"' | jq .
Close an open conversation:
CONVERSATION_ID="147"
ADMIN_ID="1234567"
bash -c 'curl -s -X POST "https://api.intercom.io/conversations/${CONVERSATION_ID}/parts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"message_type\": \"close\", \"type\": \"admin\", \"admin_id\": \"${ADMIN_ID}\"}"' | jq .
Add an internal note to a contact:
CONTACT_ID="63a07ddf05a32042dffac965"
bash -c 'curl -s -X POST "https://api.intercom.io/contacts/${CONTACT_ID}/notes" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"body": "Customer is interested in enterprise plan. Follow up next week."}'"'"'' | jq .
Get all tags:
bash -c 'curl -s "https://api.intercom.io/tags" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Intercom-Version: 2.14"' | jq '.data[] | {id, name}
Create a new tag:
bash -c 'curl -s -X POST "https://api.intercom.io/tags" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"name": "VIP Customer"}'"'"'' | jq .
Add a tag to a contact:
CONTACT_ID="63a07ddf05a32042dffac965"
TAG_ID="81"
bash -c 'curl -s -X POST "https://api.intercom.io/contacts/${CONTACT_ID}/tags" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"id\": \"${TAG_ID}\"}"' | jq .
Remove a tag from a contact:
CONTACT_ID="63a07ddf05a32042dffac965"
TAG_ID="7522907"
curl -s -X DELETE "https://api.intercom.io/contacts/${CONTACT_ID}/tags/${TAG_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Intercom-Version: 2.14"
Get help center articles:
bash -c 'curl -s "https://api.intercom.io/articles" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Intercom-Version: 2.14"' | jq '.data[] | {id, title, url}
Retrieve a specific article:
ARTICLE_ID="123456"
bash -c 'curl -s "https://api.intercom.io/articles/${ARTICLE_ID}" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Intercom-Version: 2.14"' | jq .
Create a new company:
bash -c 'curl -s -X POST "https://api.intercom.io/companies" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"company_id": "acme-corp-123", "name": "Acme Corporation", "plan": "enterprise", "size": 500, "website": "https://acme.com"}'"'"'' | jq .
Associate a contact with a company:
CONTACT_ID="63a07ddf05a32042dffac965"
COMPANY_ID="6762f09a1bb69f9f2193bb34"
bash -c 'curl -s -X POST "https://api.intercom.io/contacts/${CONTACT_ID}/companies" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"id\": \"${COMPANY_ID}\"}"' | jq .
Record a custom event for a contact:
bash -c 'curl -s -X POST "https://api.intercom.io/events" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"event_name": "purchased-plan", "created_at": 1234567890, "user_id": "user-123", "metadata": {"plan": "premium", "price": 99}}'"'"'' | jq .
# Search for open conversations
OPEN_CONVS="$(bash -c 'curl -s -X POST "https://api.intercom.io/conversations/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '"'"'{"query": {"field": "state", "operator": "=", "value": "open"}}'"'"'' | jq -r '.conversations[0].id')"
# Reply to first conversation
ADMIN_ID="1234567"
curl -s -X POST "https://api.intercom.io/conversations/${OPEN_CONVS}/parts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"message_type\": \"comment\", \"type\": \"admin\", \"admin_id\": \"${ADMIN_ID}\", \"body\": \"We're looking into this for you.\"}"
# Create contact
CONTACT=$(curl -s -X POST "https://api.intercom.io/contacts" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '{"email": "newuser@acme.com", "name": "New User"}')
CONTACT_ID=$(echo $CONTACT | jq -r '.id')
# Attach to company
COMPANY_ID="6762f09a1bb69f9f2193bb34"
curl -s -X POST "https://api.intercom.io/contacts/${CONTACT_ID}/companies" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d "{\"id\": \"${COMPANY_ID}\"}"
= - Equals!= - Not equals< - Less than> - Greater than<= - Less than or equal>= - Greater than or equalIN - In listNIN - Not in list~ - Contains (for strings)!~ - Does not containAND - All conditions must matchOR - Any condition can matchcurl -s -X POST "https://api.intercom.io/contacts/search" -H "Authorization: Bearer ${INTERCOM_ACCESS_TOKEN}" -H "Content-Type: application/json" -H "Intercom-Version: 2.14" -d '{
"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}
}' | jq '.data[]'
When rate limited, API returns 429 Too Many Requests.
Rate Limit Headers:
X-RateLimit-Limit: Requests per minute allowedX-RateLimit-Remaining: Remaining requests in current windowX-RateLimit-Reset: Unix timestamp when limit resetsAuthorization, Accept: application/json, and Intercom-Version: 2.14 headersGET for retrieving dataPOST for creating resources and searchesPATCH for updating resources (not PUT)DELETE for removing resourcesX-RateLimit-Remaining and implement exponential backoffopen, closed, snoozed