Python wrapper for the Intercom API.

Overview

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

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

# 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

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

Companies

# 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

# 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

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

Notes

# Find a note by id
note = intercom.notes.find(id=note)
# Create a note for a user
note = intercom.notes.create(
    body="<p>Text for the note</p>",
    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

# 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

# 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

# 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

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

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.

# 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

# 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.

# 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:

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.

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

Running the Tests

Unit tests:

nosetests tests/unit

Integration tests:

INTERCOM_PERSONAL_ACCESS_TOKEN=xxx nosetests tests/integration
Comments
  • support latest Intercom API

    support latest Intercom API

    Hi there,

    This doesn't seem to support the latest Intercom API, and instead uses the v1 API. Are there any plans to support the latest API?

    http://doc.intercom.io/api/#intercom-api

    Some documentation links from the old API docs do not work anymore, and new features are only available with the new API.

    Thanks for writing these Python bindings!

    opened by spang 38
  • NoneType returned on user email change

    NoneType returned on user email change

    Hi @jkeyes thanks for the beta release!

    Interesting edge-case but if I do this user = User.create(email="[email protected]", user_id=1) print type(user)

    I get <class 'intercom.user.User'> as expected.

    However, if my user decides to ever change their email address for their account: user = User.create(email="[email protected]", user_id=1) print type(user)

    I get a <type 'NoneType'> response and can't continue to add custom_attributes etc or .save etc. On Intercom, i see that [email protected] either no longer exists and/or is overwritten as expected with [email protected] which is correct (all activity still remains so I am guessing the user object hasn't been changed).

    opened by greenafrican 25
  • UnboundLocalError: local variable 'body' referenced before assignment

    UnboundLocalError: local variable 'body' referenced before assignment

    Getting the below error when trying:

    from intercom import User as User
    from intercom import Intercom
    
    Intercom.app_id = 'xxx'
    Intercom.app_api_key = 'xxx'
    
    user = User.create(email='[email protected]')
    

    Error:

    ~/.../app/lib/python2.7/site-packages/intercom/request.pyc in parse_body(cls, resp)
         46         except ValueError:
         47             cls.raise_errors_on_failure(resp)
    ---> 48         if body.get('type') == 'error.list':
         49             cls.raise_application_errors_on_failure(body, resp.status_code)
         50         return body
    
    UnboundLocalError: local variable 'body' referenced before assignment
    
    bug 
    opened by greenafrican 19
  • High level support for `Company`

    High level support for `Company`

    Intercom supports high level API to query company. Docs are available at http://doc.intercom.io/api/#companies.

    Here is a python example for it, http://doc.intercom.io/api/#view-a-company.

    In [43]: intercom.Intercom._call('GET', intercom.Intercom.api_endpoint + 'companies', params={'id': 1})
    Out[43]:
    {u'created_at': 1410530757,
     u'custom_data': {},
     u'id': u'1',
     u'monthly_spend': 18,
     u'name': u'\u0627\u0633\u0645 \u0627\u0644\u0634\u0631\u0643\u06296',
     u'plan': u'4'}
    

    Add a new Company class which can perform various operation. If ok, I can send pull request.

    opened by kracekumar 11
  • Next Page in Iteration fails

    Next Page in Iteration fails

    Hi, I'm running the following code and it fails consistently both in users and leads when it needs to page.

    This happens in Python 2.7 or 3.0

    for lead in intercom.leads.all(): print(lead.email)

    for user in intercom.users.all(): print(user.email)

    Error is:

    Traceback

    (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/collection_proxy.py", line 52, in next resource = six.next(self.resources) StopIteration

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 142, in _new_conn (self.host, self.port), self.timeout, **extra_kw) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/util/connection.py", line 67, in create_connection for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/socket.py", line 732, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno 8] nodename nor servname provided, or not known

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 578, in url open chunked=chunked) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 351, in _make_request self._validate_conn(conn) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 814, in _validate_conn conn.connect() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 254, in connect conn = self._new_conn() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 151, in _new_conn self, "Failed to establish a new connection: %s" % e) requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x1033d75c0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py", line 403, in send timeout=timeout File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 623, in url open _stacktrace=sys.exc_info()[2]) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/util/retry.py", line 281, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.intercom.iohttps', port=443): Max retries exceeded with url: //api.intercom.io/users?per_page=50&page=2 (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x1033d75c0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known',))

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "CleanIntercomLeads.py", line 9, in for lead in intercom.users.all(): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/collection_proxy.py", line 54, in next self.get_next_page() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/collection_proxy.py", line 71, in get_next_page return self.get_page(self.next_page) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/collection_proxy.py", line 81, in get_page response = self.client.get(url, params) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/client.py", line 89, in get return self._execute_request(req, params) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/client.py", line 82, in _execute_request result = request.execute(self.base_url, self._auth, params) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/request.py", line 23, in execute return self.send_request_to_path(base_url, auth, params) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/python_intercom-3.0b2-py3.5.egg/intercom/request.py", line 57, in send_request_to_path auth=auth, verify=certifi.where(), *_req_params) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/api.py", line 57, in request return session.request(method=method, url=url, *_kwargs) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py", line 475, in request resp = self.send(prep, *_send_kwargs) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/sessions.py", line 585, in send r = adapter.send(request, *_kwargs) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/adapters.py", line 467, in send raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.intercom.iohttps', port=443): Max retries exceeded with url: //api.intercom.io/users?per_page=50&page=2 (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x1033d75c0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known',))

    opened by rsalesas 10
  • ResourceNotFound error

    ResourceNotFound error

    Hi John,

    thanks for putting together this library for our use. Do you know what this error means? I try the same call from my console, and I don't get any error - so I'm not sure what's causing this.

    File "/src/index.py", line 399, in send_event_to_intercom impression = Event.create(event_name=event, user_id=customer_id, metadata=properties) File "intercom/events.py", line 17, in create resp = Intercom.create_event(event_name=event_name, user_id=user_id, email=email, metadata=metadata) File "intercom/intercom.py", line 463, in create_event 'POST', Intercom.api_endpoint + 'events', params=params) File "intercom/intercom.py", line 66, in wrapper raise_errors_on_failure(response) File "intercom/intercom.py", line 76, in raise_errors_on_failure raise ResourceNotFound("Not found.")

    opened by skunkwerk 10
  • Support for personal access tokens?

    Support for personal access tokens?

    Just got a message from intercom that api tokens will no longer be accepted as of Jan 27th, 2017 - is there a plan to support their new personal access tokens ?See: https://developers.intercom.io/v2.0/docs/personal-access-tokens

    opened by rsaftoiu 8
  • Force UTC datetimes

    Force UTC datetimes

    The Intercom API docs states that all UNIX timestamp fields are treated as UTC. This (excellent!) client library uses time- and date functions that assume localtime (time.mktime, datetime.fromtimestamp, datetime.timetuple).

    This means that when you feed UTC-timestamps to Intercom, but your localtime is not GMT, you'll get wrong dates back.

    This PR fixes this issue by replacing all functions that assume local time with their UTC-counterparts (calendar.timegm, datetime.utcfromtimestamp, datetime.utctimetuple) and forcing a UTC-timezone on returned datetimes.

    Another solution would be to skip the user friendliness of converting timestamps to datetimes, and leave this to the user. He'll know whether he stored timestamps using UTC or localtimes so he can do the conversion correctly.

    opened by gertjanol 8
  • Bugfix: use apparent_encoding if encoding is set to None

    Bugfix: use apparent_encoding if encoding is set to None

    Defeat value for encoding attribute in class requests.Response is None. If server doesn't set it to something useful (ie on 202 responses) it remains None and gets passed to decode() and thus fails. Class requests. Response has very nice fallback, apparent_encoding, that is provided by the chardet library and can come in handy here.

    opened by maiiku 8
  • Add interface support for opens, closes, and assignments

    Add interface support for opens, closes, and assignments

    We recently added support for assigning, opening, and closing conversations: https://doc.intercom.io/api/#replying-to-a-conversation

    We've also released updated versions of the Go, Java, Ruby, and PHP libraries. Be good to get nice support in here too!

    opened by bobjflong 7
  • Extended error handling and added support for finding admin by ID

    Extended error handling and added support for finding admin by ID

    Added support for the following error codes:

    • client_error
    • type_mismatch
    • not_restorable
    • server_error
    • token_not_found
    • token_revoked
    • token_blocked
    • token_expired
    • admin_not_found

    Reference - https://developers.intercom.com/v2.0/reference#error-codes Fix for https://github.com/jkeyes/python-intercom/issues/161

    Added support for finding admins by id (fix for https://github.com/jkeyes/python-intercom/issues/159): intercom.admins.find(id="123456")

    opened by tanasegabriel 6
  • Documentation for Bulk APIs

    Documentation for Bulk APIs

    Did you forget adding documentation for bulk operations on the intercom website or was it intentionally removed?

    From what I can see here is the PR for bulk operations : https://github.com/intercom/python-intercom/pull/112 And here's the docs : https://developers.intercom.com/intercom-api-reference/reference

    I tried the links present as refs in the code but they don't open up anywhere. I kind of need to use this API, so any pointers on this are really appreciated.

    Regards!

    opened by yvsssantosh 0
  • Get user by id error: Requested resource is not available in current API version

    Get user by id error: Requested resource is not available in current API version

    Python: 3.6.4 Python-intercom: 3.1.0

    DEBUG:intercom.request:Sending GET request to: https://api.intercom.io/users
    DEBUG:intercom.request:  headers: {'User-Agent': 'python-intercom/3.1.0', 'AcceptEncoding': 'gzip, deflate', 'Accept': 'application/json'}
    DEBUG:intercom.request:  params: {'user_id': 123456789}
    DEBUG:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): api.intercom.io
    DEBUG:requests.packages.urllib3.connectionpool:https://api.intercom.io:443 "GET /users?user_id=123456789 HTTP/1.1" 400 None
    DEBUG:intercom.request:Response received from https://api.intercom.io/users
    DEBUG:intercom.request:  encoding=utf-8 status:400
    DEBUG:intercom.request:  content:
    b'{"type":"error.list","request_id":"0008********00","errors":[{"code":"intercom_version_invalid","message":"Requested resource is not available in current API version"}]}'
    
    opened by eapermyakov 1
  •  How to convert object to dict or json?

    How to convert object to dict or json?

    I need to store every field into mysql,but I get a result like "<intercom.utils.Team object at 0x00000000047F3308>". How to convert the object to dict or json?

    opened by sujianbin 2
Aws-lambda-requests-wrapper - Request/Response wrapper for AWS Lambda with API Gateway

AWS Lambda Requests Wrapper Request/Response wrapper for AWS Lambda with API Gat

null 1 May 20, 2022
PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.

PRAW: The Python Reddit API Wrapper PRAW, an acronym for "Python Reddit API Wrapper", is a Python package that allows for simple access to Reddit's AP

Python Reddit API Wrapper Development 3k Dec 29, 2022
PRAW, an acronym for "Python Reddit API Wrapper", is a python package that allows for simple access to Reddit's API.

PRAW: The Python Reddit API Wrapper PRAW, an acronym for "Python Reddit API Wrapper", is a Python package that allows for simple access to Reddit's AP

Python Reddit API Wrapper Development 3k Dec 29, 2022
Python API wrapper around Trello's API

A wrapper around the Trello API written in Python. Each Trello object is represented by a corresponding Python object. The attributes of these objects

Richard Kolkovich 904 Jan 2, 2023
Async ready API wrapper for Revolt API written in Python.

Mutiny Async ready API wrapper for Revolt API written in Python. Installation Python 3.9 or higher is required To install the library, you can just ru

null 16 Mar 29, 2022
A Python API wrapper for the Twitter API!

PyTweet PyTweet is an api wrapper made for twitter using twitter's api version 2! Installation Windows py3 -m pip install PyTweet Linux python -m pip

TheFarGG 1 Nov 19, 2022
Python API wrapper library for Convex Value API

convex-value-python Python API wrapper library for Convex Value API. Further Links: Convex Value homepage @ConvexValue on Twitter JB on Twitter Authen

Aaron DeVera 2 May 11, 2022
This an API wrapper library for the OpenSea API written in Python 3.

OpenSea NFT API Python 3 wrapper This an API wrapper library for the OpenSea API written in Python 3. The library provides a simplified interface to f

Attila Tóth 159 Dec 26, 2022
YARSAW is an Async Python API Wrapper for the Random Stuff API.

Yet Another Random Stuff API Wrapper - YARSAW YARSAW is an Async Python API Wrapper for the Random Stuff API. This module makes it simpler for you to

Bruce 6 Mar 27, 2022
EpikCord.py - This is an API Wrapper for Discord's API for Python

EpikCord.py - This is an API Wrapper for Discord's API for Python! We've decided not to fork discord.py and start completely from scratch for a new, better structuring system!

EpikHost 28 Oct 10, 2022
A simple Python API wrapper for Cloudflare Stream's API.

python-cloudflare-stream A basic Python API wrapper for working with Cloudflare Stream. Arbington.com started off using Cloudflare Stream. We used the

Arbington 3 Sep 8, 2022
Discord-Wrapper - Discord Websocket Wrapper in python

This does not currently work and is in development Discord Websocket Wrapper in

null 3 Oct 25, 2022
An API wrapper around the pythonanywhere's API.

pyaww An API wrapper around the pythonanywhere's API. The name stands for pythonanywherewrapper. 100% api coverage most of the codebase is documented

null 7 Dec 11, 2022
An API Wrapper for Gofile API

Gofile2 from gofile2 import Gofile g_a = Gofile() print(g_a.upload(file="/home/itz-fork/photo.png")) An API Wrapper for Gofile API. About API Gofile

I'm Not A Bot #Left_TG 16 Dec 10, 2022
A simple API wrapper for the Tenor API

Gifpy A simple API wrapper for the Tenor API Installation Python 3.9 or higher is recommended python3 -m pip install gifpy Clone repository: $ git cl

Juan Ignacio Battiston 4 Dec 22, 2021
An API wrapper around Discord API.

NeoCord This project is work in progress not for production use. An asynchronous API wrapper around Discord API written in Python. Features Modern API

Izhar Ahmad 14 Jan 3, 2022
A wrapper for The Movie Database API v3 and v4 that only uses the read access token (not api key).

fulltmdb A wrapper for The Movie Database API v3 and v4 that only uses the read access token (not api key). Installation Use the package manager pip t

Jacob Hale 2 Sep 26, 2021
An API wrapper around the pythonanywhere's API.

pyaww An API wrapper around the pythonanywhere's API. The name stands for pythonanywherewrapper. 100% API coverage Most of the codebase is documented

null 7 Dec 11, 2022
An API wrapper for Henrik's Unofficial VALORANT API

ValorantAPI.py An API wrapper for Henrik's Unofficial VALORANT API Warning!! This project is still in beta and only contains barely anything yet. If y

Jakkaphat Chalermphanaphan 0 Feb 4, 2022