Dotloop External API Developer Guide
Updated: 7/2/2016
Introduction
How to Use the API
A Note on Resource Paths
Exploring the API with curl
What’s a Profile?
Loop ID vs Loop View ID
OAuth Security
Use the API key to access dotloop resources
Getting an API key
List of REST Endpoints
Endpoint Reference
Profiles
Loop Summary
Loop Details
Loop Activities
Loop Documents
Loop Document
Loop Participants
Loop Tasks
Loop Folders
Employees
Document Activities
Contacts
Contact Details
Profile Admins
Introduction
The dotloop API provides access to the most important pieces of data from dotloop. This data can be used for business reporting and integration
with other systems. Our goal is to provide a secure and comprehensive platform for interacting with dotloop data.
The API allows you to access all loop information.
Since the API is an application programming interface, it’s necessary to have programming experience to use the API. This documentation
assumes you are a programmer familiar with consuming RESTful web services. All responses are JSON unless otherwise noted.
How to Use the API
Let’s consider a simple example of retrieving a list of loops within a brokerage. We would follow the following steps:
1. Use the dotloop account management screens to generate an API key
a. This API key will be sent in an HTTP header along with all API calls
2. Call the /profile endpoint to get a list of dotloop profiles
a. Parse the JSON response and choose the appropriate profile id for the brokerage
3. Call the /profile/{id}/loop endpoint to get a list of loops for this profile
a. Parse the JSON response and retrieve
To demonstrate we will pretend that we generated an API key for use and it is 1234-5678-90123. Using curl on a UNIX command line we could
perform the following steps:
curl --H "Authorization: Bearer 1234-5678-90123"
https://www.dotloop.com/my/api/v1_0/profile
We would receive a response similar to this (formatted for readability):
[
{
"profileId": 1234,
"companyName": "Demo Brokerage"
"phoneNumber": "5131234567",
"faxNumber": "",
"name": "Demo Brokerage",
"address1": "123 Main St.",
"address2": "",
"suite": "",
"city": "Cincinnati",
"state": "OH",
"zipcode": "45203",
"active": true,
"deleted": false,
"profileType": "BROKERAGE"
},
{
"profileId": 4234,
"name": "Personal Profile",
"active": true,
"deleted": false,
"profileType": "INDIVIDUAL"
}
]
In this case, we would be interested in pulling all loops from profile 1234, the Brokerage account. Loops can be retrieved with the following call:
curl --H "Authorization: Bearer 1234-5678-90123"
https://www.dotloop.com/my/api/v1_0/profile/1234/loop
The response would look something like this (formatted for readability):
[
{
"loopName": "342 Elm St.",
"loopId": 6104,
"loopStatus": "Private",
"loopTags": [],
"createdBy": 324245,
"lastUpdated": "20140723T08:44:1104:00",
"loopViewId": 35252
},
{
"loopName": "463 Walnut St.",
"loopId": 45253,
"loopStatus": "Private",
"loopTags": [
{
"tagId": 137,
"tagName": "Lease/Rental"
}
],
"createdBy": 235612,
"lastUpdated": "20140828T12:01:3704:00",
"loopViewId": 838342
}
]
From this response, a client can pull the names of all loops
A Note on Resource Paths
All API resources are prefixed with https://www.dotloop.com/my/api/v1_0/, but for clarity, we will often omit this prefix when discussing an
endpoint. For example, when we discuss the /profile endpoint we are really talking about the URI https://www.dotloop.com/my/api/v1_0/profile.
Exploring the API with curl
If you have access to a UNIX shell with curl (for example from OS X or Linux) you can experiment with the GET calls from the command line:
curl -H "Authorization: Bearer xxxxx"https://www.dotloop.com/my/api/v1_0/profile/4120/loop
What’s a Profile?
A dotloop account has one or more profiles. For example, a user might have admin access to a brokerage profile, an office profile, and a personal
profile. Each profile has its own set of loops and templates. Most calls to the dotloop API require you to specify a profile.
Loop ID vs Loop View ID
When specifying a loop within the dotloop API you will always a loop view id, not a loop id. In fact, just forget that the loop id exists. We know it’s
confusing, we’re sorry! There’s a technical reason why this is but it’s very boring. We’ll spare you the details.
OAuth Security
The dotloop API uses OAuth 2.0 for authentication. We use the two-legged flow intended for system-to-system authentication.
A dotloop user with access to the API feature can generate an API key within the dotloop account management screens. This API key is passed
in with each call to the dotloop API.
It is important to remember that the API key should be treated with the same level of security as your dotloop password. If your API key is ever
compromised, a new key can be issued through the dotloop account management.
Use the API key to access dotloop resources
To authenticate each API call simply add an HTTP header with your API key:
Authorization: Bearer <<API KEY>>
For example, to authenticate using curl if your API key was 1234-5678-90123 you would use the following command:
curl -H "Authorization: Bearer 1234-5678-90123"
https://www.dotloop.com/my/api/v1_0/profile
Getting an API key
To get an API key your dotloop user must have access to the API functionality. To generate a key navigate to the “My Account” link on the profile
list in dotloop.
If you have API access you should see the following at the bottom of the screen:
If you click the Activate API link a key will be generated:
It is important that you protect your key as if it were your dotloop password. If your API key is compromised you can deactivate it and get a new
key by clicking the “Change Key” link.
List of REST Endpoints
The following endpoints are available in dotloop API:
Method Resource Description
GET /profile get list of profiles
GET /profile/{profileId}/loop get list of loops
GET /profile/{profileId}/loop/{loopViewId} get basic loop information
GET /profile/{profileId}/loop/{loopViewId}/detail get loop details
GET /profile/{profileId}/loop/{loopViewId}/activity get loop activity
GET /profile/{profileId}/loop/{loopViewId}/document get loop document list
GET /profile/{profileId}/loop/{loopViewId}/document/{documentId}/{documentName}.pdf get a PDF document
GET /profile/{profileId}/loop/{loopViewId}/participant get a list of loop participants
GET /profile/{profileId}/loop/{loopViewId}/task get a list of loop tasks
GET /profile/{profileId}/loop/{loopViewId}/folder get a list of folders in a loop
GET /profile/{profileId}/employee get a list of users in a profile
GET /profile/{profileId}/document/{documentId}/activity get activity details for a document
GET /profile/{profileId}/person get list of contacts
GET /profile/{profileId}/person/{contactId} get details for a contact
GET /profile/{profileId}/admin get list of admins for a profile
Endpoint Reference
Profiles
Get all profiles associated with user
URL
www.dotloop.com/my/api/v1_0/profile
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
Sample Response
[
{
"profileId": 294625,
"name": "Profile 1",
"userId": 0,
"active": true,
"deleted": false,
"profileType": "INDIVIDUAL"
},
{
"profileId": 294626,
"name": "Profile 2",
"userId": 0,
"active": true,
"deleted": false,
"profileType": "OFFICE"
}
Loops
Returns a list of up to 50 summaries for loops in a profile. To get the next 50 increment the batch number.
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum and default value is 50
statusIds query filter loops by status id:
id description
1 Private Listing
2 Active Listing
3 Under Contract
4 Sold
5 Leased
6 Archived
7 Pre-Listing
8 Pre-Offer
9 New
10 In-Progress
11 Done
complianceStatusIds query filter loops by compliance status id (ask support for compliance status id values, if needed)
tagIds query filter loops by tag id (ask support for tag id values, if needed)
sortBy query sort loops by sortBy id:
id description
1 dotloop default
2 agent name
3 address
4 last updated date
5 mls number
6 purchase price
7 listed date
8 expiration date
9 closing date
10 submitted for review date
sortDirection query id of the sort direction:
id description
0 descending
1 ascending
searchQuery query free-form text search, can be used for loop name, address, agent name, mls number, or tag name
tagNames query filter loops by comma-delimeted list of tags names
createdByMe query shows only loops created by user associated with API token (true/false). Default is false.
Sample Response
[
{
"loopName": "Atturo Garay 123Main Street, Chicago, IL 60605",
"loopId": 34242,
"loopStatus": "Archived",
"loopTags": [
{
"tagId": 2,
"tagName": "Buying",
"profileId": 4533
}
],
"createdBy": 2097622,
"lastUpdated": "2013-12-03T11:38:22-05:00",
"loopViewId": 76046,
"transactionType": "Listing for Sale"
},
{
"loopName": "Atturo Garay 3059main, chicago, IL 60614",
"loopId": 34308,
"loopStatus": "Archived",
"loopTags": [
{
"tagId": 2,
"tagName": "Buying",
"profileId": 69020
}
],
"createdBy": 2097622,
"lastUpdated": "2013-12-03T11:46:16-05:00",
"loopViewId": 80269,
"transactionType": "Purchase"
}
]
Loop Summary
Details of loop view
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The loop view id returned in the loop
call.
Sample Response
[
{
"loopName": "buyers",
"loopId": 274231,
"loopStatus": "Private",
"loopTags": [
0
],
"createdBy": 2571509,
"lastUpdated": "20140728T16:11:5604:00",
"loopViewId": 404271,
"transactionType": "Purchase"
}
]
Loop Details
Retrieve the loop details for a single loop. Empty fields are not included in the details. Callers should not expect
specific properties to always be included.
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/detail
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
Sample Response
"loopId": 15751,
"sections": {
"Listing Brokerage": {
"postalCode": "45242",
"name": "DotLoop Final Review",
"stateOrProvince": "OH",
"streetName": "Lake Forest Dr.",
"streetNumber": "4445",
"officePhone": "",
"city": "Cincinnati"
},
"Buying Brokerage": {
"postalCode": "90210",
"name": "Bob's Buying Brokerage",
"stateOrProvince": "CA",
"streetName": "Mockingbird Ln",
"streetNumber": "1313",
"suite": "#1",
"city": "LA"
},
"Property Address": {
"mlsNumber": "1234567890",
"propertyAddressCountry": "USA",
"postalCode": "32123",
"stateOrProvince": "KS",
"streetName": "manor ",
"streetNumber": "1234",
"country": "USA",
"city": "lauderdale"
},
"Financials": {
"comissionRate": "7%",
"earnestMoneyHeldBy": "Steve",
"originalListingPrice": "500,000",
"currentPrice": "425000",
"purchasePrice": "400,000"
}
Loop Activities
Retrieves the activity log for a single loop.
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/activity
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum and default value is 50
Sample Response
[
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129497\">Agency Disclosure Statement -
Seller<\/activity>",
"activityDate": "2014-01-09T13:10:14-05:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129493\">ThaiCatering<\/activity>",
"activityDate": "2014-01-09T13:10:14-05:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129493\">ThaiCatering<\/activity>",
"activityDate": "2014-01-09T13:08:39-05:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129497\">Agency Disclosure Statement -
Seller<\/activity>",
"activityDate": "2014-01-09T13:08:27-05:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129497\">Agency Disclosure Statement -
Seller<\/activity>",
"activityDate": "2014-01-09T13:07:43-05:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129493\">ThaiCatering<\/activity>",
"activityDate": "20140109T13:07:4305:00"
},
{
"message": "K Fouts (Admin for DotLoop Final Review) viewed document <activity
action=\"contracteditor\" viewId=\"15751\" documentId=\"129497\">Agency Disclosure Statement -
Seller<\/activity>",
"activityDate": "2014-01-09T13:07:08-05:00"
}
]
Loop Documents
Retrieve a list of documents within a loop
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/document
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
Sample Response
[
{
"loopId": 405260,
"folderName": "Folder",
"documentId": 561622,
"documentName": "Agency Disclosure Statement Seller",
"signatureVerficationLink": "DL5616224301S",
"lastModifiedDate": "2014-08-25T18:33:46-04:00",
"createdDate": "2014-08-25T23:29:31-04:00",
"sharedWith": [
"405246",
"405247",
"405260"
],
"createdBy": 2462
},
"loopId": 405260,
"folderName": "Folder",
"documentId": 561621,
"documentName": "sfr3",
"signatureVerficationLink": "DL56162131X3D",
"lastModifiedDate": "2014-08-25T18:26:38-04:00",
"createdDate": "2014-08-25T23:37:47-04:00",
"sharedWith": [
"405246",
"405247",
"405260"
],
"createdBy": 2462
}
]
Loop Document
Returns a PDF for single document. The parameter “documentName” can be any text, it is provided to let the client
choose the file name.
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/document/{documentId}/{documentName}.pdf
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
documentId path The id of the document
documentName path The name of the document, this is client specified.
Sample Response
No example included. The response will have a content type of application/pdf.
Loop Participants
List of participants in a loop
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/participant
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
Sample Response
[
{
"name": "New Person",
"email": "new2_person@email.com",
"role": "None",
"participantId": 3600616,
"memberOfMyTeam": "N"
},
"name": "DotLoop Final Review",
"role": "Managing Broker",
"memberOfMyTeam": "Y"
},
{
"name": "K Fouts",
"email": "kfouts@email_address.com",
"role": "Listing Agent",
"memberOfMyTeam": "Y"
}
]
Loop Tasks
List of tasks in a loop
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/task
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
Sample Response
[
{
"name": "Task New",
"dueDateType": "2013-04-16T00:00:00-04:00",
"dueDate": "2013-04-16T00:00:00-04:00",
"createdDate": "2013-04-30T08:32:43-04:00",
"listName": "My Tasks",
"listId": 208,
"createdBy": 3104719,
"lockedStatus": "N",
"completionStatus": "N"
}
]
Loop Folders
List of folders in a loop.
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/loop/{loopViewId}/folder
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
loopViewId path The id of the loop
Sample Response
[
{
"viewId": 259626,
"folderId": 314074,
"name": "Folder",
"archived": false,
"minimized": false,
"folderEmailName": "7f9e7d88c31e49ccbf38199689a7e0ea",
"lastUpdatedDateISO": "2014-05-27T10:58:21-04:00"
}
]
Employees
List of up to 5000 summarized employees
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/employee
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum is 5000 and default value is 50
showAdmin query Show only admins
showInActive query Show inactive employees
includeChild query Include employees from child profiles
Sample Response
[
{
"memberId": 294132,
"emailAddress": "smurphy@emailaddress.com",
"firstName": "Scott",
"lastName": "Murphy",
"loopsCreated": 4,
"totalLoops": 5,
"status": "ACTIVE",
"isAdmin": "false"
},
{
"memberId": 290767,
"emailAddress": "rmurphy@emailaddress.com",
"firstName": "Rob",
"lastName": "Murphy",
"loopsCreated": 1,
"totalLoops": 1,
"status": "ACTIVE",
"isAdmin": "false"
}
]
Document Activities
Activities associated with document
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/document/{documentId}/activity
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
documentId path document identifier
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum and default value is 50
Sample Response
[
{
"message": "Meyyalagan Chandrasekaran (Admin for DotLoop Final Review) viewed document
<activity action=\"contracteditor\" viewId=\"404271\" documentId=\"560621\">Buyers Sign
here<\/activity>",
"activityDate": "2014-08-19T18:44:52-04:00"
},
{
"message": "Mike Kiburz viewed document <activity action=\"contract-editor\"
viewId=\"404271\" documentId=\"560621\">Buyers Sign here<\/activity>",
"activityDate": "2014-07-28T16:49:36-04:00"
}
]
Contacts
List of contacts associated with an user
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/person
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum value is 100 and default value is 20
Sample Response
[
{
"personId": 3623822,
"firstName": "Test FirstName",
"lastName": "Test LastName",
"email": "FirstLast@test.com"
},
{
"personId": 3603862,
"firstName": "Test Name",
"lastName": "Test Name",
"email": "abc@test.com"
}
]
Contact Details
Get contact details
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/person/{contactId}
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
contactId path The id of the contact
Sample Response
[
{
"personId": 3603862,
"firstName": "Brian",
"lastName": "Erwin",
"email": "brianerwin@newkyhome.com",
"homephone": "2138936332",
"officephone": "1121213656",
"streetAddress01": "2100 Waterview dr",
"city": "Richardson",
"zipOrPostalCode": "75081",
"fax": "1118655686",
"stateOrProv": "TX"
}
]
Profile Admins
List of admins associated with profile
URL
www.dotloop.com/my/api/v1_0/profile/{profileId}/admin
Method
GET
Parameters
Name Location Description
bearer-token header OAuth access token
profileId path The profile context for this request
batchNumber query Increment the batch number to page through results. The default is 1.
batchSize query Number of records to return. The maximum value and default value is 50
Sample Response
[
{
"memberId": 2629538,
"emailAddress": "listingAgent@emailaddress.com",
"firstName": "TestFirstName1",
"lastName": "TestLastName1",
"status": "ACTIVE",
"isAdmin": "true"
},
{
"memberId": 2570270,
"emailAddress": "sellingAgent@emailaddress.com",
"firstName": "TestFirstName2",
"lastName": "TestLastName2",
"status": "ENROLLED",
"isAdmin": "true"
}
]