python-intercom

by intercom

Python wrapper for the Intercom API.

202 Stars 127 Forks Last release: Not found Other 449 Commits 26 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

python-intercom

|PyPI Version| |PyPI Downloads| |Travis CI Build| |Coverage Status|

Not officially supported

Please note that this is NOT an official Intercom SDK. The third party that maintained it reached out to us to note that they were unable to host it any longer. As it was being used by some Intercom customers we offered to host it to allow the current Python community to continue to use it. However, it will not be maintained or updated by Intercom. It is a community maintained SDK. Please see

here 
__ for the official list of Intercom SDKs

Python bindings for the Intercom API (https://developers.intercom.com/intercom-api-reference).

API Documentation 
__.

Package
Documentation 
__.

Upgrading information

Version 3 of python-intercom is not backwards compatible with previous versions.

Version 3 moves away from a global setup approach to the use of an Intercom Client.

Installation

::

pip install python-intercom

Basic Usage

Configure your client ~~~~~~~~~~~~~~~~~~~~~

.. code:: python

from intercom.client import Client
intercom = Client(personal_access_token='my_personal_access_token')

Note that certain resources will require an extended scope access token :

Setting up Personal Access Tokens 
_

Resources ~~~~~~~~~

Resources this API supports:

::

https://api.intercom.io/users
https://api.intercom.io/contacts
https://api.intercom.io/companies
https://api.intercom.io/counts
https://api.intercom.io/tags
https://api.intercom.io/notes
https://api.intercom.io/segments
https://api.intercom.io/events
https://api.intercom.io/conversations
https://api.intercom.io/messages
https://api.intercom.io/subscriptions
https://api.intercom.io/jobs
https://api.intercom.io/bulk

Examples ~~~~~~~~

Users ^^^^^

.. code:: python

# Find user by email
user = intercom.users.find(email="[email protected]")
# Find user by user_id
user = intercom.users.find(user_id="1")
# Find user by id
user = intercom.users.find(id="1")
# Create a user
user = intercom.users.create(email="[email protected]", name="Bob Smith")
# Delete a user
user = intercom.users.find(id="1")
deleted_user = intercom.users.delete(user)
# Update custom_attributes for a user
user.custom_attributes["average_monthly_spend"] = 1234.56
intercom.users.save(user)
# Perform incrementing
user.increment('karma')
intercom.users.save(user)
# Iterate over all users
for user in intercom.users.all():
    ...

Admins ^^^^^^

.. code:: python

# Iterate over all admins
for admin in intercom.admins.all():
    ...

Companies ^^^^^^^^^

.. code:: python

# Add a user to one or more companies
user = intercom.users.find(email='[email protected]')
user.companies = [
    {'company_id': 6, 'name': 'Intercom'},
    {'company_id': 9, 'name': 'Test Company'}
]
intercom.users.save(user)
# You can also pass custom attributes within a company as you do this
user.companies = [
    {
        'id': 6,
        'name': 'Intercom',
        'custom_attributes': {
            'referral_source': 'Google'
        }
    }
]
intercom.users.save(user)
# Find a company by company_id
company = intercom.companies.find(company_id='44')
# Find a company by name
company = intercom.companies.find(name='Some company')
# Find a company by id
company = intercom.companies.find(id='41e66f0313708347cb0000d0')
# Update a company
company.name = 'Updated company name'
intercom.companies.save(company)
# Iterate over all companies
for company in intercom.companies.all():
    ...
# Get a list of users in a company
intercom.companies.users(company.id)

Tags ^^^^

.. code:: python

# Tag users
tag = intercom.tags.tag(name='blue', users=[{'email': '[email protected]'}])
# Untag users
intercom.tags.untag(name='blue', users=[{'user_id': '42ea2f1b93891f6a99000427'}])
# Iterate over all tags
for tag in intercom.tags.all():
    ...
# Tag companies
tag = intercom.tags.tag(name='blue', companies=[{'id': '42ea2f1b93891f6a99000427'}])

Segments ^^^^^^^^

.. code:: python

# Find a segment
segment = intercom.segments.find(id=segment_id)
# Iterate over all segments
for segment in intercom.segments.all():
    ...

Notes ^^^^^

.. code:: python

# Find a note by id
note = intercom.notes.find(id=note)
# Create a note for a user
note = intercom.notes.create(
    body="

Text for the note

", email='[email protected]') # Iterate over all notes for a user via their email address for note in intercom.notes.find_all(email='[email protected]'): ... # Iterate over all notes for a user via their user_id for note in intercom.notes.find_all(user_id='123'): ...

Conversations ^^^^^^^^^^^^^

.. code:: python

# FINDING CONVERSATIONS FOR AN ADMIN
# Iterate over all conversations (open and closed) assigned to an admin
for convo in intercom.conversations.find_all(type='admin', id='7'):
    ...
# Iterate over all open conversations assigned to an admin
for convo in intercom.conversations.find_all(type='admin', id=7, open=True):
    ...
# Iterate over closed conversations assigned to an admin
for convo intercom.conversations.find_all(type='admin', id=7, open=False):
    ...
# Iterate over closed conversations for assigned an admin, before a certain
# moment in time
for convo in intercom.conversations.find_all(
        type='admin', id= 7, open= False, before=1374844930):
    ...

FINDING CONVERSATIONS FOR A USER

Iterate over all conversations (read + unread, correct) with a user based on

the users email

for convo in intercom.onversations.find_all(email='[email protected]',type='user'): ...

Iterate over through all conversations (read + unread) with a user based on

the users email

for convo in intercom.conversations.find_all( email='[email protected]', type='user', unread=False): ...

Iterate over all unread conversations with a user based on the users email

for convo in intercom.conversations.find_all( email='[email protected]', type='user', unread=true): ...

FINDING A SINGLE CONVERSATION

conversation = intercom.conversations.find(id='1')

INTERACTING WITH THE PARTS OF A CONVERSATION

Getting the subject of a part (only applies to email-based conversations)

conversation.rendered_message.subject

Get the part_type of the first part

conversation.conversation_parts[0].part_type

Get the body of the second part

conversation.conversation_parts[1].body

REPLYING TO CONVERSATIONS

User (identified by email) replies with a comment

intercom.conversations.reply( type='user', email='[email protected]', message_type='comment', body='foo')

Admin (identified by email) replies with a comment

intercom.conversations.reply( type='admin', email='[email protected]', message_type='comment', body='bar')

User (identified by email) replies with a comment and attachment

intercom.conversations.reply(id=conversation.id, type='user', email='[email protected]', message_type='comment', body='foo', attachment_urls=['http://www.example.com/attachment.jpg'])

Open

intercom.conversations.open(id=conversation.id, admin_id='123')

Close

intercom.conversations.close(id=conversation.id, admin_id='123')

Assign

intercom.conversations.assign(id=conversation.id, admin_id='123', assignee_id='124')

Reply and Open

intercom.conversations.reply(id=conversation.id, type='admin', admin_id='123', message_type='open', body='bar')

Reply and Close

intercom.conversations.reply(id=conversation.id, type='admin', admin_id='123', message_type='close', body='bar')

ASSIGNING CONVERSATIONS TO ADMINS

intercom.conversations.reply(id=conversation.id, type='admin', assignee_id=assignee_admin.id, admin_id=admin.id, message_type='assignment')

MARKING A CONVERSATION AS READ

intercom.conversations.mark_read(conversation.id)

Full loading of an embedded entity ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: python

# Given a conversation with a partial user, load the full user. This can be
# done for any entity
intercom.users.load(conversation.user)

Sending messages ^^^^^^^^^^^^^^^^

.. code:: python

# InApp message from admin to user
intercom.messages.create(**{
    "message_type": "inapp",
    "body": "What's up :)",
    "from": {
        "type": "admin",
        "id": "1234"
    },
    "to": {
        "type": "user",
        "id": "5678"
    }
})

Email message from admin to user

intercom.messages.create(**{ "message_type": "email", "subject": "Hey there", "body": "What's up :)", "template": "plain", # or "personal", "from": { "type": "admin", "id": "1234" }, "to": { "type": "user", "id": "536e564f316c83104c000020" } })

Message from a user

intercom.messages.create(**{ "from": { "type": "user", "id": "536e564f316c83104c000020" }, "body": "halp" })

Message from admin to contact

intercom.messages.create(**{ 'body': 'How can I help :)', 'from': { 'type': 'admin', 'id': '1234' }, 'to': { 'type': 'contact', 'id': '536e5643as316c83104c400671' } })

Message from a contact

intercom.messages.create(**{ 'from' => { 'type': 'contact', 'id': '536e5643as316c83104c400671' }, 'body': 'halp' })

Events ^^^^^^

.. code:: python

import time

intercom.events.create( event_name='invited-friend', created_at=int(time.mktime(time.localtime())), email=user.email, metadata={ 'invitee_email': '[email protected]', 'invite_code': 'ADDAFRIEND', 'found_date': 12909364407 } )

Retrieve event list for user with id:'123abc'

intercom.events.find_all(type='user', "intercom_user_id"="123abc)

Metadata Objects support a few simple types that Intercom can present on your behalf

.. code:: python

current_user = intercom.users.find(id="1")

intercom.events.create( event_name="placed-order", email=current_user.email, created_at=1403001013, metadata={ 'order_date': time.mktime(time.localtime()), 'stripe_invoice': 'inv_3434343434', 'order_number': { 'value': '3434-3434', 'url': 'https://example.org/orders/3434-3434' }, 'price': { 'currency': 'usd', 'amount': 2999 } } )

The metadata key values in the example are treated as follows-

  • order_date: a Date (key ends with '_date').
  • stripe_invoice: The identifier of the Stripe invoice (has a 'stripe_invoice' key)
  • order_number: a Rich Link (value contains 'url' and 'value' keys)
  • price: An Amount in US Dollars (value contains 'amount' and 'currency' keys)

Contacts ^^^^^^^^

Contacts represent logged out users of your application.

.. code:: python

# Create a contact
contact = intercom.leads.create(email="[email protected]")

Update a contact

contact.custom_attributes['foo'] = 'bar' intercom.leads.save(contact)

Find contacts by email

contacts = intercom.leads.find_all(email="[email protected]")

Merge a contact into a user

user = intercom.users.find(id="1") intercom.leads.convert(contact, user)

Delete a contact

intercom.leads.delete(contact)

Counts ^^^^^^

.. code:: python

# App-wide counts
intercom.counts.for_app()

Users in segment counts

intercom.counts.for_type(type='user', count='segment')

Subscriptions ~~~~~~~~~~~~~

Subscribe to events in Intercom to receive webhooks.

.. code:: python

# create a subscription
intercom.subscriptions.create(url='http://example.com', topics=['user.created'])

fetch a subscription

intercom.subscriptions.find(id='nsub_123456789')

list subscriptions

intercom.subscriptions.all(): ...

Errors ~~~~~~

You do not need to deal with the HTTP response from an API call directly. If there is an unsuccessful response then an error that is a subclass of

intercom.Error
will be raised. If desired, you can get at the http_code of an
Error
via it's
http_code
method.

The list of different error subclasses are listed below. As they all inherit off

IntercomError
you can choose to except
IntercomError
or the more specific error subclass:

.. code:: python

AuthenticationError
ServerError
ServiceUnavailableError
ServiceConnectionError
ResourceNotFound
BadGatewayError
BadRequestError
RateLimitExceeded
MultipleMatchingUsersError
HttpError
UnexpectedError

Rate Limiting ~~~~~~~~~~~~~

Calling your clients

rate_limit_details
returns a dict that contains details about your app's current rate limit.

.. code:: python

intercom.rate_limit_details
# {'limit': 180, 'remaining': 179, 'reset_at': datetime.datetime(2014, 10, 07, 14, 58)}

Running the Tests

Unit tests:

.. code:: bash

nosetests tests/unit

Integration tests:

.. code:: bash

INTERCOM_PERSONAL_ACCESS_TOKEN=xxx nosetests tests/integration

.. |PyPI Version| image:: https://img.shields.io/pypi/v/python-intercom.svg :target: https://pypi.python.org/pypi/python-intercom .. |PyPI Downloads| image:: https://img.shields.io/pypi/dm/python-intercom.svg :target: https://pypi.python.org/pypi/python-intercom .. |Travis CI Build| image:: https://travis-ci.org/jkeyes/python-intercom.svg :target: https://travis-ci.org/jkeyes/python-intercom .. |Coverage Status| image:: https://coveralls.io/repos/github/jkeyes/python-intercom/badge.svg?branch=master :target: https://coveralls.io/github/jkeyes/python-intercom?branch=master

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.