Follow Up Boss

The Follow Up Boss Developer Hub

Welcome to the Follow Up Boss developer hub. You'll find comprehensive guides and documentation to help you start working with Follow Up Boss as quickly as possible, as well as support if you get stuck. Let's jump right in!

Get Started    
Suggest Edits

Getting Started with Follow Up Boss

This page will help you get started with Follow Up Boss. You'll be up and running in a jiffy!

 

Follow Up Boss provides a simple REST API that allows developers to integrate their applications quickly. API is in active development and will be extended to provide more functionality while keeping it backwards compatible.

API Endpoint

API Endpoint URL has the following structure, https://api.followupboss.com/v1/people

  • https:// - HTTPS is required for security, HTTP will not work.
  • api.followupboss.com - API hostname, always the same.
  • v1 - API version, currently v1 is the only version.
  • people - resource name in plural, such as people, notes, etc.

Examples

Looking for code examples? You can find Bash and PHP examples here

Need Help?

Simply email us at api@followupboss.com and we'll help you to get started or answer any question you might have.

Suggest Edits

Authentication

 

Every user in Follow Up Boss has a unique API Key that can be obtained from "Admin" -> "API" screen. External applications use API Key to get authenticated and read/update data in Follow Up Boss on the user's behalf.

Authentication is done with HTTP Basic Authentication over HTTPS. Use API Key as the username and leave the password blank (or you can put any value as password if your HTTP client requires it).

Follow Up Boss API is available via HTTPS only. This ensures that API Key is always encrypted during transmission. API Key provides the same privileges as the user's login credentials and should be handled securely.

API key has the same access level as the user whom the key belongs to. For example, agent's API key allows access only to people assigned to that agent while broker's API key allows access to all people in the account.

Permission Levels

  • Owner: The account owner has access to everything in the account.
  • Admin (Broker): An admin has most access to everything but they can not access Webhooks.
  • Agent: An agent only has access to the contacts they are assigned to, or are a collaborator on. They will also have restricted access to things like action plans.
  • Lender: Similar to an agent, a Lender only has access to contacts they are assigned to, or are a collaborator on, and they will have even fewer actions they can do than an agent.
Suggest Edits

Identification

 

If you integrate with Follow Up Boss we also ask you to identify your system using the "system" query argument:

GET /v1/calls?system=AwesomeWebsiteBuilder HTTP/1.1

Or a "system" key in a POST or PUT request:

POST /v1/events HTTP/1.1
Content-Type: application/json
...
{
    "source": "MyAwesomeWebsite.com",
    "system": "AwesomeSiteBuilder",
    "person": { "firstName": "Mary", "lastName": "Mcmillan" },
    ...
}

On first glance system may look similar to the "source" attribute sent along with lead notification events. The difference is that the lead source describes the brand or marketing name a broker uses for a lead source, and system describes the system used.

Suggest Edits

Requests and Responses

 

Follow Up Boss API uses JSON encoding. When sending POST and PUT requests, request body should contain JSON-encoded data to create or update a resource. We also recommend including a header indicating content type of the request body: Content-Type: application/json.

For example, to update first name on a person with ID = 123 you can use the following request:

PUT /v1/people/123 HTTP/1.1
Content-Type: application/json
...
{"firstName": "Mary"}

Likewise, response body is also encoded using JSON format.

{
   "id": 123,
   "created": "2012-04-23T02:23:11Z",
   "updated": "2012-04-23T02:23:11Z",
   "lastActivity": "2012-04-23T02:23:11Z",
   "name": "Mary Mcmillan",
   "firstName": "Mary",
   "lastName": "Mcmillan",
   "stage": "Lead",
   "source": "Zillow",
   ...
}

Date Format

Please note the date format in the example above: 2012-04-23T02:23:11Z. It's ISO 8601 standard, we use that format for all date and time values.

Time is always expressed in UTC time zone.

Response Codes

On success for new resources, you will get a "201 Created" or "200 OK" response if an existing resource was updated.

Response Bodies

In general, response bodies for creating or updating resources will be in the same format as returned by a GET request for that resource.

Suggest Edits

Searching

 

When listing resources in a collection you can filter results by specifying search conditions as query parameters in the URL. For example, to search person by email address you can use this:

GET /v1/people?email=john%40gmail.com

You can specify multiple search criteria and they will be combined using "AND" logic. For example, to find past clients that came from Zillow use this request:

GET /v1/people?stage=Past%20Client&source=Zillow
Suggest Edits

Pagination

 

List methods that return a collection of resources are paginated using offset and limit query parameters. Default limit value is 10 and default offset value is 0. Resources are returned in reverse order by id, so by default, API returns the last 10 resources in a collection. To obtain the next page of 10 resources specify offset=10 query parameter, then offset=20 and so on. You can increase the number of resources returned at a time using the limit parameter. Maximum value for the limit parameter is 100.

For example, to return the third page of most recently created people with 25 people per page:

GET /v1/people?offset=50&limit=25

Response contains "_metadata" section that includes total number of records available and pagination parameters used in the request:

{
  "_metadata": {
    "collection": "people",
    "offset": 50,
    "limit": 25,
    "total": 1000
  },
  "people": [
    {
      "id": 950,
      "created": "2012-04-23T02:23:11Z",
      ...
    },
    {
      "id": 949,
      "created": "2012-04-22T02:23:11Z",
      ...
    },
    ...
    {
      "id": 926,
      "created": "2012-04-19T02:23:11Z",
      ...
    }
  ]
}

Why use descending order? It makes it easier to retrieve the most recent records, for example to get 5 most recently created people use:

GET /v1/people?limit=5
Suggest Edits

Send in Leads

 

The best way to send leads into Follow Up Boss from an IDX website, real estate portal, your custom website or any other lead source is to use event notifications endpoint (Example, POST /v1/events).

Advantages of using this method include:

  • Avoid creating duplicates, Follow Up Boss will automatically search for existing contact and update it.
  • Event information (inquiry, viewed property, saved property as a favorite, etc) is recorded and shown in contact history and dashboard.
  • Agent is notified about new lead via email / text message.
  • Action plan is applied to the lead (if configured and when particular event types are used).
  • Correct agent is assigned as per Lead Flow screen.
  • Automatic search for social profiles.

Avoid sending leads through `POST /v1/people`.

Please do not use POST /v1/people to send leads into FUB, it will only create a person but will not run any automations listed above. Instead, use POST /v1/events.

Suggest Edits

Merge Fields

 

Email Templates need a way to incorporate contact information into the final email that is to be sent. The way we do it is by unique identifiable text within an email template.

For example if your email template looked like: Hello %contact_name%. And your contact's name was William Riker, the result of the email template would be Hello William Riker.

User Merge Field Mappings

The following merge fields can be obtained with a call to /v1/users/:id.

Merge field
JSON field

%agent_name%

name

%agent_first_name%

firstName

%agent_last_name%

lastName

%agent_email%

email

%agent_phone%

phone

Person Merge Field Mappings

The following merge fields can be obtained with a call to /v1/people/:id.

Merge field
JSON field

%contact_name%

name

%contact_first_name%

firstName

%contact_last_name%

lastName

%contact_email%

emails[0].value

%contact_phone%

phones[0].value

%contact_address%

Combination of Fields:

addresses[0].street
addresses[0].city, addresses[0].code

%contact_street%

addresses[0].street

%contact_city%

addresses[0].city

%contact_state%

addresses[0].state

%contact_zipcode%

addresses[0].code

%contact_country%

addresses[0].country

`%source_name%

source

Inquiry Merge Field Mappings

The following merge fields can be obtained with a call to /v1/events/:personId

Merge field
JSON field

%inquiry_address%

property.street

The inquiry address merge field is intended to be used as the subject of an email without any surrounding text, it should perform some basic substitutions in case there is no inquiry event for the person:

If property.street is empty and %source_name% is not, then: %inquiry_address% is "Your property inquiry from %source_name%"

If both property.street is empty and %source_name% are empty, then: %inquiry_address% is "Your property inquiry"

Suggest Edits

IDX Integration

 

Use the Events API, not the People API to send all data from an IDX website to Follow Up Boss

Make sure all these events are sent to Follow Up Boss:

  • Registration
  • Inquiry
  • Saved Property
  • Viewed Property
  • Property Search
  • All forms on the website send data to Follow Up Boss

Additional items to include

  • Include system field in all API calls to identify your system vs other lead providers
  • Set source field to be the domain of the website without "www.", e.g. mywebsite.com
  • API key is secure and not exposed in browser
  • PPC data ("campaign" section)
  • Link to lead in your backend system if applicable ("sourceUrl" field)
Suggest Edits

Webhooks

Use webhooks to be notified about events that happen in a Follow Up Boss account.

 

Require Owner Permissions

Only the owner has access to Webhooks.

Webhooks post JSON to a specific URL every time an event listed below is triggered. Webhooks remove the need to poll for changes. When an event occurs--for example a person is assigned to a different agent, this event will be sent to your system as an HTTP POST to the webhook URL configured for the peopleUpdated event.

Examples of what you might use webhooks for:

  • Update a person's name in your database when it is changed in Follow Up Boss
  • Update a person's email or phone in your database when it is changed in Follow Up Boss
  • Re-assign a person in your system when it is re-assigned in Follow Up Boss
  • When a Zillow lead is added to Follow Up Boss you add it to your IDX search website

Batch Updates

The following actions can result in a large number of people updates:

  • Tags added or removed
  • Stage updated
  • Source updated
  • Agent re-assigned
  • Lender re-assigned

If one of these actions result in a large number of people being updated, the webhook event notification may be split into multiple requests.

Supported webhook events

People

peopleCreated, peopleUpdated, peopleDeleted

peopleUpdated
One or more of the following fields are updated in a person:

  • Name name firstName lastName
  • Emails emails
  • Phone Numbers phones
  • Address addresses
  • Price price
  • Background background
  • Assigned Agent assignedTo assignedUserId
  • Assigned Lender assignedLenderName assignedLenderId
  • Contacted contacted
  • Stage stage stageId
  • Lead Source source sourceUrl
  • Tags tags

peopleDeleted
When a person is deleted all associated data is deleted as well e.g. notes, calls, text messages, etc. There will not be any delete events triggered for these resources when this happens.

JSON sample of event notification:

{
    "eventId": "64d0ad74-3aab-4b30-89c9-7337398cf8b4",
    "eventCreated": "2016-12-12T15:19:21+00:00",
    "event": "peopleCreated",
    "resourceIds": [1234,5322,29456],
    "uri": "https://api.followupboss.com/v1/people?id=1234,5322,29456"
}

Notes

notesCreated, notesUpdated, notesDeleted

Emails

emailsCreated, emailsUpdated, emailsDeleted

Tasks

tasksCreated, tasksUpdated, tasksDeleted

Text Messages

textMessagesCreated, textMessagesUpdated, textMessagesDeleted

Calls

callsCreated, callsUpdated, callsDeleted

Email Marketing Events

emEventsOpened
People open an email marketing email.

emEventsClicked
People click a link in an email marketing email.

emEventsUnsubscribed
People unsubscribe from email marketing emails.

People Events

eventsCreated
People perform an action on your IDX website, e.g. view a property.

Registering a webhook

Send an HTTPS POST to the /v1/webhooks endpoint with a JSON object that specifies the event and callback URL.

POST /v1/webhooks HTTP/1.1
Content-Type: application/json
X-System: AcmeLeadProvider
...
{
  "event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/fub/peopleCreated"
}

The response will be JSON encoded representation of the webhook created.

{
  "id": 1244,
  "status": "Active",
  "event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/fub/peopleCreated"
}

HTTPS Only

Callback URLs must be a secure endpoint

X-System Header is Required

The X-System HTTP Header is required for all requests to /v1/webhooks endpoints.

See /webhooks for detailed documentation of the /v1/webhooks endpoint.

Receiving webhook events

Create an endpoint that accepts HTTP POST requests at the URL specified in the registered webhook. The body of the request will be JSON encoded. To acknowledge the receipt, your endpoint should respond with a 2XX HTTP status code such as 200 or 204. Any other response will indicate that you did not receive the webhook and we will continue to try the endpoint once an hour for up to 36 hours.

For example, the endpoint at https://acmeleadprovider.com/callbacks/fub/peoplecreated would receive the following HTTP POST when a person is created in Follow Up Boss:

POST /callbacks/fub/peoplecreated HTTP/1.1
Content-Type: application/json
...
{
  "eventId": "152d60c0-79da-4018-a9af-28aec8a71c94",
  "eventCreated": "2016-12-12T15:19:21+00:00",
  "event": "peopleCreated",
  "resourceIds": [1234,3244,3232],
  "uri": "https://api.followupboss.com/v1/people?id=1234,3244,3232"
}

Handling webhook events

The endpoint that handles events should do an HTTP GET to the resource URI specified in the event. Then compare the response to the local database and apply changes that are found. The response format for the people endpoint can be found at /people

See the code samples below for handling webhook events:

<?php
const FUB_API_KEY = 'API Key for an Admin user in the Follow Up Boss Account';

// Retrieve the request's body and parse it as JSON
$input = @file_get_contents("php://input");
$event_json = json_decode($input);

$event = $event_json->{'event'};
$resource_uri = $event_json->{'uri'};

// for peopleCreated and peopleUpdated events fetch the people
// at the resource URI

$curl = curl_init($resource_uri);

$headers = array(
    'Authorization: Basic '. base64_encode(FUB_API_KEY . ":")
);

curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($curl);
curl_close($curl);

$remote_records = json_decode($result);

// Compare the remote record with your local record

http_response_code(200); // PHP 5.4 or greater

echo('OK');

Requesting webhook events

Individual webhook events can be requested from /webhookEvents/:id . This can useful if your system was unavailable to receive events for some reason and there are events older than 3 days that were missed.

Webhook Event Retries

If your system is unavailable or responds with an HTTP status code other than 2XX such as 200 or 204, FUB will retry every hour for up to 36 hours.

Webhook best practices

Setup your system to de-couple receiving webhook events from fetching the resource specified in the event. For example--the web service that receives events could record the event in a local database table. A separate backend process could be created to monitor this table for new rows and fetch the resource specified in the event. By separating these, the web service that handles receiving webhooks is doing less and is, therefore less likely to fail. The process that processes the events can contain all the complex logic to fetch the resource from Follow Up Boss, reconcile with your local system and mark the event as processed in the table. If this process fails or breaks it can be debugged independently of the web service. The table that stores events is the source of truth as to what webhook events have been received and processed.

Debugging webhooks

Since webhooks require a publicly accessible URL to function they can be hard to test from your local machine. It is recommended that you use a service like RequestBin when you are developing your webhook endpoints.

Common webhook mistakes

  • Make sure you provide the correct URL when registering a webhook. You can list all your webhooks at the /webhooks endpoint.
  • Make sure the webhook endpoint is returning a 2XX HTTP status code such as 200
  • When registering a webhook make sure you are setting the X-System header. You can also include the system param in the query string or post data. For example: https://api.followupboss.com/v1/webhooks/32?system=AcmeCo
  • If you are setting up webhooks for multiple Follow Up Boss accounts be sure to include a Follow Up Boss account identifier in the registered webhook URLs. Your webhook URLs should look like this: https://acmeLeadProvider.com/callbacks/fub/account12/peopleCreated or https://acmeLeadProvider.com/callbacks/fub/peopleCreated?fub_account=12
Suggest Edits

/events

Search for events

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/events
curl --request GET \
  --url https://api.followupboss.com/v1/events
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/events' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/events")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/events");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/events"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "events",
    "offset": 0,
    "limit": 1,
    "total": 1000
  },
  "events": [
    {
      "id": 132,
      "created": "2014-05-05T19:38:27Z",
      "updated": "2014-05-05T19:38:27Z",
      "personId": 12264,
      "message": "I am interested in 6825 Mulholland Dr, ...",
      "description": "Move-in: 12/28/2013",
      "noteId": 32,
      "source": "Zillow",
      "type": "Property Inquiry",
      "property": {
        "street": "6825 Mulholland Dr",
        "city": "Los Angeles",
        "state": "CA",
        "code": "90068",
        "mlsNumber": "14729339",
        "price": "310000",
        "forRent": "0",
        "url": "http://www.zillow.com/homedetails/6825-Mulholland-Dr-Los-Angeles-CA-90068/2109065822_zpid/",
        "type": "Residential",
        "bedrooms": "0",
        "bathrooms": null,
        "area": null,
        "lot": null
      },
      "pageTitle": null,
      "pageUrl": null,
      "pageDuration": 0
    }
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

personId
int32

Find all events related to a person

type
string

Comma separated list of one or more of the following: "Registration", "Inquiry", "Seller Inquiry", "Property Inquiry", "General Inquiry", "Viewed Property", "Saved Property", "Visited Website", "Incoming Call", "Unsubscribed", "Property Search", "Saved Property Search", "Visited Open House" or "Viewed Page"

 
Suggest Edits

/events

Send in a lead or event related to a lead

You can notify Follow Up Boss when certain events occur on your website or system, for example user fills out a registration form on an IDX website, sends an inquiry about a property or submits Contact Us form. This is the only correct way to send leads and their activity to Follow Up Boss from an IDX website, real estate portal, your custom website or any other lead source.

New leads created by POST /v1/events will only trigger action plans if they are of the following types: "Registration", "Seller Inquiry", "Property Inquiry", "General Inquiry" "Visited Open House"

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/events
{
    "source": "MyAwesomeWebsite.com",
    "system": "AwesomeSiteBuilder",
    "type": "General Inquiry",
    "message": "Looking for a house under $500k in the East Boston area",
    "person": {
        "firstName": "John",
        "lastName": "Smith",
        "emails": [{"value": "john@gmail.com"}],
        "phones": [{"value": "555-555-5555"}]
    }
}
{
  "source": "Zillow",
  "system": "Zillow",
  "type": "Property Inquiry",
  "message": "I am interested in 6825 Mulholland Dr, ...",
  "description": "Move-in: 12/28/2013",
  "person": {
    "firstName": "Melissa ",
    "lastName": "Hartman",
    "emails": [ { "value": "m.hartman@example.com", "type": "home" } ],
    "phones": [ { "value": "(555) 555-1234", "type": "home" } ],
    "tags": [ "Lease option" ],
    "sourceUrl": "http://click.email.zillow.com/?qs=1e120cec11e3",
    "customBirthday": "2/16/1990"
  },
  "property": {
    "street": "6825 Mulholland Dr",
    "city": "Los Angeles",
    "state": "CA",
    "code": "90068",
    "mlsNumber": "14729339",
    "price": "310000",
    "forRent": "0",
    "url": "http://www.zillow.com/homedetails/6825-Mulholland-Dr-Los-Angeles-CA-90068/2109065822_zpid/",
    "type": "Residential"
  },
  "propertySearch": {
    "type": "Lot",
    "neighborhood": "Cahuenga Pass",
    "city": "Los Angeles",
    "state": "CA",
    "code": "90068",
    "minPrice": 100000,
    "maxPrice": 500000
  },
  "campaign": {
    "source": "google",
    "medium": "organic",
    "term": "Cahuenga Pass land",
    "content": "",
    "campaign": ""
  }
}
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

source
string

The name of the lead source

system
string

The name of the system used in providing leads.

type
string

The type of event. Currently one of Registration, Inquiry, Seller Inquiry, Property Inquiry, General Inquiry, Viewed Property, Saved Property, Visited Website, Incoming Call, Unsubscribed, Property Search, Saved Property Search, Visited Open House or Viewed Page

message
string

A message from the user about this inquiry

person
object

Information about the lead who triggered this event. Follow Up Boss will automatically de-duplicate people based on their phone number or email address.

 
person.firstName
string

The first/given name of the contact

person.lastName
string

The last/family name of the contact

person.stage
string

The stage of the contact. Example Lead or Trash. See stages API endpoint for more options.

person.source
string

The source of the lead.

person.sourceUrl
string

This is a direct link to the information about a contact at the lead provider.

person.contacted
boolean

Whether the person has been contacted.

person.price
int32

The estimated sell/buy price for this contact

person.assignedTo
string

Full name of the agent to assign to this contact

person.assignedLenderName
string

Full name of the lender to assign to this contact

person.emails
array

A list of email addresses associated with the contact:

person.emails[n].value
string

An email address

person.emails[n].type
string

The email address type. Example home, work or other

person.emails[n].isPrimary
boolean

Whether the email address is the primary address for the contact

person.phones
array

A list of phone numbers associated with the contact:

person.phones[n].value
string

A phone number

person.phones[n].type
string

The phone number type. Example home, work, mobile, fax or other.

person.addresses
array

A list of addresses associated with the contact (this is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).

person.addresses[n].type
string

The address type. Example home, work, mailing or investment

person.addresses[n].street
string

Street address. Example 3595 South Higuera St, Suite B

person.addresses[n].city
string

City name.

person.addresses[n].state
string

Abbreviated state code. Example CA

person.addresses[n].code
string

Zipcode as a string. Example 90210

person.addresses[n].country
string

Country as a string. Example United States

person.tags
array of strings

A list of tags applied to the contact

property
object

Information about the property this event is related to

 
property.street
string

Street address. Example 3595 South Higuera St, Suite B

property.city
string

City name

property.state
string

Abbreviated state code. Example CA

property.code
string

Zipcode as a string. Example 90210

property.mlsNumber
string

MLS Number for the property

property.price
int32

The asking price or price estimate for the property

property.forRent
boolean

Whether this property is for rent

property.url
string

A URL for the property provided by the lead source

property.type
string

A freeform description of property type (e.g. "Bungalow" or "Apartment")

property.bedrooms
string

The number of bedrooms

property.bathrooms
string

The number of bathrooms

property.area
string

Area of the property in sqft.

property.lot
string

Area of the lot/land in acres.

propertySearch
object

If this event was an inquiry you may have information about what the contact was searching for, you can submit this information using this field

 
propertySearch.type
string

The type of property the contact was searching for. Example Residential, Lot, Apartment, etc...

propertySearch.neighborhood
string

The contact was looking for properties in this neighborhood

propertySearch.city
string

The contact was looking for properties in this city

propertySearch.state
string

The contact was looking for properties in this state

propertySearch.code
string

The contact was looking for properties in this zipcode

propertySearch.minPrice
int32

The contact was looking for properties this price range

propertySearch.maxPrice
int32

The contact was looking for properties this price range

campaign
object

The name of the source where the contact originated. Example, if the lead came to your site through an organic search on www.google.com the source is google.

 
campaign.medium
string

The medium of the campaign, e.g. for an organic search the medium is "organic".

campaign.term
string

The search terms entered by the contact

campaign.content
string

The content of the campaign

campaign.campaign
string

The name or identifier for this campaign

pageTitle
string

This field is to be used with the Viewed Page event type and indicates the title of the page viewed. Example Contact Us

pageUrl
string

This field is to be used with the Viewed Page event type and indicates the url of the page viewed. Example http://www.cltrealestate.com/contactus

pageDuration
int32

This field is to be used with the Viewed Page event type and indicates the duration of the visitor on the page viewed given in seconds.

 

You can notify Follow Up Boss when certain events occur on your website or system, for example user fills out a registration form on an IDX website, sends an inquiry about a property or submits Contact Us form. This is the only correct way to send leads and their activity to Follow Up Boss from an IDX website, real estate portal, your custom website or any other lead source.

New leads created by POST /v1/events will only trigger action plans if they are of the following types: "Registration", "Seller Inquiry", "Property Inquiry", "General Inquiry" "Visited Open House"

Suggest Edits

/events/:id

Retrieve a single event by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/events/id
curl --request GET \
  --url https://api.followupboss.com/v1/events/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/events/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/events/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/events/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/events/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 132,
  "created": "2014-05-05T19:38:27Z",
  "updated": "2014-05-05T19:38:27Z",
  "personId": 12264,
  "message": "I am interested in 6825 Mulholland Dr, ...",
  "description": "Move-in: 12/28/2013",
  "noteId": 32,
  "source": "Zillow",
  "type": "Property Inquiry",
  "property": {
    "street": "6825 Mulholland Dr",
    "city": "Los Angeles",
    "state": "CA",
    "code": "90068",
    "mlsNumber": "14729339",
    "price": "310000",
    "forRent": "0",
    "url": "http://www.zillow.com/homedetails/6825-Mulholland-Dr-Los-Angeles-CA-90068/2109065822_zpid/",
    "type": "Residential",
    "bedrooms": "0",
    "bathrooms": null,
    "area": null,
    "lot": null
  }
}

Path Params

id
int32
required

Id of the event

 
Suggest Edits

/people

Search for contacts

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/people
curl --request GET \
  --url https://api.followupboss.com/v1/people
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/people' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/people")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/people");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/people"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "people",
    "offset": 0,
    "limit": 10,
    "total": 35
  },
  "people": [
    {
      "id": 10763,
      "created": "2013-10-31T23:04:30Z",
      "updated": "2014-06-27T13:11:23Z",
      "createdVia": "API",
      "lastActivity": "2014-06-27T13:11:23Z",
      "name": "Tom Minch",
      "firstName": "Tom",
      "lastName": "Minch",
      "stage": "Lead",
      "source": "MyAwesomeWebsite.com",
      "sourceUrl": "",
      "contacted": 0,
      "price": 500000,
      "assignedLenderId": null,
      "assignedLenderName": null,
      "assignedUserId": 8,
      "assignedTo": "Agent White",
      "tags": [ "Los Angeles", "90003", "2014 May" ],
      "emails": [
        {
          "value": "tom.minch@example.com",
          "type": "home",
          "isPrimary": 1
        }
      ],
      "phones": [
        {
          "type": "home",
          "value": "555-555-1234"
        }
      ],
      "addresses": [
        {
          "type": "work",
          "street": "322 S Broadway",
          "city": "Los Angeles",
          "state": "CA",
          "code": "90003",
          "country": "United States"
        }
      ],
      "picture": {
        "small": "https://example.com/pictures/89615e1a7fe.jpg"
      }
    }
    ...
  ]
}

Query Params

sort
string

The sort order, can be one of the following: id, created, updated, name, firstName, lastName, price, stage, lastActivity, lastReceivedEmail, lastSentEmail, lastEmail, emailsReceived, emailsSent, lastIncomingCall, lastOutgoingCall, lastCall, firstCall, callsIncoming, callsOutgoing, callsDuration, lastReceivedText, lastSentText, lastText, lastLeadActivity, lastIdxVisit, textsReceived, textsSent, propertiesViewed, propertiesSaved, pagesViewed or nextTask

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

fields
string

Comma separated list of fields to return. Example firstName,lastName,customFieldName

lastActivityAfter
string

Search for last activity after a given time. Example format: 2016-11-23 01:02:03

lastActivityBefore
string

Search for last activity before a given time. Example format 2016-11-23 01:02:03

name
string

Search for contact with a name LIKE what is given. Example, if you search for drew, it might return a contact like Andrew.

firstName
string

Search for contact with a first name LIKE what is given. Example, if you search for drew, it might return a contact like Andrew.

lastName
string

Search for contact with a last name LIKE what is given. Example, if you search for drew, it might return a contact like Andrew.

email
string

Search for a contact by email address.

phone
string

Search for a contact by phone number.

stage
string

Search for contact by stage name. Example Lead or Trash. See stages API endpoint for available stages.

source
string

Search for a contact by source.

assignedTo
string

Search for contacts by user that is assigned to them. Example, passing William Riker would return any contact assigned to them.

assignedUserId
int32

Search for contacts by the assigned user ID.

assignedLenderName
string

Search for contacts by the assigned lender name.

assignedLenderId
int32

Search for contacts by the assigned lender user ID.

contacted
boolean

Search for contacts by if they have or have not been contacted.

priceAbove
int32

Search for contacts who have specified a price above a given value.

priceBelow
int32

Search for contacts who have specified a price below a given value.

smartListId
int32

Search for contacts that match a smart list with given ID

 
Suggest Edits

/people

Manually add a new contact

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/people
curl --request POST \
  --url https://api.followupboss.com/v1/people
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.followupboss.com/v1/people' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/people")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/people");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/people"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

firstName
string

The first/given name of the contact.

lastName
string

The last/family name of the contact.

stage
string

The stage the contact is in. Example Lead or Trash. See stage API endpoint for more options.

source
string

The source of the lead. Can only be set once for a new person via POST method, cannot be updated via PUT method.

sourceUrl
string

This is a direct link to the information about a contact at the lead provider. Can only be set once for a new person via POST method, cannot be updated via PUT method.

contacted
boolean

Whether the person has been contacted.

price
int32

The price of the property of the contact's first inquiry, or the estimated sell/buy price for this contact.

assignedTo
string

Full name of the agent assigned to this contact.

assignedUserId
int32

ID of the agent assigned to this contact.

assignedLenderName
string

Full name of the lender assigned to this contact.

assignedLenderId
int32

ID of the lender assigned to this contact.

emails
array

A list of email addresses associated with the contact.

phones
array

A list of phone numbers associated with the contact.

addresses
array

A list of addresses associated with the contact (this is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).

tags
array of strings

A list of tags applied to the contact.

background
string

Background information, can be a multi-line string.

 

Important Note

The best way to send leads into Follow Up Boss from an IDX website, real estate portal, your custom website or any other lead source is to use event notifications, i.e. POST /v1/events. Advantages of using this method include:

  • Avoid creating duplicates, Follow Up Boss will automatically search for existing contact and update it;
  • Event information (inquiry, viewed property, saved property as a favorite, etc) is recorded and shown in contact history and dashboard;
  • Agent is notified about new lead via email / text message;
  • Action plan is applied to the lead (if configured);
  • Correct agent is assigned as per Lead Flow screen;
  • Automatic search for social profiles;

Avoid sending leads through `POST /v1/people`.

Please do not use POST /v1/people to send leads into FUB, it will only create a person but will not run any automations listed above. Instead, use POST /v1/events.

Custom Fields

If the account has custom fields defined you can also set these when adding a person. You can use the customFields endpoint to see which custom fields are available in the current account.

Suggest Edits

/people/:id

Retrieve a contact by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/people/id
curl --request GET \
  --url https://api.followupboss.com/v1/people/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/people/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/people/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/people/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/people/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 14412,
  "created": "2016-03-31T16:42:27Z",
  "updated": "2016-11-17T03:44:00Z",
  "createdVia": "API",
  "lastActivity": "2016-11-17T05:01:02Z",
  "name": "William Riker",
  "firstName": "William",
  "lastName": "Riker",
  "stage": "Lead",
  "stageId": "2",
  "source": "<unspecified>",
  "sourceUrl": "",
  "contacted": 1,
  "price": 310000,
  "assignedLenderId": null,
  "assignedLenderName": null,
  "assignedUserId": 1,
  "assignedTo": "Gerald Leenerts",
  "tags": [
    "star trek",
  ],
  "emails": [
    {
      "value": "example@example.com",
      "type": "home",
      "isPrimary": 1
    },
    {
      "value": "mobile@example.com",
      "type": "work",
      "isPrimary": 0
    }
  ],
  "phones": [
    {
      "value": "2345678901",
      "type": "home",
      "isPrimary": 1
    },
    {
      "value": "2345678902",
      "type": "mobile",
      "isPrimary": 0
    }
  ],
  "addresses": [],
  "picture": {
    "small": "http://vignette1.wikia.nocookie.net/memoryalpha/images/4/4f/Riker_orders_Worf_to_fire_on_the_Borg_cube.jpg/revision/latest?cb=20130213024734&path-prefix=en"
  }
}

Path Params

id
int32
required

ID of the contact.

 
Suggest Edits

/people/:id

Update a contact

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/people/:id
curl --request PUT \
  --url https://api.followupboss.com/v1/people/:id
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/people/:id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/people/:id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/people/:id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/people/:id"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

firstName
string

The first/given name of the contact.

lastName
string

The last/family name of the contact.

stage
string

The stage the contact is in. Example Lead or Trash. See stage API endpoint for more options.

contacted
boolean

Whether the person has been contacted.

price
int32

The price of the property of the contact's first inquiry, or the estimated sell/buy price for this contact.

assignedTo
string

Full name of the agent assigned to this contact.

assignedUserId
int32

ID of the agent assigned to this contact.

assignedLenderName
string

Full name of the lender assigned to this contact.

assignedLenderId
int32

ID of the lender assigned to this contact.

emails
array

A list of email addresses associated with the contact.

phones
array

A list of phone numbers associated with the contact.

addresses
array

A list of addresses associated with the contact (this is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).

tags
array of strings

A list of tags applied to the contact.

background
string

Background information, can be a multi-line string.

 

Custom Fields

If the account has custom fields defined you can also set these when updating a person. You can use the customFields endpoint to see which custom fields are available in the current account.

To delete a custom field value on a person, set its value to null:

{
  "customBirthday": null
}
Suggest Edits

/people/:id

Delete a contact

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/people/id
curl --request DELETE \
  --url https://api.followupboss.com/v1/people/id
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/people/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/people/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/people/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/people/id"

response = requests.request("DELETE", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Path Params

id
int32
required

ID of contact to delete.

 
Suggest Edits

/notes

Search for notes

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/notes
curl --request GET \
  --url https://api.followupboss.com/v1/notes
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/notes' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/notes")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/notes");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/notes"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "notes",
    "offset": 0,
    "limit": 10,
    "total": 359
  },
  "notes": [
    {
      "id": 1819,
      "created": "2014-06-19T18:32:26Z",
      "updated": "2014-06-19T18:32:26Z",
      "createdBy": "Agent White",
      "updatedBy": "Agent White",
      "personId": 12235,
      "subject": "",
      "body": "Plans to sell within the next three months.",
      "type": "",
      "isHtml": 0
    },
    ...
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

personId
int32

The id of the person to return notes for

 
Suggest Edits

/notes

Add a note

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/notes
{
  "personId": 12235,
  "subject": "Some note subject",
  "body": "This is the content of the note",
  "isHtml": 0
}
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

personId
int32

The ID of a person associated with this note.

subject
string

You can give a note a title or subject using this field.

body
string

The content of the note.

isHtml
string

Weather the note is plain-text or HTML.

 
Suggest Edits

/notes/:id

Retrieve a note by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/notes/id
curl --request GET \
  --url https://api.followupboss.com/v1/notes/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/notes/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/notes/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/notes/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/notes/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 1819,
  "created": "2014-06-19T18:32:26Z",
  "updated": "2014-06-19T18:32:26Z",
  "createdBy": "Agent White",
  "updatedBy": "Agent White",
  "personId": 12235,
  "subject": "Some note subject",
  "body": "Plans to sell within the next three months.",
  "type": "",
  "isHtml": 0
}

Path Params

id
int32
required

The ID of the note.

 
Suggest Edits

/notes/:id

Edit a note

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/notes/id
{
  "personId": 12235,
  "subject": "Some note subject",
  "body": "Plans to sell within the next three months.",
  "isHtml": 0
}
A binary file was returned

You couldn't be authenticated

{
  "id": 1819,
  "created": "2014-06-19T18:32:26Z",
  "updated": "2014-06-19T18:32:26Z",
  "createdBy": "Agent White",
  "updatedBy": "Agent White",
  "personId": 12235,
  "subject": "Some note subject",
  "body": "Plans to sell within the next three months.",
  "type": "",
  "isHtml": 0
}

Path Params

id
int32
required

The ID of the note to update.

Form Data

personId
int32

The ID of a person associated with this note.

subject
string

You can give a note a title or subject using this field.

body
string

The content of the note.

isHtml
string

Weather the note is plain-text or HTML.

 
Suggest Edits

/notes/:id

Delete a note

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/notes/id
curl --request DELETE \
  --url https://api.followupboss.com/v1/notes/id
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/notes/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/notes/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/notes/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/notes/id"

response = requests.request("DELETE", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Path Params

id
int32
required

The ID of the note to delete.

 
Suggest Edits

/calls

Search for calls

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/calls
curl --request GET \
  --url https://api.followupboss.com/v1/calls
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/calls' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/calls")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/calls");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/calls"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "calls",
    "offset": 0,
    "limit": 10,
    "total": 5
  },
  "calls": [
    {
      "id": 18,
      "created": "2014-06-20T23:28:51Z",
      "updated": "2014-08-12T17:24:22Z",
      "createdById": 4,
      "updatedById": 4,
      "phone": "555-405-0815",
      "personId": 12254,
      "userId": 4,
      "userName": "Agent White",
      "note": "A note about the call",
      "outcome": "Left Message",
      "isIncoming": false,
      "duration": 63
    },
    ...
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

personId
int32

Finds calls related to a person ID.

 
Suggest Edits

/calls

Add a call

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/calls
{
    "phone": "555-405-0815",
    "personId": 12254,
    "note": "John didn't have time to talk, call back on friday",
    "outcome": "Interested",
    "isIncoming": 0,
    "duration": 63
}
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

note
string

The log message entered for this call.

personId
int32

The ID of a person associated with this note.

phone
string

The phone number this call was made to or from

outcome
string

The outcome of the call, which can be one of Interested, Not Interested, Left Message, No Answer or Bad Number.

isIncoming
boolean

Whether this was an incoming or outgoing call.

duration
int32

Length of the call in seconds.

 
Suggest Edits

/calls/:id

Retrieve a call by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/calls/id
curl --request GET \
  --url https://api.followupboss.com/v1/calls/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/calls/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/calls/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/calls/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/calls/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 18,
  "created": "2014-06-20T23:28:51Z",
  "updated": "2014-08-12T17:24:22Z",
  "createdById": 4,
  "updatedById": 4,
  "phone": "555-405-0815",
  "personId": 12254,
  "userId": 4,
  "userName": "Agent White",
  "note": "A note about the call",
  "outcome": "Left Message",
  "isIncoming": false,
  "duration": 63
}

Path Params

id
int32
required

The ID of the call.

 
Suggest Edits

/users

List all users or search for a user

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/users
curl --request GET \
  --url https://api.followupboss.com/v1/users
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/users' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/users")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/users");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/users"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "users",
    "offset": 0,
    "limit": 10,
    "total": 5
  },
  "users": [
    {
      "id": 7,
      "created": "2013-08-08T00:53:52Z",
      "updated": "2014-06-04T14:57:37Z",
      "name": "Kuno Woudt",
      "firstName": "Kuno",
      "lastName": "Woudt",
      "email": "kuno@followupboss.com",
      "phone": "5555551234",
      "role": "Agent",
      "status": "Active",
      "timezone": "America/New_York",
      "beta": true,
      "isOwner": false,
      "leadEmailAddress": "kuno.woudt@followupboss.me",
      "groups": [
        {
          "id": 1,
          "name": "Buyer Leads"
        },
        {
          "id": 2,
          "name": "Seller Leads"
        }
      ]
    },
    {
      "id": 5,
      "created": "2013-05-05T22:55:19Z",
      "updated": "2014-03-06T08:52:25Z",
      "name": "Daniel Corkill",
      "firstName": "Daniel",
      "lastName": "Corkill",
      "email": "dan@example.com",
      "phone": "",
      "role": "Broker",
      "status": "Active",
      "timezone": "Asia/Beirut",
      "beta": false,
      "isOwner": false,
      "leadEmailAddress": "dan.corkill@followupboss.me",
      "groups": [
        {
          "id": 1,
          "name": "Buyer Leads"
        },
        {
          "id": 2,
          "name": "Seller Leads"
        }
      ]
    }
    ...
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

sort
string

Field so sort by. Currently only id, name and created are available to sort on.

role
string

Find users by a specific role: Broker, Agent or Lender.

name
string

Find a user by their full name.

email
string

Fine a user by their email.

 
Suggest Edits

/users/:id

Retrieve a user by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/users/id
curl --request GET \
  --url https://api.followupboss.com/v1/users/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/users/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/users/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/users/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/users/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 5,
  "created": "2013-05-05T22:55:19Z",
  "updated": "2014-03-06T08:52:25Z",
  "name": "Daniel Corkill",
  "firstName": "Daniel",
  "lastName": "Corkill",
  "email": "dan@example.com",
  "phone": "",
  "role": "Broker",
  "status": "Active",
  "timezone": "Asia/Beirut",
  "beta": false,
  "isOwner": false,
  "leadEmailAddress": "dan.corkill@followupboss.me",
  "groups": [
    {
      "id": 1,
      "name": "Buyer Leads"
    },
    {
      "id": 2,
      "name": "Seller Leads"
    }
  ]
}

Path Params

id
int32
required

The ID of a user.

 
Suggest Edits

/me

Retrieve information about the currently authenticated user

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/me
curl --request GET \
  --url https://api.followupboss.com/v1/me
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/me' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/me")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/me");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/me"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 1,
  "name": "Gerald Leenerts",
  "role": "admin",
  "email": "gerald@followupboss.com",
  "phone": "(123) 456-7890",
  "timeZone": "America/Chicago",
  "signature": "<div>Cheers,<br></div><div>-Gerald</div>",
  "rawSignature": "<div>Cheers,<br></div><div>-Gerald</div>",
  "apiKey": "...",
  "algoliaKey": "...",
  "intercomSettings": {
    "app_id": "...",
    "created_at": "1313236940",
    "user_hash": "...",
    "user_id": "1234-1"
  }
  "account": 1234,
  "teamMember": null,
  "beta": true,
  "betaOnly": false,
  "connectedEmail": {
    "email": "gerald@followupboss.com",
    "oauthProvider": "google",
    "shareEmails": false,
    "imapLeadProcessing": true,
    "hasSmtp": true
  },
  "leadEmailAddress": "gerald@followupboss.me",
  "callingEnabled": true,
  "voicemailEnabled": false,
  "voicemailUrl": null,
  "callingCapabilityToken": "",
  "isOwner": true,
  "unreadConversationCount": 0,
  "notifyBy": "Email only",
  "features": [
    "action-plans-smtp",
    "call-recording",
    "calling",
    "link-tracking"
  ]
}
 
Suggest Edits

/smartLists

List all smart lists

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/smartLists
curl --request GET \
  --url https://api.followupboss.com/v1/smartLists
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/smartLists' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/smartLists")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/smartLists");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/smartLists"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "smartlists",
    "offset": 0,
    "limit": 100,
    "total": 12
  },
  "smartlists": [
    { "id": 14, "name": "Stay In Touch" },
    { "id": 13, "name": "Email Activity" },
    { "id": 12, "name": "IDX Activity" },
    { "id": 9,  "name": "Sphere" },
    { "id": 8,  "name": "Past Clients" },
    { "id": 7,  "name": "Closed" },
    { "id": 6,  "name": "Pending" },
    { "id": 5,  "name": "Sellers" },
    { "id": 4,  "name": "Buyers" },
    { "id": 3,  "name": "Nurture" },
    { "id": 2,  "name": "Hot Prospects" },
    { "id": 1,  "name": "Leads" }
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

 
Suggest Edits

/smartLists/:id

Retrieve a smart list by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/smartLists/id
curl --request GET \
  --url https://api.followupboss.com/v1/smartLists/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/smartLists/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/smartLists/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/smartLists/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/smartLists/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 6,
  "name": "Pending"
}

Path Params

id
int32
required

The ID of the smart list.

 
Suggest Edits

/actionPlans

List or search Action Plans

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/actionPlans
curl --request GET \
  --url https://api.followupboss.com/v1/actionPlans
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/actionPlans' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/actionPlans")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/actionPlans");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/actionPlans"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "actionPlans",
    "offset": 0,
    "limit": 10,
    "total": 6
  },
  "actionPlans": [
    {
      "id": 6,
      "created": "2014-08-24T22:12:53Z",
      "updated": "2014-08-24T22:12:53Z",
      "name": "Qualify buyer leads",
      "status": "Active"
    },
    ...
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

sort
string

Sort action plans by id or name.

status
array of strings

Search for action plans with one of the following status: Active or Deleted.

 
Suggest Edits

/actionPlansPeople

List action plans applied to a particular person, or list people on a particular action plan

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/actionPlansPeople
curl --request GET \
  --url https://api.followupboss.com/v1/actionPlansPeople
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/actionPlansPeople' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/actionPlansPeople")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/actionPlansPeople");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/actionPlansPeople"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "actionPlansPeople",
    "offset": 0,
    "limit": 10,
    "total": 2
  },
  "actionPlansPeople": [
    {
      "id": 2,
      "created": "2014-08-19T18:31:43Z",
      "updated": "2014-08-19T18:31:43Z",
      "personId": 10810,
      "actionPlanId": 2,
      "status": "Running"
    },
    ...
  ]
}
  

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

personId
int32

List action plans applied to the specified person

actionPlanId
int32

List people on the specified action plan

 
Suggest Edits

/actionPlansPeople

Apply an action plan to a person

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/actionPlansPeople
curl --request POST \
  --url https://api.followupboss.com/v1/actionPlansPeople
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.followupboss.com/v1/actionPlansPeople' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/actionPlansPeople")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/actionPlansPeople");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/actionPlansPeople"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Form Data

personId
int32

The ID of the person to whom you would like to apply the action plan.

actionPlanId
int32

The ID of the action plan to apply

 
Suggest Edits

/actionPlansPeople/:id

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/actionPlansPeople/id
curl --request PUT \
  --url https://api.followupboss.com/v1/actionPlansPeople/id
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/actionPlansPeople/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/actionPlansPeople/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/actionPlansPeople/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/actionPlansPeople/id"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Path Params

id
int32
required

The ID of the action plan people.

Form Data

status
string

The desired state of the applied action plan. Either Running or Paused.

 
Suggest Edits

/templates

List all email templates

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/templates
curl --request GET \
  --url https://api.followupboss.com/v1/templates
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/templates' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/templates")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/templates");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/templates"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "templates",
    "offset": 0,
    "limit": 10,
    "total": 5
  },
  "templates": [
    {
      "id": 6,
      "created": "2014-02-28T08:45:46Z",
      "updated": "2014-08-12T17:24:22Z",
      "createdById": 14,
      "updatedById": 14,
      "name": "I am here to help",
      "isMobile": 1,
      "isShared": true,
      "body": "Hi %contact_first_name%, I am here to help, ...",
      "subject": "%inquiry_address%",
      "isEditable": true,
      "isDeletable": true,
      "actionPlans": [
        {
            "id": 1,
            "name": "Buyers engagement emails"
        }
      ]
    }
    ...
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

 

Templates use Merge Fields

Within templates, we need a way to modify the template with contact data. We call these Merge Fields. For more information, see Merge Fields.

Suggest Edits

/templates/:id

Retrieve a template by id, optionally merging fields

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/templates/id
curl --request GET \
  --url https://api.followupboss.com/v1/templates/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/templates/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/templates/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/templates/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/templates/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 6,
  "created": "2014-02-28T08:45:46Z",
  "updated": "2014-08-12T17:24:22Z",
  "createdById": 14,
  "updatedById": 14,
  "name": "I am here to help",
  "isMobile": 1,
  "isShared": true,
  "body": "Hi %contact_first_name%, I am here to help, ...",
  "subject": "Your property inquiry from Zillow",
  "isEditable": true,
  "isDeletable": true,
  "actionPlans": [
    {
        "id": 1,
        "name": "Buyers engagement emails"
    }
  ]
}

Path Params

id
int32
required

The ID of the template

Query Params

mergePersonId
int32

Person ID, when specified the returned template will have been merged with the specified person record and the current user record.

 

Templates use Merge Fields

Within templates, we need a way to modify the template with contact data. We call these Merge Fields. For more information, see Merge Fields.

Suggest Edits

/emEvents

List email marketing events

This endpoint returns information on marketing emails sent out and related statistics on opens, clicks, bounces, unsubscribes and spam reports. This includes information about email blasts and automated drip emails. Follow Up Boss has built-in email marketing functionality and also integrates with third-part email marketing tools, this API combines information about all those.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/emEvents
curl --request GET \
  --url https://api.followupboss.com/v1/emEvents
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/emEvents' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/emEvents")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/emEvents");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/emEvents"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "emEvents",
    "offset": 0,
    "limit": 10,
    "total": 102938
  },
  "emEvents": [
    {
      "count": 2,
      "type": "open",
      "personId": 10911,
      "campaignId": 102,
      "campaignName": "Can I help",
      "created": "2017-01-03T19:20:49Z",
      "updated": "2017-01-03T19:20:49Z"
    },
    ...
  ]
}

Query Params

type
array of strings

Find email marketing events based on type. Options include delivered, open, click, bounced, soft-bounce, hard-bounce, unsubscribe, spamreport and dropped.

personId
int32

Find email marketing events by person ID.

updatedAfter
date-time

Find email marketing events that have been created or updated after the specified time.

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

 
Suggest Edits

/emEvents

Notify Follow Up Boss about marketing emails sent, opens, clicks, bounces, unsubscribes and spam reports.

Use this endpoint to send information to Follow Up Boss about marketing emails sent out from your application and related events such as opens, clicks, bounces, unsubscribes and spam reports.

Before sending email marketing events you need to create an email campaign which represents a marketing email in your system. This could be a one-off email blast or automated drip email. Use POST /emCampaigns endpoint to create an email campaign and save id field from the response - this is Follow Up Boss ID of the email campaign, then use that ID in the campaignId field when sending email marketing events to Follow Up Boss.

The following event types are supported:

delivered - Email was sent out to a recipient.
open - Recipient opened the email.
click - Recipient clicked on a link in the email.
bounced - Email bounced, it means recipient's email server rejected the email. This is a generic bounce event, use it if your system doesn't distinguish between soft and hard bounces.
soft-bounce - Email bounced temporarily.
hard-bounce - Email bounced permanently.
unsubscribe - Recipient unsubscribed from further emails.
spamreport - Recipient reported email as spam.
dropped - Sending email wasn't attempted because of the previous history with recipient (bounced, unsubscribed, etc).

userId is an optional field that allows you to specify the ID of the user in Follow Up Boss that email was sent from. This is useful to display email correctly in Follow Up Boss including replacing merge fields with correct user name, email, etc. This field is optional and defaults to the current authenticated user (the user whose API key is being used to authenticate API request).

This endpoint allows sending multiple events in a batch request, this is especially useful for delivered event type when you are sending out an email to a large number of recipients. You can send up to 1000 events per API request. When sending an email to a large number of recipients, we recommend breaking down the list of recipients into batches of 1000 and send each batch in a separate POST request to /v1/emEvents endpoint.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/emEvents
{"emEvents": [
    {
        "type": "delivered",
        "occurred": "2017-04-09T16:10:59Z",
        "recipient": "john.smith@gmail.com",
        "campaignId": 102,
        "userId": 3
    },
    {
        "type": "delivered",
        "occurred": "2017-04-09T16:11:00Z",
        "recipient": "mary.anderson@gmail.com",
        "campaignId": 102,
        "userId": 3
    },
    ...
]}
A binary file was returned

You couldn't be authenticated

{
    "emEventIds": [
        193928,
        193929,
        ...
    ]
}
{
    "emEventIds": [
        193928,
        193929,
        ...
    ]
    "recipientsNotFound": [
        "email.not.in.fub@example.com",
        "another.missing.email@example.com"
    ]
}

Form Data

emEvents
array of objects

Array of email marketing events in the following format: [{"type": "delivered", "occurred": "2017-04-09T16:10:59Z", "recipient": "john.smith@gmail.com", "campaignId": 141, "userId": 3}, ...]

type
occurred
recipient
campaignId
userId
url
 
Suggest Edits

/emCampaigns

List email marketing campaigns

Campaigns are marketing emails that are sent out to people in Follow Up Boss. These could be one-off email blasts, or automated drip emails. Follow Up Boss has built-in email marketing functionality and also integrates with third-part email marketing tools, this API combines information about all those. We use origin field to specify which email marketing tool was used for particular email campaign.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/emCampaigns
curl --request GET \
  --url https://api.followupboss.com/v1/emCampaigns
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "emCampaigns",
    "offset": 0,
    "limit": 10,
    "total": 97
  },
  "emCampaigns": [
    {
      "id": 102,
      "origin": "Curaytor",
      "originId": "912",
      "name": "Can I help",
      "subject": "Can I help?",
      "bodyHtml": "I saw you're browsing our website, can I help with..."
    },
    ...
  ]
}

Query Params

origin
string

Search for campaigns from specific origin

originId
string

Search for campaigns with specific ID from originating system

 
Suggest Edits

/emCampaigns

Create email marketing campaign

Use this endpoint to update Follow Up Boss about a new marketing email created in your system. This could be a one-off email blast or automated drip email. Set origin field with the name of your system and originId with your internal ID assigned to the new email.

You will get the id field in the response - this is Follow Up Boss ID of the email campaign, save it in your system, you will need it later to post email marketing events - email sends, opens, clicks, bounces and unsubscribes.

You can use merge fields in the subject and bodyHtml:

%contact_name% - full name of the recipient
%contact_first_name% - first name of the recipient
%contact_last_name% - last name of the recipient
%contact_email% - email address of the recipient
%contact_phone% - phone number of the recipient
%contact_address% - full address of the recipient
%contact_street% - street address of the recipient
%contact_city% - city of the recipient
%contact_state% - state of the recipient
%contact_zipcode% - zip code of the recipient
%contact_country% - country of the recipient
%agent_name% - full name of the sender (user in FUB)
%agent_first_name% - first name of the sender (user in FUB)
%agent_last_name% - last name of the sender (user in FUB)
%agent_email% - email address of the sender (user in FUB)
%agent_phone% - phone number of the sender (user in FUB)
%inquiry_address% - address of the last property the recipient inquired about
%source_name% - lead source name of the recipient

Those merge fields will be replaced with their actual values when email is displayed in Follow Up Boss. If your system uses different convention for naming merge fields, replace them to match the fields listed above.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/emCampaigns
{
    "origin": "Curaytor",
    "originId": "912",
    "name": "Can I help",
    "subject": "Can I help?",
    "bodyHtml": "I saw you're browsing our website, can I help with..."
}
A binary file was returned

You couldn't be authenticated

{
    "id": 102,
    "origin": "Curaytor",
    "originId": "912",
    "name": "Can I help",
    "subject": "Can I help?",
    "bodyHtml": "I saw you're browsing our website, can I help with..."
}

Form Data

origin
string

Name of the email marketing system where this campaign is originated from

originId
string

Internal ID of the new campaign or email in the origin system.

name
string

Name of the email campaign or template

subject
string

Email subject line

bodyHtml
string

Email body in HTML

 
Suggest Edits

/emCampaigns/:id

Update email marketing campaign

Use this endpoint to update Follow Up Boss when a user edits marketing email in your system, for example changes email subject or body. This is more relevant for automated drip emails but may be applicable to one-off email blasts too when user saves email as a draft and later edits it before sending out.

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/emCampaigns/id
{
    "name": "How can I help",
    "subject": "How can I help?",
    "bodyHtml": "I saw you're browsing our website, how can I help with..."
}
A binary file was returned

You couldn't be authenticated

{
    "id": 102,
    "origin": "Curaytor",
    "originId": "912",
    "name": "How can I help",
    "subject": "How can I help?",
    "bodyHtml": "I saw you're browsing our website, how can I help with..."
}

Path Params

id
int32
required

Follow Up Boss ID of the email campaign to update

Form Data

name
string

Name of the email campaign or template

subject
string

Email subject line

bodyHtml
string

Email body in HTML

 
Suggest Edits

/customFields

List all custom fields available in your account.

Custom fields can be used when adding an event, adding a person or updating a person. The account owner can add/edit/delete custom fields in Follow Up Boss, see using custom fields for more info.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/customFields
curl --request GET \
  --url https://api.followupboss.com/v1/customFields
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/customFields' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/customFields")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/customFields");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/customFields"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "customfields",
    "offset": 0,
    "limit": 10,
    "total": "4"
  },
  "customfields": [
    {
      "id": 2,
      "label": "Birthday",
      "name": "customBirthday",
      "type": "date",
      "isRecurring": true
    },
    {
      "id": 4,
      "label": "Facebook",
      "name": "customFacebook",
      "type": "text"
    },
    {
      "id": 6,
      "label": "Looking for",
      "name": "customLookingFor",
      "type": "dropdown",
      "choices": [
          "Apartment",
          "Townhouse",
          "Detached House"
      ]
    },
    {
      "id": 7,
      "label": "Close price",
      "name": "customClosePrice",
      "type": "number"
    }
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

label
string

Find custom field by label.

 
Suggest Edits

/customFields/:id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/customFields/id
curl --request GET \
  --url https://api.followupboss.com/v1/customFields/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/customFields/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/customFields/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/customFields/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/customFields/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
    "id": 6,
    "label": "Looking for",
    "name": "customLookingFor",
    "type": "dropdown",
    "choices": [
        "Apartment",
        "Townhouse",
        "Detached House"
    ]
}

Path Params

id
int32
required

The ID of a custom field.

 
 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/stages
curl --request GET \
  --url https://api.followupboss.com/v1/stages
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/stages' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/stages")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/stages");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/stages"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "stages",
    "offset": 0,
    "limit": 20,
    "total": 8
  },
  "stages": [
    {
      "id": 1,
      "name": "Contact",
      "orderWeight": 1000,
      "isProtected": false,
      "peopleCount": 16
    },
    {
      "id": 5,
      "name": "Buyer",
      "orderWeight": 2000,
      "isProtected": false,
      "peopleCount": 40
    },
    {
      "id": 2,
      "name": "Lead",
      "orderWeight": 3000,
      "isProtected": true,
      "peopleCount": 12077
    },
    {
      "id": 4,
      "name": "Nurture",
      "orderWeight": 4000,
      "isProtected": false,
      "peopleCount": 66
    },
    {
      "id": 8,
      "name": "Closed",
      "orderWeight": 5000,
      "isProtected": true,
      "peopleCount": 15
    },
    {
      "id": 9,
      "name": "Past Client",
      "orderWeight": 6000,
      "isProtected": false,
      "peopleCount": 98
    },
    {
      "id": 10,
      "name": "Sphere",
      "orderWeight": 7000,
      "isProtected": false,
      "peopleCount": 17
    },
    {
      "id": 11,
      "name": "Trash",
      "orderWeight": 8000,
      "isProtected": true,
      "peopleCount": 892
    }
  ]
}

Query Params

limit
int32

Number of results to return. Max 100.

offset
int32

Specifies the number of rows to skip, before starting to return results.

sort
string

Sorts the stages by orderWeight, id or name.

 
 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/stages
curl --request POST \
  --url https://api.followupboss.com/v1/stages
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.followupboss.com/v1/stages' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/stages")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/stages");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/stages"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 7,
  "name": "Pending",
  "orderWeight": 7000,
  "isProtected": false,
  "peopleCount": 10
}

Form Data

name
string
required

Name of the stage

orderWeight
int32

Helps to set a specific sort order.

 

Note about creating a new stage

When create a stage, the orderWeight for all stages will be recalculated.

Suggest Edits

/stages/:id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/stages/id
curl --request GET \
  --url https://api.followupboss.com/v1/stages/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/stages/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/stages/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/stages/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/stages/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 7,
  "name": "Pending",
  "orderWeight": 7000,
  "isProtected": false,
  "peopleCount": 10
}

Path Params

id
int32
required

The id of the stage to retrieve.

 
Suggest Edits

/stages/:id

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/stages/id
curl --request PUT \
  --url https://api.followupboss.com/v1/stages/id
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/stages/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/stages/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/stages/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/stages/id"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 7,
  "name": "Pending",
  "orderWeight": 7000,
  "isProtected": false,
  "peopleCount": 10
}

Path Params

id
int32
required

The id of the stage to update.

Form Data

name
string

Name of the stage

orderWeight
int32

Helps to set a specific sort order.

 

Note on updating

If the order weight changes, it will cause all other stages to recalculate the order.
If the isProtected is true, you can not update the name.

Suggest Edits

/stages/:id

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/stages/id
curl --request DELETE \
  --url https://api.followupboss.com/v1/stages/id
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/stages/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/stages/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/stages/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/stages/id"

response = requests.request("DELETE", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Path Params

id
int32
required

The id of the stage to delete.

 

Is Protected

If a stage isProtected is true you can not delete the stage.

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/tasks
curl --request GET \
  --url https://api.followupboss.com/v1/tasks
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/tasks' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/tasks");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/tasks"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "tasks",
    "offset": 0,
    "limit": 1,
    "total": 126
  },
  "tasks": [
    {
      "id": 4066,
      "created": "2016-12-07T15:50:47Z",
      "updated": "2016-12-07T15:50:47Z",
      "createdBy": "Gerald Leenerts",
      "updatedBy": "Gerald Leenerts",
      "personId": 15013,
      "AssignedTo": "Gerald Leenerts",
      "assignedUserId": 1,
      "name": "Follow Up",
      "type": "Follow Up",
      "isCompleted": 0,
      "dueDate": null,
      "dueDateTime": null,
      "person": {
        "id": 15013,
        "name": "William Riker"
      }
    }
  ]
}

Query Params

personId
int32

Find tasks by a personId

assignedTo
string

Find tasks assigned to a specific users (full name).

assignedUserId
int32

Find tasks assigned to a specific user.

name
string

Will find tasks where the name is like what you pass in. Like ?name=world would find a task named "hello world".

type
string

Find tasks by the following types: Follow Up, Call, Email, Appointment, Showing, Closing, Open House or Thank You.

isCompleted
boolean

Find tasks that have been completed or not completed.

due
string

Can be today, overdue and upcoming. Will find the tasks that fall into those ranges.

dueStart
date-time

Finds tasks that are due from this time on.

dueEnd
date-time

Find tasks that are due from this time and before.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/tasks
curl --request POST \
  --url https://api.followupboss.com/v1/tasks
var request = require("request");

var options = { method: 'POST', url: 'https://api.followupboss.com/v1/tasks' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/tasks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/tasks");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/tasks"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 4066,
  "created": "2016-12-07T15:50:47Z",
  "updated": "2016-12-07T15:50:47Z",
  "createdBy": "Gerald Leenerts",
  "updatedBy": "Gerald Leenerts",
  "personId": 15013,
  "AssignedTo": "Gerald Leenerts",
  "assignedUserId": 1,
  "name": "Follow Up",
  "type": "Follow Up",
  "isCompleted": 0,
  "dueDate": null,
  "dueDateTime": null,
  "person": {
    "id": 15013,
    "name": "William Riker"
  }
}

Form Data

personId
int32

The ID of the person this task is related to.

AssignedTo
string

The full name of the agent to assign this task to.

assignedUserId
int32

The ID of the user to assign this task to.

name
string

The name of the task.

type
string

Type can be one of the following: Follow Up, Call, Email, Appointment, Showing, Closing, Open House or Thank You

isCompleted
boolean

If the task is completed or not.

 
Suggest Edits

/tasks/:id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/tasks/id
curl --request GET \
  --url https://api.followupboss.com/v1/tasks/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/tasks/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/tasks/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/tasks/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/tasks/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 4066,
  "created": "2016-12-07T15:50:47Z",
  "updated": "2016-12-07T15:50:47Z",
  "createdBy": "Gerald Leenerts",
  "updatedBy": "Gerald Leenerts",
  "personId": 15013,
  "AssignedTo": "Gerald Leenerts",
  "assignedUserId": 1,
  "name": "Follow Up",
  "type": "Follow Up",
  "isCompleted": 0,
  "dueDate": null,
  "dueDateTime": null,
  "person": {
    "id": 15013,
    "name": "William Riker"
  }
}

Path Params

id
int32
required

The ID of the task to get.

 
Suggest Edits

/tasks/:id

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/tasks/id
curl --request PUT \
  --url https://api.followupboss.com/v1/tasks/id
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/tasks/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/tasks/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/tasks/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/tasks/id"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 4066,
  "created": "2016-12-07T15:50:47Z",
  "updated": "2016-12-07T15:50:47Z",
  "createdBy": "Gerald Leenerts",
  "updatedBy": "Gerald Leenerts",
  "personId": 15013,
  "AssignedTo": "Gerald Leenerts",
  "assignedUserId": 1,
  "name": "Follow Up",
  "type": "Follow Up",
  "isCompleted": 0,
  "dueDate": null,
  "dueDateTime": null,
  "person": {
    "id": 15013,
    "name": "William Riker"
  }
}

Path Params

id
int32
required

The ID of the task to update

Form Data

personId
int32

The ID of the person this task is related to.

AssignedTo
string

The full name of the agent to assign this task to.

assignedUserId
int32

The ID of the user to assign this task to.

name
string

The name of the task.

type
string

Type can be one of the following: Follow Up, Call, Email, Appointment, Showing, Closing, Open House or Thank You

isCompleted
boolean

If the task is completed or not.

 
Suggest Edits

/webhooks

Get a list of webhoks

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/webhooks
curl --request GET \
  --url https://api.followupboss.com/v1/webhooks \
  --header 'x-system: X-System'
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/webhooks',
  headers: { 'x-system': 'X-System' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/webhooks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-system"] = 'X-System'

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/webhooks");
xhr.setRequestHeader("x-system", "X-System");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/webhooks"

headers = {'x-system': 'X-System'}

response = requests.request("GET", url, headers=headers)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "webhooks",
    "offset": 0,
    "limit": 10,
    "total": 3
  },
  "webhooks": [
    {
      "id": 1001,
      "event": "peopleCreated",
      "status": "Active",
      "url": "https://acmeLeadProvider.com/callbacks/peopleCreated"
    },
    {
      "id": 1002,
      "event": "peopleUpdated",
      "status": "Active",
      "url": "https://acmeLeadProvider.com/callbacks/peopleUpdated"
    },
    {
      "id": 1003,
      "event": "peopleDeleted",
      "status": "Active",
      "url": "https://acmeLeadProvider.com/callbacks/peopleDeleted"
    },
  ]
}

Query Params

sort
string

The sort order, can be one of the following: id, created, updated, status or event

offset
int32

Specifies the number of rows to skip, before starting to return results.

limit
int32

Number of results to return. Max 100.

event
string

Search for webhooks by event. Example peopleCreated or peopleUpdated

status
string

Search for webhooks by status. Status can be Active or Disabled.

Headers

X-System
string
required

The name of the integration partner.

 

More about Webhooks

We have more details about webhooks in this article

Suggest Edits

/webhooks

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/webhooks
{
	"event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/followupboss/peopleCreated"
}
A binary file was returned

You couldn't be authenticated

{
  "id": 1004,
  "status": "Active",
	"event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/followupboss/peopleCreated"
}

Form Data

event
string
required

The event the webook responds to. Should be one of the following: peopleCreated, peopleUpdated, peopleDeleted, notesCreated, notesUpdated, notesDeleted, emEventsOpened, emEventsClicked, emEventsUnsubscribed, tasksCreated, tasksUpdated, tasksDeleted, textMessagesCreated, textMessagesUpdated, textMessagesDeleted, callsCreated, callsUpdated, callsDeleted, emailsCreated, emailsUpdated, emailsDeleted or eventsCreated

url
string
required

The url of the webhook.

Headers

X-System
string
required
 
Suggest Edits

/webhooks/:id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/webhooks/id
curl --request GET \
  --url https://api.followupboss.com/v1/webhooks/id \
  --header 'x-system: X-System'
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/webhooks/id',
  headers: { 'x-system': 'X-System' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/webhooks/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-system"] = 'X-System'

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/webhooks/id");
xhr.setRequestHeader("x-system", "X-System");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/webhooks/id"

headers = {'x-system': 'X-System'}

response = requests.request("GET", url, headers=headers)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
	"id": 1004,
  "status": "Active",
  "event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/followupboss/peopleCreated"
}

Path Params

id
int32
required

The ID of the webhook.

Headers

X-System
string
required
 
Suggest Edits

/webhooks/:id

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/webhooks/:id
{
	"event": "peopleCreated",
  "status": "Disabled",
  "url": "https://acmeLeadProvider.com/callbacks/followupboss/peopleCreated"
}
A binary file was returned

You couldn't be authenticated

{
  "id": 1004,
  "status": "Disabled",
	"event": "peopleCreated",
  "url": "https://acmeLeadProvider.com/callbacks/followupboss/peopleCreated"
}

Form Data

event
string

The event the webook responds to. Should be one of the following: peopleCreated, peopleUpdated, peopleDeleted, notesCreated, notesUpdated, notesDeleted, emEventsOpened, emEventsClicked, emEventsUnsubscribed, tasksCreated, tasksUpdated, tasksDeleted, textMessagesCreated, textMessagesUpdated, textMessagesDeleted, callsCreated, callsUpdated, callsDeleted, emailsCreated, emailsUpdated, emailsDeleted or eventsCreated

url
string

The url of the webhook.

status
string

The status of the webhook. Can be Active or Disabled

Headers

X-System
string
required
 
Suggest Edits

/webhooks/:id

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/webhooks/id
curl --request DELETE \
  --url https://api.followupboss.com/v1/webhooks/id \
  --header 'x-system: X-System'
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/webhooks/id',
  headers: { 'x-system': 'X-System' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/webhooks/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)
request["x-system"] = 'X-System'

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/webhooks/id");
xhr.setRequestHeader("x-system", "X-System");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/webhooks/id"

headers = {'x-system': 'X-System'}

response = requests.request("DELETE", url, headers=headers)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results

Path Params

id
int32
required

The ID of the webhook.

Headers

X-System
string
required
 
Suggest Edits

/webhookEvents/:id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/webhookEvents/:id
curl --request GET \
  --url https://api.followupboss.com/v1/webhookEvents/:id \
  --header 'x-system: X-System'
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/webhookEvents/:id',
  headers: { 'x-system': 'X-System' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/webhookEvents/:id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-system"] = 'X-System'

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/webhookEvents/:id");
xhr.setRequestHeader("x-system", "X-System");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/webhookEvents/:id"

headers = {'x-system': 'X-System'}

response = requests.request("GET", url, headers=headers)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": "db36048a6b06d80e7f9d3440233ae915",
  "eventCreated": "2016-12-12T18:36:26Z",
  "event": "peopleUpdated",
  "resourceIds": [1234,3422,4343],
  "uri": "https://api.followupboss.com/v1/people?id=1234,3422,4343"
}

Headers

X-System
string
required
 
Suggest Edits

/pipelines

Search for pipelines

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/pipelines
curl --request GET \
  --url https://api.followupboss.com/v1/pipelines
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/pipelines' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/pipelines")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/pipelines");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/pipelines"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "pipelines",
    "offset": 0,
    "limit": 10,
    "total": 1
  },
  "pipelines": [
    {
      "id": 1,
      "name": "My Pipeline",
      "description": "A very cool pipeline",
      "orderWeight": 1000,
      "stages": [
        {
          "id": 10,
          "name": "Prospect",
          "description": "Prospective deals",
          "orderWeight": 1000
        },
        {
          "id": 11,
          "name": "In Progress",
          "description": "Deals in progress",
          "orderWeight": 2000
        }
      ]
    }
  ]
}
 
Suggest Edits

/pipelines

Add a pipeline

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/pipelines
curl --request POST \
  --url https://api.followupboss.com/v1/pipelines
var request = require("request");

var options = { method: 'POST',
  url: 'https://api.followupboss.com/v1/pipelines' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/pipelines")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/pipelines");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/pipelines"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
	"name": "Buyer pipeline",
	"description": "A pipeline for buyers",
  "orderWeight": 1000,
  "stages": [
        {
          "name": "First Stage",
          "description": "",
          "orderWeight": 1000,
          "color": "#FFFFFF"
        },
        {
          "name": "Second Stage",
          "description": "",
          "orderWeight": 2000
        }
    ]
}

Form Data

name
string
required

Name of the pipeline

description
string

Description of the pipeline

stages
array of mixed types

An array of stage objects that should be associated with the pipeline

orderWeight
int32

Helps to set a specific sort order.

 

Require owner permissions

Only the owner has access to create and modify pipelines.

Suggest Edits

/pipelines/:id

Retrieve a pipeline by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/pipelines/id
curl --request GET \
  --url https://api.followupboss.com/v1/pipelines/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/pipelines/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/pipelines/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/pipelines/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/pipelines/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "id": 1,
  "name": "Contact Pipeline",
  "description": "A pipeline for contacts",
  "orderWeight": 1000,
  "stages": [
    {
      "id": 1,
      "name": "Contact",
      "description": "",
      "orderWeight": 3000,
      "color": "#FFFFFF"
    },
    {
      "id": 2,
      "name": "Lead",
      "description": "",
      "orderWeight": 4000,
      "color": ""
    }
  ]
}
 
Suggest Edits

/pipelines/:id

Update a pipeline

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/pipelines
curl --request PUT \
  --url https://api.followupboss.com/v1/pipelines
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/pipelines' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/pipelines")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/pipelines");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/pipelines"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "name": "Buyer pipeline",
  "description": "A pipeline for buyers",
  "orderWeight": 1000,
  "stages": [
    {
      "id": 17,
      "name": "First Stage",
      "description": "",
      "orderWeight": 1000,
      "color": "#FFFFFF"
    },
    {
      "id": 18,
      "name": "Second Stage",
      "description": "",
      "orderWeight": 2000,
      "color": "#000000"
    },
    {
      "name": "Third Stage",
      "description": "",
      "orderWeight": 3000,
      "color": "#FF00FF"
    }
  ]
}

Form Data

name
string

Name of the pipeline

description
string

Description of the pipeline

stages
array of mixed types

An array of stage objects that should be associated with the pipeline

orderWeight
int32

Helps to set a specific sort order

 

If you wish to modify the stages of a pipeline, you may do so by passing the id of the stage with your stage objects, as shown in the example above. Any stage objects that are missing ids will be created as new stages.

Require owner permissions

Only the owner has access to create and modify pipelines.

Suggest Edits

/pipelines/:id

Delete a pipeline

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/pipelines/:id
curl --request DELETE \
  --url https://api.followupboss.com/v1/pipelines/:id
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/pipelines/:id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/pipelines/:id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/pipelines/:id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/pipelines/:id"

response = requests.request("DELETE", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results
 
Suggest Edits

/deals

Search for deals

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/deals
curl --request GET \
  --url https://api.followupboss.com/v1/deals
var request = require("request");

var options = { method: 'GET', url: 'https://api.followupboss.com/v1/deals' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/deals")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/deals");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/deals"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
  "_metadata": {
    "collection": "deals",
    "offset": 0,
    "limit": 10,
    "total": 1,
    "totalByStageId": {
      "5": 1
    }
  },
  "deals": [
    {
      "pipelineId": 100,
      "stageId": 5,
      "enteredStageAt": "2017-04-14T18:31:20Z",
      "id": 2146,
      "name": "adding deal",
      "type": 0,
      "status": "Active",
      "price": 216000,
      "createdAt": "2017-04-14T18:31:19Z",
      "orderWeight": 6000,
      "description": "A deal for an example",
      "projectedCloseDate": null,
      "people": [
        {
          "name": "Yolanda Smith",
          "phones": [
            {
              "value": "15555555555",
              "type": "other",
              "status": "0",
              "is_primary": "1"
            }
          ],
          "emails": [
            {
              "value": "yolanda.smith@followupboss.com",
              "type": "home",
              "is_primary": "1"
            }
          ],
          "avatar": ""
        }
      ],
      "users": [
        {
          "id": 1,
          "name": "John Smith"
        }
    },
  ]
}

Query Params

pipelineId
int32

Return deals for a specific pipeline only

userId
int32

Return a list of deals for a specific user

personId
int32

Return a list of deals for a specific person

includeDeleted
int32

Include deals with Status = 'Deleted' in the results

 
Suggest Edits

/deals

Add a deal

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://api.followupboss.com/v1/deals
curl --request POST \
  --url https://api.followupboss.com/v1/deals
var request = require("request");

var options = { method: 'POST', url: 'https://api.followupboss.com/v1/deals' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/deals")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://api.followupboss.com/v1/deals");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/deals"

response = requests.request("POST", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
	"name": "Deal",
	"description": "A seller deal",
	"stageId": 1,
  "projectedCloseDate": "2001-01-02",
  "price": 30,
  "peopleIds": [
    2,
    5,
    6
  ],
  "userIds": [
    208,
    210
  ]
}

Form Data

name
string
required

Name of the deal

stageId
int32
required

The stage that this deal should be assigned to

description
string

Description of the deal

peopleIds
array of integers

A list of person ids that should be part of this deal

userIds
array of integers

A list of user ids that should be part of this deal

price
int32

The price associated with this deal

projectedCloseDate
date

Projected close date of this deal

orderWeight
int32

Helps to set a specific sort order

 
Suggest Edits

/deals/:id

Retrieve a deal by id

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://api.followupboss.com/v1/deals/id
curl --request GET \
  --url https://api.followupboss.com/v1/deals/id
var request = require("request");

var options = { method: 'GET',
  url: 'https://api.followupboss.com/v1/deals/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/deals/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://api.followupboss.com/v1/deals/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/deals/id"

response = requests.request("GET", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
      "pipelineId": 100,
      "stageId": 16,
      "enteredStageAt": "2017-04-14T18:31:20Z",
      "id": 2146,
      "name": "adding deal",
      "type": 0,
      "status": "Active",
      "price": 216000,
      "createdAt": "2017-04-14T18:31:19Z",
      "orderWeight": 6000,
      "description": "A deal for an example",
      "projectedCloseDate": null,
      "people": [
        {
          "name": "Yolanda Smith",
          "phones": [
            {
              "value": "15555555555",
              "type": "other",
              "status": "0",
              "is_primary": "1"
            }
          ],
          "emails": [
            {
              "value": "yolanda.smith@followupboss.com",
              "type": "home",
              "is_primary": "1"
            }
          ],
          "avatar": ""
        }
      ],
      "users": [
    		{
     		 	"id": 1,
      		"name": "John Smith"
    		}
  		]
    }
 
Suggest Edits

/deals/:id

Update a deal

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://api.followupboss.com/v1/deals/id
curl --request PUT \
  --url https://api.followupboss.com/v1/deals/id
var request = require("request");

var options = { method: 'PUT',
  url: 'https://api.followupboss.com/v1/deals/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/deals/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("PUT", "https://api.followupboss.com/v1/deals/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/deals/id"

response = requests.request("PUT", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

{
	"name": "New Deal",
	"stageId": 2,
  "description": "The best deal",
  "projectedCloseDate": "2001-01-02",
  "price": 30,
  "peopleIds": [
    2,
    5,
    6
  ],
  "userIds": [
    208,
    210
  ]
}

Form Data

name
string

Name of the deal

stageId
int32

The stage that this deal should be assigned to

description
string

Description of the deal

peopleIds
array of integers

A list of person ids that should be part of this deal

userIds
array of integers

A list of user ids that should be part of this deal

price
int32

The price associated with this deal

projectedCloseDate
date

Projected close date of this deal

 
Suggest Edits

/deals/:id

Delete a deal

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://api.followupboss.com/v1/deals/id
curl --request DELETE \
  --url https://api.followupboss.com/v1/deals/id
var request = require("request");

var options = { method: 'DELETE',
  url: 'https://api.followupboss.com/v1/deals/id' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://api.followupboss.com/v1/deals/id")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("DELETE", "https://api.followupboss.com/v1/deals/id");

xhr.send(data);
import requests

url = "https://api.followupboss.com/v1/deals/id"

response = requests.request("DELETE", url)

print(response.text)
A binary file was returned

You couldn't be authenticated

Try the API to see results