Categorygithub.com/mercury-labs/intercom-go
modulepackage
2.0.0+incompatible
Repository: https://github.com/mercury-labs/intercom-go.git
Documentation: pkg.go.dev

# README

Intercom-Go

Circle CI

Thin client for the Intercom API.

Install

go get gopkg.in/intercom/intercom-go.v2

docker_image 1
Try out our Docker Image (Beta) to help you get started more quickly.
It should make it easier to get setup with the SDK and start interacting with the API.
(Note, this is in Beta and is for testing purposes only, it should not be used in production)

Usage

Getting a Client

import (
	intercom "gopkg.in/intercom/intercom-go.v2"
)
// You can use either an an OAuth or Access Token
ic := intercom.NewClient("access_token", "")

This client can then be used to make requests.

If you already have an access token you can find it here. If you want to create or learn more about access tokens then you can find more info here.

If you are building a third party application you can get your OAuth token by setting-up-oauth for Intercom. You can use the Goth library which is a simple OAuth package for Go web aplicaitons and supports Intercom to more easily implement Oauth.

Client Options

The client can be configured with different options by calls to ic.Option:

ic.Option(intercom.TraceHTTP(true)) // turn http tracing on
ic.Option(intercom.BaseURI("http://intercom.dev")) // change the base uri used, useful for testing
ic.Option(intercom.SetHTTPClient(myHTTPClient)) // set a new HTTP client, see below for more info

or combined:

ic.Option(intercom.TraceHTTP(true), intercom.BaseURI("http://intercom.dev"))

Users

Save

user := intercom.User{
	UserID: "27",
	Email: "[email protected]",
	Name: "InterGopher",
	SignedUpAt: int64(time.Now().Unix()),
	CustomAttributes: map[string]interface{}{"is_cool": true},
}
savedUser, err := ic.Users.Save(&user)
  • One of UserID, or Email is required.
  • SignedUpAt (optional), like all dates in the client, must be an integer(32) representing seconds since Unix Epoch.
Adding/Removing Companies

Adding a Company:

companyList := intercom.CompanyList{
	Companies: []intercom.Company{
		{CompanyID: "5"},
	},
}
user := intercom.User{
	UserID: "27",
	Companies: &companyList,
}

Removing is similar, but adding a Remove: intercom.Bool(true) attribute to a company.

Find

user, err := ic.Users.FindByID("46adad3f09126dca")
user, err := ic.Users.FindByUserID("27")
user, err := ic.Users.FindByEmail("[email protected]")

List

userList, err := ic.Users.List(intercom.PageParams{Page: 2})
userList.Pages // page information
userList.Users // []User
userList, err := ic.Users.Scroll("")
scrollParam := userList.ScrollParam
userList, err := ic.Users.Scroll(scrollParam)
userList, err := ic.Users.ListBySegment("segmentID123", intercom.PageParams{})
userList, err := ic.Users.ListByTag("42", intercom.PageParams{})

Delete

user, err := ic.Users.Delete("46adad3f09126dca")

Contacts

Contacts are the same as leads.

In the Intercom API we refer to contacts as leads. See here for more info We did not change this in the SDK since that would be a major breaking change. This is something we will address shortly. So any reference to contacts in the SDK is a reference to a lead in Intercom

Find

contact, err := ic.Contacts.FindByID("46adad3f09126dca")
contact, err := ic.Contacts.FindByUserID("27")

List

contactList, err := ic.Contacts.List(intercom.PageParams{Page: 2})
contactList.Pages // page information
contactList.Contacts // []Contact
contactList, err := ic.Contacts.Scroll("")
scrollParam = contactList.ScrollParam
contactList, err := ic.Contacts.Scroll(scrollParam)
contactList, err := ic.Contacts.ListByEmail("[email protected]", intercom.PageParams{})

Create

contact := intercom.Contact{
	Email: "[email protected]",
	Name: "SomeContact",
	CustomAttributes: map[string]interface{}{"is_cool": true},
}
savedContact, err := ic.Contacts.Create(&contact)
  • No identifier is required.
  • Set values for UserID will be ignored (consider creating Users instead)

Update

contact := intercom.Contact{
	UserID: "abc-13d-3",
	Name: "SomeContact",
	CustomAttributes: map[string]interface{}{"is_cool": true},
}
savedContact, err := ic.Contacts.Update(&contact)
  • ID or UserID is required.
  • Will not create new contacts.

Convert

Used to convert a Contact into a User

contact := intercom.Contact{
	UserID: "abc-13d-3",
}
user := intercom.User{
	Email: "[email protected]",
}
savedUser, err := ic.Contacts.Convert(&contact, &user)
  • If the User does not already exist in Intercom, the Contact will be uplifted to a User.
  • If the User does exist, the Contact will be merged into it and the User returned.

Companies

Save

company := intercom.Company{
	CompanyID: "27",
	Name: "My Co",
	CustomAttributes: map[string]interface{}{"is_cool": true},
	Plan: &intercom.Plan{Name: "MyPlan"},
}
savedCompany, err := ic.Companies.Save(&company)
  • CompanyID is required.

Find

company, err := ic.Companies.FindByID("46adad3f09126dca")
company, err := ic.Companies.FindByCompanyID("27")
company, err := ic.Companies.FindByName("My Co")

List

companyList, err := ic.Companies.List(intercom.PageParams{Page: 2})
companyList.Pages // page information
companyList.Companies // []Companies
companyList, err := ic.Companies.ListBySegment("segmentID123", intercom.PageParams{})
companyList, err := ic.Companies.ListByTag("42", intercom.PageParams{})

ListUsers

userList, err := ic.Companies.ListUsersByID("46adad3f09126dca", intercom.PageParams{})
userList.Users // []User
userList, err := ic.Companies.ListUsersByCompanyID("27", intercom.PageParams{})

Events

Save

event := intercom.Event{
	UserID: "27",
	EventName: "bought_item",
	CreatedAt: int64(time.Now().Unix()),
	Metadata: map[string]interface{}{"item_name": "PocketWatch"},
}
err := ic.Events.Save(&event)
  • One of UserID, ID, or Email is required (With leads you need to use ID).
  • EventName is required.
  • CreatedAt is required, must be an integer representing seconds since Unix Epoch. Will be set to now unless given.
  • Metadata is optional, and can be constructed using the helper as above, or as a passed map[string]interface{}.

Admins

List

adminList, err := ic.Admins.List()
admins := adminList.Admins

Tags

List

tagList, err := ic.Tags.List()
tags := tagList.Tags

Save

tag := intercom.Tag{Name: "GoTag"}
savedTag, err := ic.Tags.Save(&tag)

Name is required. Passing an ID will attempt to update the tag with that ID.

Delete

err := ic.Tags.Delete("6")

Tagging Users/Companies

taggingList := intercom.TaggingList{Name: "GoTag", Users: []intercom.Tagging{{UserID: "27"}}}
savedTag, err := ic.Tags.Tag(&taggingList)

A Tagging can identify a User or Company, and can be set to Untag:

taggingList := intercom.TaggingList{Name: "GoTag", Users: []intercom.Tagging{{UserID: "27", Untag: intercom.Bool(true)}}}
savedTag, err := ic.Tags.Tag(&taggingList)

Segments

List

segmentList := ic.Segments.List()
segments, err := segmentList.Segments

Find

segment, err := ic.Segments.Find("abc312daf2397")

Messages

New Admin to User/Contact Email

msg := intercom.NewEmailMessage(intercom.PERSONAL_TEMPLATE, intercom.Admin{ID: "1234"}, intercom.User{Email: "[email protected]"}, "subject", "body")
savedMessage, err := ic.Messages.Save(&msg)

Can use intercom.PLAIN_TEMPLATE too, or replace the intercom.User with an intercom.Contact.

New Admin to User/Contact InApp

msg := intercom.NewInAppMessage(intercom.Admin{ID: "1234"}, intercom.Contact{Email: "[email protected]"}, "body")
savedMessage, err := ic.Messages.Save(&msg)

New User Message

msg := intercom.NewUserMessage(intercom.User{Email: "[email protected]"}, "body")
savedMessage, err := ic.Messages.Save(&msg)

Conversations

Find Conversation

convo, err := intercom.Conversations.Find("1234")

List Conversations

All

convoList, err := intercom.Conversations.ListAll(intercom.PageParams{})

By User

Showing all for user:

convoList, err := intercom.Conversations.ListByUser(&user, intercom.SHOW_ALL, intercom.PageParams{})

Showing just Unread for user:

convoList, err := intercom.Conversations.ListByUser(&user, intercom.SHOW_UNREAD, intercom.PageParams{})

By Admin

Showing all for admin:

convoList, err := intercom.Conversations.ListByAdmin(&admin, intercom.SHOW_ALL, intercom.PageParams{})

Showing just Open for admin:

convoList, err := intercom.Conversations.ListByAdmin(&admin, intercom.SHOW_OPEN, intercom.PageParams{})

Showing just Closed for admin:

convoList, err := intercom.Conversations.ListByAdmin(&admin, intercom.SHOW_CLOSED, intercom.PageParams{})

Reply

User reply:

convo, err := intercom.Conversations.Reply("1234", &user, intercom.CONVERSATION_COMMENT, "my message")

User reply with attachment:

convo, err := intercom.Conversations.ReplyWithAttachmentURLs("1234", &user, intercom.CONVERSATION_COMMENT, "my message", string[]{"http://www.example.com/attachment.jpg"})

User reply that opens:

convo, err := intercom.Conversations.Reply("1234", &user, intercom.CONVERSATION_OPEN, "my message")

Admin reply:

convo, err := intercom.Conversations.Reply("1234", &admin, intercom.CONVERSATION_COMMENT, "my message")

Admin note:

convo, err := intercom.Conversations.Reply("1234", &admin, intercom.CONVERSATION_NOTE, "my message to just admins")

Open and Close

Open:

convo, err := intercom.Conversations.Open("1234", &openerAdmin)

Close:

convo, err := intercom.Conversations.Close("1234", &closerAdmin)

Assign

convo, err := intercom.Conversations.Assign("1234", &assignerAdmin, &assigneeAdmin)

Webhooks

Notifications

If you have received a JSON webhook notification, you may want to convert it into real Intercom object. A Notification can be created from any io.Reader, typically a http request:

var r io.Reader
notif, err := intercom.NewNotification(r)

The returned Notification will contain exactly 1 of the Company, Conversation, Event, Tag or User fields populated. It may only contain partial objects (such as a single conversation part) depending on what is provided by the webhook.

Errors

Errors may be returned from some calls. Errors returned from the API will implement intercom.IntercomError and can be checked:

_, err := ic.Users.FindByEmail("[email protected]")
if herr, ok := err.(intercom.IntercomError); ok && herr.GetCode() == "not_found" {
	fmt.Print(herr)
}

HTTP Client

The HTTP Client used by this package can be swapped out for one of your choosing, with your own configuration, it just needs to implement the HTTPClient interface:

type HTTPClient interface {
	Get(string, interface{}) ([]byte, error)
	Post(string, interface{}) ([]byte, error)
	Patch(string, interface{}) ([]byte, error)
	Delete(string, interface{}) ([]byte, error)
}

It'll probably need to work with appId, apiKey and baseURI values. See the provided client for an example. Then create an Intercom Client and inject the HTTPClient:

ic := intercom.Client{}
ic.Option(intercom.SetHTTPClient(myHTTPClient))
// ready to go!

On Bools

Due to the way Go represents the zero value for a bool, it's necessary to pass pointers to bool instead in some places.

The helper intercom.Bool(true) creates these for you.

Pull Requests

  • Add tests! Your patch won't be accepted if it doesn't have tests.

  • Document any change in behaviour. Make sure the README and any other relevant documentation are kept up-to-date.

  • Create topic branches. Don't ask us to pull from your master branch.

  • One pull request per feature. If you want to do more than one thing, send multiple pull requests.

  • Send coherent history. Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before sending them to us.

# Packages

No description provided by the author

# Functions

BaseURI sets a base URI for the HTTP Client to use.
Bool is a helper method to create *bool.
NewClient returns a new Intercom API client, configured with the default HTTPClient.
NewClientWithHTTPClient returns a new Intercom API client, configured with the supplied HTTPClient interface.
NewEmailMessage creates a new *Message of email type.
NewEventJobItem creates a JobItem that holds an Event.
NewInAppMessage creates a new *Message of InApp (widget) type.
NewNotification parses a Notification from json read from an io.Reader.
NewUserJobItem creates a JobItem that holds an User.
NewUserMessage creates a new *Message from a User.
SetHTTPClient sets a HTTPClient for the Intercom Client to use.
TraceHTTP turns on HTTP request/response tracing for debugging.

# Constants

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
JOB_POST
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Structs

No description provided by the author
No description provided by the author
Admin represents an Admin in Intercom.
AdminAPI implements AdminRepository.
AdminList represents an object holding list of Admins.
AdminService handles interactions with the API through an AdminRepository.
A Client manages interacting with the Intercom API.
Company represents a Company in Intercom Not all of the fields are writeable to the API, non-writeable fields are stripped out from the request.
CompanyAPI implements CompanyRepository.
CompanyIdentifiers to identify a Company using the API.
CompanyList holds a list of Companies and paging information.
CompanyService handles interactions with the API through a CompanyRepository.
Contact represents a Contact within Intercom.
ContactAPI implements ContactRepository.
ContactList holds a list of Contacts and paging information.
No description provided by the author
ContactService handles interactions with the API through a ContactRepository.
A Conversation represents a conversation between users and admins in Intercom.
ConversationAPI implements ConversationRepository.
ConversationContactList ...
ConversationContactObj ...
ConversationList is a list of Conversations.
No description provided by the author
A ConversationMessage is the message that started the conversation rendered for presentation.
A ConversationPart is a Reply, Note, or Assignment to a Conversation.
A ConversationPartList lists the subsequent Conversation Parts.
ConversationRating ...
ConversationService handles interactions with the API through an ConversationRepository.
ConversationStatistics ...
ConversationTagList ...
ConversationTagObj ...
ConversationTeammate ...
Data is the data node of the notification.
An Event represents a new event that happens to a User.
EventAPI implements EventRepository.
EventService handles interactions with the API through an EventRepository.
FirstContactReply ...
JobAPI implements TagRepository.
JobData is a payload that can be used to identify an existing Job to append to.
A JobItem is an item to be processed as part of a bulk Job.
A JobRequest represents a new job to be sent to Intercom.
A JobResponse represents a job enqueud on Intercom.
JobService builds jobs to process.
LocationData represents the location for a User.
No description provided by the author
MessageAPI implements MessageRepository.
MessageRequest represents a Message to be sent through Intercom from/to an Admin, User, or Contact.
MessageResponse represents a Message to be sent through Intercom from/to an Admin, User, or Contact.
MessageService handles interactions with the API through an MessageRepository.
Notification is the object delivered to a webhook.
PageParams determine paging information to and from the API.
The Plan a Company is on.
A Reply to an Intercom conversation.
No description provided by the author
Segment represents an Segment in Intercom.
SegmentAPI implements SegmentRepository.
SegmentList, an object holding a list of Segments.
SegmentService handles interactions with the API through a SegmentRepository.
SLAApplied ...
SocialProfile represents a social account for a User.
SocialProfile list is a list of SocialProfiles for a User.
Source ...
SourceAuthor ...
Tag represents an Tag in Intercom.
TagAPI implements TagRepository.
A Tagging is an object identifying a User or Company to be tagged, that can optionally be set to untag.
TaggingList is an object used to Tag Users and Companies.
TagList, an object holding a list of Tags.
TagService handles interactions with the API through a TagRepository.
User represents a User within Intercom.
UserAPI implements UserRepository.
UserAvatar represents an avatar for a User.
A Company the User belongs to used to update Companies on a User.
UserIdentifiers are used to identify Users in Intercom.
UserList holds a list of Users and paging information.
UserService handles interactions with the API through a UserRepository.

# Interfaces

AdminRepository defines the interface for working with Admins through the API.
CompanyRepository defines the interface for working with Companies through the API.
ContactRepository defines the interface for working with Contacts through the API.
ConversationRepository defines the interface for working with Conversations through the API.
EventRepository defines the interface for working with Events through the API.
IntercomError is a known error from the Intercom API.
JobRepository defines the interface for working with Jobs.
A MessagePerson is someone to send a Message to and from.
MessageRepository defines the interface for creating and updating Messages through the API.
SegmentRepository defines the interface for working with Segments through the API.
TagRepository defines the interface for working with Tags through the API.
UserRepository defines the interface for working with Users through the API.

# Type aliases

The state of Conversations to query SHOW_ALL shows all conversations, SHOW_OPEN shows only open conversations (only valid for Admin Conversation queries) SHOW_CLOSED shows only closed conversations (only valid for Admin Conversation queries) SHOW_UNREAD shows only unread conversations (only valid for User Conversation queries).
No description provided by the author
The state of a Job.
MessageTemplate determines the template used for email messages to Users or Contacts (plain or personal).
ReplyType determines the type of Reply.